Feature

Migrate from RevenueCat to RevenueDot without losing subscribers

Migrate in four phases: import your RevenueCat project with RevenueDot's importer, run both systems side by side with store notification forwarding, ship an app update that sets the SDK's proxy URL, then cut over. The importer copies your catalog, customers, purchases and SDK keys, so current access is imported and old app versions keep working.

Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.

Importer

Apps, public SDK keys, catalog, customers, aliases, attributes, subscriptions, one-time purchases and revenue history.

Dual run

RevenueDot forwards the exact store notification body to RevenueCat, so both stay current while old app versions run.

Keep your SDK keys

Each app's production key is copied, so builds already in the store keep working.

Resumable and safe to repeat

A dry run writes nothing, a stopped import resumes, and a second run changes nothing that is already right.

Steps

How to migrate from RevenueCat in four phases

The full walkthrough is on Migrate from RevenueCat.

  1. 01

    Import and set up RevenueDot next to RevenueCat

    Run the importer, enter each app's store credentials (the App Store In-App Purchase key and the Google Play service account, which cannot be exported), run the importer again, and check with import verify.

  2. 02

    Route store notifications through RevenueDot

    Point App Store Server Notifications at RevenueDot and set its forwarding URL to RevenueCat's. For Google Play, add a second Pub/Sub push subscription or forward the same way. Keep acting on RevenueCat's webhooks.

  3. 03

    Ship the app update

    Set the SDK's proxy URL, turn off signature checks and call syncPurchases once on first launch. Users on older versions keep talking to RevenueCat, which stays correct because notifications are forwarded.

  4. 04

    Cut over

    When import verify shows no differences and few users run old versions, create your webhooks in RevenueDot, turn off RevenueCat's and the forwarding URLs, and turn RevenueCat off.

What changes in your app?

One setting. Set the proxy URL before configure and turn entitlement verification off. The rest of your RevenueCat SDK code stays the same. Call syncPurchases() once on the first launch of the update.

App.swiftSwift
import RevenueCat

// Point the SDK at RevenueDot; nothing else in the app changes.
Purchases.proxyURL = URL(string: "https://api.revenuedot.app")!
Purchases.configure(
    with: Configuration.Builder(withAPIKey: "appl_...")
        .with(entitlementVerificationMode: .disabled)
        .build()
)

How do you run the importer?

The importer reads your RevenueCat project through RevenueCat's REST API v2 with a v2 secret key and writes it into RevenueDot. It sends no webhooks, resumes after a stop and asks for each key with hidden input, so no key lands in your shell history. The CLI is not on npm yet, so run it from the RevenueDot repository. Start with --dry-run, and add --limit 50 to try 50 customers first.

From a checkout of revenuedot/revenuedotShell
pnpm --filter revenuedot cli import --from-revenuecat --rc-project proj... --to https://revenuedot.example.com --dry-run

# Compare both systems customer by customer, and print the cutover steps
pnpm --filter revenuedot cli import verify --rc-project proj... --to https://revenuedot.example.com
pnpm --filter revenuedot cli import plan --to https://revenuedot.example.com --rc-project proj...

What does the importer bring over, and what does it leave?

Brought overNot brought over
Apps and each app's public SDK keyStore credentials. RevenueCat's API does not return them.
Products, entitlements, offerings and packagesPaywalls, targeting rules, experiments and virtual currency balances. Recreate them in RevenueDot.
Customers, aliases and attributesIntegrations and the webhooks themselves. Create them at cutover.
Subscriptions and one-time purchasesRefunds of subscriptions. RevenueCat's v2 subscription object does not show them, so a refunded subscription imports as expired.
Promotional access and revenue historyRevenueCat Billing renewals, and Google Play purchase tokens, which RevenueDot looks up with your service account.

How does the dual run work?

The migration guide and the cutover checklist cover each step with your app ids filled in by import plan.

  • App Store Connect accepts one production and one sandbox notification URL per app, so only one system can receive Apple's notifications directly.
  • RevenueDot stores each notification, applies it and forwards the exact body to RevenueCat with a 10 second timeout. Forwarding never delays the answer to Apple or Google.
  • For Google Play, if the Pub/Sub topic is in your own Google Cloud project, add a second push subscription to RevenueDot's URL.
  • Turn on Track new purchases from server-to-server notifications for each app during the dual run.

FAQ

Migration from RevenueCat: questions people ask

How do I migrate from RevenueCat without losing subscribers?

Import your project with the importer, which copies customers, subscriptions and your public SDK keys. Forward store notifications from RevenueDot to RevenueCat so both stay current. Ship an app update with the new proxy URL and a one-time syncPurchases call. Cut over when import verify shows no differences.

Do I have to change my app code to switch from RevenueCat?

One setting. Set the SDK's proxy URL to RevenueDot before configure, and turn off entitlement verification, or use a RevenueDot fork. Your purchase, offerings and entitlement code stays the same.

Will old versions of my app keep working?

Yes. The importer copies each app's public SDK key into RevenueDot, and notification forwarding keeps RevenueCat current for users who have not updated. Re-run the importer while old versions are in use.

Can I import my RevenueCat paywalls and experiments?

Not yet. The importer copies catalog, customers, subscriptions and purchases. Paywalls, targeting rules, experiments and virtual currency balances are recreated in RevenueDot. Build paywalls from the ten templates or the visual editor.

Where do I get the Google Play purchase tokens?

RevenueCat's API gives Google Play order ids, not tokens. RevenueDot looks the tokens up with your Play service account, from a CSV you pass, from Google's next renewal notification, or from the app's syncPurchases call. Customers keep access in the meantime.

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