Solution

Self-hosted in-app purchase server with Docker and Postgres

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.

The RevenueDot dashboard served by a self-hosted server, showing customers, revenue and setup health

One image, one database

A single container plus Postgres 16 with a persistent volume.

Migrations on start

Upgrades are a rebuild and a restart. The server applies database migrations itself.

No revenue share

AGPL-3.0, free for any company to run for its own apps at any scale.

Your data, your region

Every purchase and customer lives in your Postgres. The server never calls RevenueDot.

Steps

How to self-host an in-app purchase server with RevenueDot

  1. 01

    Clone the repository and copy the config

    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.

  2. 02

    Start the stack

    Run docker compose up -d. It builds the image and starts RevenueDot and Postgres. There is no published image yet.

  3. 03

    Check health and sign up

    Call /v1/health, then open http://localhost:8787/login and sign up. The first account is the owner, and sign-up closes after it.

  4. 04

    Put HTTPS in front

    Serve the server behind a reverse proxy or load balancer with TLS. The SDKs and the stores need an HTTPS URL.

  5. 05

    Connect the stores and your app

    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

The three commands

Start RevenueDot with Docker Composeterminal
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

What runs inside the container

PieceWhat it does
revenuedot containerOne 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

A production checklist for your own server

The full list is in Going to production. The existing self-host page covers the same stack with a Cloud comparison.

  • A managed Postgres with point-in-time recovery, daily dumps copied off the server, and one test restore.
  • SMTP settings so password resets, invites and alert emails arrive. Without them, emails print to the server log.
  • REVENUEDOT_SIGNING_KEY set, if you ship SDK builds that verify responses.
  • Store credentials checked in the dashboard, and notification status showing Ready for each app.
  • Uptime monitoring on GET /v1/health.

Choice

Self-host or Cloud

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.

  • Signatures: a self-hosted server signs with its own key, so keep the stock SDK's verification disabled, or build the SDK forks with your own public key.
  • Status: the Docker image builds on node:24-slim, and CI starts it against Postgres 16 on every pull request.

FAQ

Self-hosted in-app purchases: questions people ask

Can I self-host an in-app purchase server?

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.

What do I need to run RevenueDot on my own 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.

Is self-hosted RevenueDot free for commercial apps?

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.

How do I upgrade a self-hosted RevenueDot?

Pull the new code, rebuild the image and restart. Database migrations run automatically when the server starts. Back up Postgres first.

Does the self-hosted server send my data to RevenueDot?

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

Run subscriptions without the revenue share.

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