One image, one database
A single container plus Postgres 16 with a persistent volume.
Solution
A self-hosted in-app purchase server is one Docker image next to Postgres 16. Clone RevenueDot, copy .env.example to .env, run docker compose up -d, and the SDK API, REST API, store notifications and dashboard answer on port 8787. It is AGPL-3.0, takes no revenue share and works with the RevenueCat SDK.
Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.
A single container plus Postgres 16 with a persistent volume.
Upgrades are a rebuild and a restart. The server applies database migrations itself.
AGPL-3.0, free for any company to run for its own apps at any scale.
Every purchase and customer lives in your Postgres. The server never calls RevenueDot.
Steps
Clone revenuedot/revenuedot, copy .env.example to .env and set POSTGRES_PASSWORD. Do it before the first start: the password is written into the volume then.
Run docker compose up -d. It builds the image and starts RevenueDot and Postgres. There is no published image yet.
Call /v1/health, then open http://localhost:8787/login and sign up. The first account is the owner, and sign-up closes after it.
Serve the server behind a reverse proxy or load balancer with TLS. The SDKs and the stores need an HTTPS URL.
Add your App Store key and Google Play service account, set the notification URLs the dashboard shows, then set your app's SDK proxy URL to your server.
Terminal
git clone https://github.com/revenuedot/revenuedot.git
cd revenuedot
cp .env.example .env # set POSTGRES_PASSWORD before the first start
docker compose up -d # builds the image and starts RevenueDot and Postgres
curl http://localhost:8787/v1/health # {"status":"ok"} Architecture
| Piece | What it does |
|---|---|
revenuedot container | One process: the SDK API (/v1), REST API (/v2), dashboard sign-in, OAuth for AI clients, store notifications and the dashboard web app. A background job records expirations, runs the daily Google Play voided-purchase check, sends webhooks and alert emails |
db container (Postgres 16) | Every customer, purchase, event and setting, in the revenuedot-data volume |
Run one revenuedot container per database for now: the background job has no lock across processes.
Before production
The full list is in Going to production. The existing self-host page covers the same stack with a Cloud comparison.
REVENUEDOT_SIGNING_KEY set, if you ship SDK builds that verify responses.GET /v1/health.Choice
Self-host and RevenueDot Cloud run the same code, API and schema, so a project can move either way. Cloud is free up to $10,000 of monthly tracked revenue and needs no servers: start free on Cloud. Self-hosting is free forever and costs your own infrastructure. Self-hosted servers send no telemetry, and talk only to Apple, Google, Stripe or Amazon if you connect them, your webhook endpoints and any forwarding URL you set.
node:24-slim, and CI starts it against Postgres 16 on every pull request.FAQ
Yes. RevenueDot is an open-source server you run with Docker Compose next to Postgres 16. It implements the API the RevenueCat SDKs call, so your app keeps its SDK and sets one proxy URL to your server.
A machine with Docker and Compose v2, plus Postgres 16, which Compose starts for you. For production use a managed Postgres with backups and put the server behind HTTPS.
Yes. The server and dashboard are AGPL-3.0. Any company can run them for its own apps at any scale without paying. The AGPL asks you to share changes if you modify the server and offer it to others over a network.
Pull the new code, rebuild the image and restart. Database migrations run automatically when the server starts. Back up Postgres first.
No. It has no telemetry and never calls RevenueDot's servers. It talks to the stores you connect, your webhook endpoints and any forwarding URL you set.
Get started
Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.
Already have an account? Sign in · Prefer your own servers? Self-host free