---
title: "RevenueDot documentation"
description: "Every page of the RevenueDot docs: quickstart, concepts, SDK guides, store setup, migrating from RevenueCat, the API reference and the help center."
url: https://revenuedot.app/docs
---

# RevenueDot documentation

RevenueDot is an open-source, self-hostable backend for in-app purchases and subscriptions that works with the RevenueCat SDK. Each link below is the page's Markdown.

## Getting started

What RevenueDot is, a 5-minute quickstart and the three ways to connect an app.

- [What is RevenueDot?](https://revenuedot.app/docs/getting-started.md): RevenueDot is an open-source, self-hostable backend for in-app purchases and subscriptions that works with the RevenueCat SDK. Point the SDK's proxy URL at it and keep your app code.
- [How do I run RevenueDot and make a first purchase in 5 minutes?](https://revenuedot.app/docs/getting-started/quickstart.md): Start the server with Docker Compose, seed a Test Store app with one script, buy a subscription with curl, then point the RevenueCat SDK at your server.
- [How do I connect my app to RevenueDot?](https://revenuedot.app/docs/getting-started/connect-your-app.md): Three ways. Proxy mode sets one URL in the RevenueCat SDK you already ship. The RevenueDot fork swaps the package. The importer keeps your existing RevenueCat API keys working.

## Concepts

Projects, apps, products, entitlements, offerings, customers, events and sandbox.

- [How is RevenueDot organized?](https://revenuedot.app/docs/concepts.md): A server holds projects. A project holds apps (one per store), a catalog of products, entitlements, offerings and packages, and customers with their purchases and events.
- [What are projects, apps and API keys?](https://revenuedot.app/docs/concepts/projects-and-apps.md): A project is one product you sell. An app is that product on one store, with its own public SDK key. Secret keys belong to a project and unlock the REST API.
- [How do products and entitlements work?](https://revenuedot.app/docs/concepts/products-and-entitlements.md): A product is one item on one store. An entitlement is the access your app checks, such as pro. Attach every product that should unlock it; the app then checks the entitlement, never a product id.
- [How do offerings and packages decide what my paywall shows?](https://revenuedot.app/docs/concepts/offerings-and-packages.md): An offering is a set of packages, and each package holds one product per app. The SDK shows the current offering, so you change the paywall's products on the server without an app update.
- [How do customers, app user IDs and logIn work?](https://revenuedot.app/docs/concepts/customers-and-app-user-ids.md): A customer is one person with one or more app user IDs. The SDK starts with an anonymous ID; logIn attaches your own ID; the project's transfer behaviour decides who owns a restored purchase.
- [How does RevenueDot track a subscription's lifecycle and which events does it send?](https://revenuedot.app/docs/concepts/subscriptions-and-events.md): RevenueDot keeps one record per subscription, updates it from receipts and store notifications, compares the old and new state, and records RevenueCat-style events such as RENEWAL and EXPIRATION.
- [How does RevenueDot keep sandbox purchases apart from real ones?](https://revenuedot.app/docs/concepts/sandbox.md): Every purchase carries an environment, sandbox or production, taken from the store. Metrics count production by default, and each webhook can receive one environment or both.

## SDK guides

Point each RevenueCat SDK at your server, or switch to the RevenueDot fork.

- [Which RevenueCat SDKs work with RevenueDot?](https://revenuedot.app/docs/sdks.md): All nine RevenueCat app SDKs work with RevenueDot in proxy mode today. Set the proxy URL and turn off signature checks. RevenueDot forks of all ten SDK repos exist but are not published yet.
- [How do I use RevenueDot with the iOS SDK?](https://revenuedot.app/docs/sdks/ios.md): Set Purchases.proxyURL before configure and turn entitlement verification off. The RevenueCat iOS SDK 5.x then talks to your RevenueDot server with no other code change.
- [How do I use RevenueDot with the Android SDK?](https://revenuedot.app/docs/sdks/android.md): Set Purchases.proxyURL before configure and set EntitlementVerificationMode.DISABLED. The stock SDK still sends diagnostics, paywall and ad events to RevenueCat; the fork fixes that.
- [How do I use RevenueDot with React Native and Expo?](https://revenuedot.app/docs/sdks/react-native.md): Await Purchases.setProxyURL before configure. Verification is already off by default in react-native-purchases, and Expo Go and web work with a Test Store key.
- [How do I use RevenueDot with Flutter?](https://revenuedot.app/docs/sdks/flutter.md): Await Purchases.setProxyURL before configure on iOS and Android. Flutter web ignores the proxy URL in the stock purchases_flutter package; the RevenueDot fork fixes it.
- [How do I use RevenueDot with the web SDK (purchases-js)?](https://revenuedot.app/docs/sdks/web.md): Pass httpConfig.proxyURL to Purchases.configure and turn off analytics events. Only Test Store (test_) keys work against RevenueDot today; Web Billing, Stripe and Paddle do not.
- [How do I use RevenueDot with Capacitor and Ionic?](https://revenuedot.app/docs/sdks/capacitor.md): Await Purchases.setProxyURL({ url }) before configure, and pass entitlementVerificationMode DISABLED, because the Capacitor plugin passes no default and the native informational default applies.
- [How do I use RevenueDot with Kotlin Multiplatform?](https://revenuedot.app/docs/sdks/kotlin-multiplatform.md): Set Purchases.proxyURL, a String, before Purchases.configure in common code. purchases-kmp already defaults to EntitlementVerificationMode.DISABLED, so nothing else changes.
- [How do I use RevenueDot with Unity?](https://revenuedot.app/docs/sdks/unity.md): Fill in the Proxy URL field on the Purchases component and set Entitlement Verification Mode to Disabled in the Inspector. Unity has no public SetProxyURL method.
- [How do I use RevenueDot with Cordova?](https://revenuedot.app/docs/sdks/cordova.md): Call Purchases.setProxyURL before configureWith. Cordova has no option to turn off signature checks, so it logs a verification failure for every response and still grants access.
- [What is purchases-hybrid-common, and do I need to install it?](https://revenuedot.app/docs/sdks/hybrid-common.md): purchases-hybrid-common is the shared native and TypeScript layer under the React Native, Flutter, Capacitor, Unity and Cordova SDKs. App developers never install it directly; the wrapper pulls it in.

## Guides

App Store and Google Play setup, webhooks, testing, self-hosting and production.

- [Which guide do I need?](https://revenuedot.app/docs/guides.md): Step-by-step guides for connecting the App Store and Google Play, receiving webhooks, response signing, testing, inviting your team, alert emails, and running RevenueDot on your own servers.
- [How do I connect the App Store to RevenueDot?](https://revenuedot.app/docs/guides/app-store.md): Create an App Store app with your bundle ID, add an In-App Purchase key (.p8, key ID, issuer ID), then set RevenueDot's notification URL as the Server Notifications v2 URL in App Store Connect.
- [How do I connect Google Play to RevenueDot?](https://revenuedot.app/docs/guides/google-play.md): Create a Google Play app with your package name, upload a Google Cloud service account key with Play Console access, then push real-time developer notifications to RevenueDot through Pub/Sub.
- [How do I receive and verify RevenueDot webhooks?](https://revenuedot.app/docs/guides/webhooks.md): Add a webhook URL, keep the whsec_ signing secret, verify the X-RevenueCat-Webhook-Signature HMAC on the raw body, answer 200 fast and deduplicate on event.id. Failed deliveries retry 5 times.
- [How do Trusted Entitlements (response signing) work with RevenueDot?](https://revenuedot.app/docs/guides/trusted-entitlements.md): With REVENUEDOT_SIGNING_KEY set, RevenueDot signs every SDK response the way the RevenueCat SDKs verify. The stock SDK trusts only RevenueCat's key, so turn verification off or use a fork built with your key.
- [How do I use the Test Store to test purchases without a store account?](https://revenuedot.app/docs/guides/test-store.md): Add a Test Store app, use its test_ key in the SDK, and buy through the SDK's test dialog. Simulate renewals, cancellations, billing issues and refunds with POST /v2/projects/{id}/test_purchases.
- [How do I test with App Store sandbox, StoreKit in Xcode and Google Play testers?](https://revenuedot.app/docs/guides/sandbox-testing.md): Real store test purchases work against RevenueDot once the app's store credentials and notifications are set up. They are marked sandbox; Xcode StoreKit purchases also need the StoreKit test certificate.
- [How do I self-host RevenueDot?](https://revenuedot.app/docs/guides/self-hosting.md): Run one Docker image (API plus dashboard) next to Postgres with docker compose. Configure it with a .env file, put HTTPS in front, and set REVENUEDOT_SIGNING_KEY if you sign responses.
- [How do I upgrade a self-hosted RevenueDot?](https://revenuedot.app/docs/guides/upgrades.md): Back up the database, pull the new source, rebuild and restart. The server applies new database migrations by itself when it starts; there is no separate migrate step.
- [How do I back up and restore a self-hosted RevenueDot?](https://revenuedot.app/docs/guides/backups.md): Everything lives in Postgres. Back it up with pg_dump on a schedule, keep copies off the server, and restore with pg_restore while the RevenueDot container is stopped.
- [What should I check before running RevenueDot in production?](https://revenuedot.app/docs/guides/going-to-production.md): A checklist for a self-hosted RevenueDot with real customers - HTTPS, a real Postgres with backups, store credentials and notifications verified, webhooks tested, secrets kept out of apps, and monitoring.
- [Which alert emails does RevenueDot send?](https://revenuedot.app/docs/guides/alerts.md): Project admins get an email when store notifications fail, a webhook fails 5 times in a row, or Apple or Google rejects the store credentials. One email when it starts, at most one reminder a day, one when it is fixed.
- [How do I invite my team to a RevenueDot project?](https://revenuedot.app/docs/guides/team.md): Project admins invite people by email with the Admin, Developer or Viewer role. The link lasts 7 days. Admins change roles and remove members; a project always keeps one admin.

## Migrate from RevenueCat

The importer, a side-by-side run, SDK changes, the cutover checklist and what differs.

- [How do I migrate from RevenueCat to RevenueDot?](https://revenuedot.app/docs/migrate.md): Import your project with the revenuedot CLI, run both systems side by side with notification forwarding, ship an app update that sets the proxy URL, then cut over. No customer loses access.
- [How do I import a RevenueCat project with the revenuedot CLI?](https://revenuedot.app/docs/migrate/importer.md): revenuedot import copies apps, SDK keys, catalog, customers, subscriptions and purchases from RevenueCat's API v2 into RevenueDot. It resumes after a stop and is safe to run again.
- [How do I run RevenueDot and RevenueCat side by side?](https://revenuedot.app/docs/migrate/dual-run.md): Send store notifications to RevenueDot and let it forward the exact body to RevenueCat, turn on track_new_purchases, keep acting on RevenueCat's webhooks, and compare with revenuedot import verify.
- [What do I change in my app's SDK code to move to RevenueDot?](https://revenuedot.app/docs/migrate/sdk-changes.md): In proxy mode, set the proxy URL before configure, turn off signature checks and sync purchases once. With a fork, swap the package and keep your code. Diffs for all ten SDKs.
- [What is the checklist for cutting over from RevenueCat to RevenueDot?](https://revenuedot.app/docs/migrate/cutover-checklist.md): The migration steps in order, from starting the server to turning RevenueCat off, as a checklist. Each step says how to check it is done.
- [What differs between RevenueDot and RevenueCat?](https://revenuedot.app/docs/migrate/what-differs.md): Every known difference as of 2026-09-30, from failed signature checks with the stock SDK to webhook events not sent yet and features planned for later tiers, with sources.

## API reference

SDK endpoints, REST API v1 and v2, extensions, errors and webhook events, from the OpenAPI document.

- [What APIs does RevenueDot have?](https://revenuedot.app/docs/api.md): RevenueDot serves the SDK endpoints, REST API v1, REST API v2 with extensions, store notification endpoints and webhooks, all described in one OpenAPI 3.1 document.
- [How do I authenticate RevenueDot API requests?](https://revenuedot.app/docs/api/authentication.md): RevenueDot uses public app keys for the SDK endpoints, secret keys for REST API v1 and v2, and a session cookie for the dashboard. Secret keys carry permissions.
- [What do RevenueDot's API errors mean?](https://revenuedot.app/docs/api/errors.md): The SDK and REST v1 error codes, the REST v2 error types, which HTTP status each uses, and what to do about each one.
- [Which endpoints do the RevenueCat SDKs call on RevenueDot?](https://revenuedot.app/docs/api/sdk-endpoints.md): Every SDK endpoint RevenueDot serves, with auth, request fields, error codes and real example responses, plus the store notification endpoints.
- [What can I do with REST API v1?](https://revenuedot.app/docs/api/rest-v1.md): REST API v1 on RevenueDot: delete customers, grant promotional access, override offerings and run store actions with a secret key.
- [What can I do with REST API v2?](https://revenuedot.app/docs/api/rest-v2.md): REST API v2 on RevenueDot: projects, apps, products, entitlements, offerings, packages, customers, subscriptions, purchases, metrics and webhooks.
- [Which API endpoints are RevenueDot extensions?](https://revenuedot.app/docs/api/extensions.md): RevenueDot-only endpoints: dashboard sign-in, OAuth for MCP clients, project settings, store setup, API keys, webhook deliveries, event log, Test Store, dashboard data and migration import.
- [Which webhook events does RevenueDot send?](https://revenuedot.app/docs/api/webhook-events.md): Every webhook event type RevenueDot sends, when each fires, its fields and a real example payload, plus the signature header and retry rules.

## Help center

Answers to the questions people search: FAQ, troubleshooting and known issues.

- [Where do I find answers to common RevenueDot problems?](https://revenuedot.app/docs/help.md): The RevenueDot help center, grouped by topic. Each article answers one question, with the fix first.
- [What do people most often ask about RevenueDot?](https://revenuedot.app/docs/help/faq.md): Short answers about what RevenueDot is, what it costs, its licenses, the stores and SDKs it supports, and what works today.
- [How do I fix common RevenueDot problems?](https://revenuedot.app/docs/help/troubleshooting.md): A symptom-to-fix list for the SDK, receipts, store notifications, webhooks, the dashboard and self-hosting, with the cause of each.
- [What are the known issues and gaps in RevenueDot?](https://revenuedot.app/docs/help/known-issues.md): Known issues as of 2026-09-30: what does not work yet, and the workaround for each.
- [Why is my entitlement not active?](https://revenuedot.app/docs/help/entitlement-not-active.md): Usually the product is not attached to the entitlement, the purchase belongs to another app user ID, the receipt post failed, or the access has ended. Here is how to tell which.
- [What do I do if I forgot my RevenueDot password?](https://revenuedot.app/docs/help/forgot-password.md): Click Forgot password? on the sign-in page and follow the emailed link within 1 hour. Self-hosted servers without email print the link to the server log, or an admin resets the password from the command line.
- [Why does RevenueDot answer 4xx or 5xx to a receipt?](https://revenuedot.app/docs/help/receipt-errors-4xx-vs-5xx.md): A 4xx tells the SDK the purchase is permanently bad, so it finishes the transaction for good. A 5xx means try again later, so the SDK keeps the transaction and retries.
- [How do I restore purchases?](https://revenuedot.app/docs/help/restore-purchases.md): Call restorePurchases from a Restore button, or syncPurchases silently. The project's transfer behaviour decides who owns a purchase another user already has.
- [Why does the SDK report signature verification FAILED in proxy mode?](https://revenuedot.app/docs/help/signature-verification-failed.md): The stock RevenueCat SDK checks responses against RevenueCat's signing key, which RevenueDot cannot use. Turn verification off, or build the SDK forks with your own key.
- [Why are store notifications not arriving?](https://revenuedot.app/docs/help/store-notifications-not-arriving.md): Check notification_status in setup health. Most failures are a wrong URL, a bundle ID or package name mismatch, Pub/Sub push auth, or purchases RevenueDot has never seen.
- [How do I test purchases without real money?](https://revenuedot.app/docs/help/test-sandbox-purchases.md): Use the Test Store for the fastest loop, then App Store sandbox, StoreKit testing in Xcode with the xcode_certificate credential, or Google Play license testers.
- [Why are webhooks not arriving?](https://revenuedot.app/docs/help/webhooks-not-arriving.md): Check the webhook's delivery log first. Most misses are a filter that excludes the event, a backend that answers something other than 200, or a URL the server cannot reach.

Full text for AI assistants: https://revenuedot.app/llms-full.txt
