The server
A TypeScript (Hono) API that answers every endpoint the RevenueCat SDKs call, the REST API and store notifications.
Self-host
One Docker image serves the RevenueCat-compatible API and the dashboard, next to your own Postgres. Free forever under AGPL-3.0, with no limits and no share of your revenue.
git clone https://github.com/revenuedot/revenuedot && cd revenuedot
cp .env.example .env # set POSTGRES_PASSWORD
docker compose up -d # API, dashboard and Postgres on http://localhost:8787 Open http://localhost:8787, create your account and project, and add your App Store and Google Play credentials. Then point your app's SDK at your server:
Purchases.proxyURL = URL(string: "https://iap.example.com")! Set REVENUEDOT_PORT to change the host port. The line for every SDK.
What you run
A TypeScript (Hono) API that answers every endpoint the RevenueCat SDKs call, the REST API and store notifications.
Customers, catalog, apps, API keys, webhooks with a delivery log, and setup health, served by the same image.
Every purchase, customer and receipt, in tables you can query with SQL. Migrations run on start.
Self-host or cloud
Self-host and RevenueDot Cloud share the code, API and schema, so a project moves either way with an export and import.
| Self-host | RevenueDot Cloud | |
|---|---|---|
| Price | Free, AGPL-3.0 | Free up to $10K monthly tracked revenue; paid plans coming |
| Who runs it | You: server, Postgres, backups, upgrades | RevenueDot |
| Data location | Any cloud and region you choose | Cloudflare's network; EU and US regions with Enterprise |
| Extras | Everything in the open-source server | Failover, point-in-time recovery, edge caching, monitoring, support |
| Enterprise features | SSO, audit logs and high availability with an Enterprise license | With Enterprise |
Before production
01
Put the server behind a load balancer or reverse proxy with TLS. The SDKs and the stores need an HTTPS URL.
02
Point DATABASE_URL at a managed Postgres 16 with point-in-time recovery, and keep a strong password.
03
Add your App Store In-App Purchase key and Google Play service account, then set the notification URLs the dashboard shows.
04
The dashboard shows when each app last received a store notification and flags missing keys before purchases fail.
Self-host runs as one Docker image next to your Postgres, and upgrades apply database migrations on start. Source on GitHub.
FAQ
RevenueCat itself is closed source and runs only in RevenueCat's cloud. RevenueDot is a self-hostable server that works with the RevenueCat SDK, so self-hosting means running RevenueDot with Docker and Postgres on your own servers, in the region you choose.
A machine that runs Docker, plus Postgres 16, which docker compose starts for you. For production, use a managed Postgres with backups and put the server behind HTTPS.
No. The self-hosted server has no telemetry and never calls RevenueDot's servers. It talks only to Apple, Google, your webhook endpoints and any forwarding URL you set.
Pull the new image and restart. Database migrations run automatically when the server starts, and there is one config file.
When you self-host, every purchase, customer and receipt lives in your own Postgres database, in the cloud and region you choose, and nothing is sent to RevenueDot. In RevenueDot Cloud it runs on Cloudflare's network; EU and US data regions are part of Enterprise.
The server and dashboard are AGPL-3.0. The SDK forks, CLI, MCP server and agent skills are MIT. The ee/ folder (enterprise features such as SSO and audit logs) is under the RevenueDot Enterprise License.
Every endpoint is checked against real RevenueCat responses, the unmodified RevenueCat iOS SDK runs a full purchase against it on the iPhone simulator, and webhooks are delivered live to 17 example backends. For a switch with no risk, run RevenueDot side by side with RevenueCat: it forwards every store notification to RevenueCat, so you can compare both before you cut over.
Get started
Self-host RevenueDot, import your project with one command, and run both side by side until the numbers match.