Migrate from Adapty to an open-source backend (RevenueDot)
You can move an app from Adapty to RevenueDot in four steps: rebuild the catalog, swap the Adapty SDK for the RevenueCat SDK pointed at RevenueDot, send store notifications to RevenueDot, and let active subscribers re-sync when the updated app posts their store receipts. There is no one-command import. RevenueDot's importer reads RevenueCat projects only, so an Adapty move is an SDK swap with a side-by-side run, not a data copy.
This post gives the order of work, what to rebuild by hand, and how to run both systems until the last old app version fades out. It is for apps that use Adapty today and want an open-source backend they can self-host. Facts about Adapty come from its public docs and were checked in October 2026.
The short answer#
- No importer for Adapty. RevenueDot's
revenuedot importcommand reads RevenueCat projects only (importer docs). For Adapty you recreate products, entitlements and offerings in RevenueDot. - Subscribers move by receipt. Adapty's own migration guide says users move when they open a version with the new SDK (Adapty docs). The same mechanism works in the other direction: the updated app posts each customer's store purchases to RevenueDot.
- Apple allows two notification URLs per app, one for production and one for sandbox (Apple). Point them at RevenueDot and forward the body to Adapty while old app versions remain.
- Your code changes. Adapty's
getProfile()and access levels become the RevenueCat SDK's customer info and entitlements, and your webhook handler reads RevenueCat's payload shape. - Cost. Adapty is free while you earn under $5K a month, then 1% of monthly revenue (Adapty pricing). RevenueDot Cloud is free up to $10,000 of monthly tracked revenue, and self-hosting is free.
What does RevenueDot import from Adapty?#
Nothing, and it is better to say so up front. The importer calls RevenueCat's API and writes the result into RevenueDot (the importer). It has no Adapty reader.
What you do instead is rebuild the small things and let the large thing, the subscriber list, rebuild itself.
| Item | How it moves |
|---|---|
| Store products | They stay in App Store Connect and Google Play. You keep the same product ids |
| Entitlements | Adapty calls them access levels. Create the same ones in RevenueDot and attach the same products |
| Offerings and packages | Recreate by hand in Product catalog |
| Paywalls | Rebuild from a RevenueDot template, or keep your own screen in the app |
| Active subscribers | Re-sync from store receipts when the updated app launches |
| Purchase history for charts | Not imported. Charts fill from the day you start. Keep Adapty read-only for old reports |
| Webhooks and integrations | Create them in RevenueDot at cutover |
| User ids | Reuse the id you gave Adapty as customerUserId as the RevenueCat app user id |
Adapty offers a server-side API with a profile endpoint and a CSV export of analytics such as MRR, churn and cohorts (server-side API, analytics export). Use them to keep a record of your history before you switch Adapty off. RevenueDot does not read that export.
How do you swap the SDK?#
You replace Adapty calls with the RevenueCat SDK and set its proxy URL to RevenueDot. In proxy mode the change is small. The RevenueDot forks of the SDKs are not on any package registry yet (October 2026), so use the stock RevenueCat SDK.
// Before: Adapty
let profile = try await Adapty.getProfile()
let isPro = profile.accessLevels["premium"]?.isActive ?? false
// After: the RevenueCat SDK talking to RevenueDot
Purchases.proxyURL = URL(string: "https://api.revenuedot.app")!
Purchases.configure(
with: Configuration.Builder(withAPIKey: "appl_...")
.with(entitlementVerificationMode: .disabled)
.build()
)
let customerInfo = try await Purchases.shared.customerInfo()
let isPro = customerInfo.entitlements["pro"]?.isActive == trueAdapty's code uses Adapty.getProfile() and profile.accessLevels[...] (Adapty docs). Set the proxy URL before configure. Turn off signature checks, because the stock SDK verifies responses against RevenueCat's key and would log every RevenueDot response as a failed check. The full diffs for all ten SDKs are in the SDK changes guide.
Three details save a bad week:
- Pass the same user id. Call
Purchases.logIn("<your user id>")with the value you used as Adapty'scustomerUserId(Adapty docs). Purchases follow the customer, not the device. See how customers and app user ids work. - Call
syncPurchases()once on the first launch after the update. It sends the device's store purchases to RevenueDot, so current subscribers keep access even though their history was never imported. - Add store credentials first. RevenueDot needs your App Store in-app purchase key and a Google Play service account to verify purchases. Without them, StoreKit 1 receipts fail with an error the SDK retries (store setup).
How do active subscribers re-sync?#
Each customer re-syncs the first time they open the updated app. The SDK posts their store receipt, RevenueDot verifies it with Apple or Google, and the entitlement turns on. Nobody needs to sign in again.
Subscribers who do not open the new version stay on Adapty. That is why the overlap matters. Apple keeps sending their renewals and refunds to the notification URL on file, and your backend still needs to know about them.
How do you route store notifications?#
Send them to RevenueDot first and forward the exact body to Adapty. App Store Connect holds one production URL and one sandbox URL per app, and either can carry only one destination, so one system has to be in front (Apple).
App Store.
- Copy the notification URL from the app page in RevenueDot.
- Copy Adapty's URL from its dashboard. Adapty provides it, and tells you to paste it into both the production and sandbox fields. It also says the URL works like a credential: anyone who has it can post a payload to it (Adapty docs).
- Set the RevenueDot app's Forward notifications field to Adapty's URL.
- In App Store Connect, set both URLs to RevenueDot's, version 2.
Google Play. Adapty creates the Pub/Sub topic in your own Google Cloud project when you save the key file (Adapty docs). A topic can have many subscriptions, and each one receives every message (Google Cloud). Add a second push subscription that points at RevenueDot, and Adapty keeps receiving everything. Google asks you to set up notifications per app (Google).
RevenueDot stores each notification, forwards the raw body with a 10 second timeout, and never lets forwarding delay its answer to Apple or Google. Forwarding was verified with a test URL and has not been run against Adapty's own endpoint, so send a test notification and check Adapty's event feed before you rely on it. Adapty says that without server notifications it runs with a limited feature set, so a broken forward degrades its data (Adapty docs).
How do you run both side by side?#
Run them in parallel for at least one full billing cycle of your longest plan, and keep acting on Adapty's webhooks until you switch. The full recipe is in the dual-run guide; the steps for Adapty are these:
- Turn on Track new purchases from server-to-server notifications for each store app in RevenueDot, so purchases made on old app versions appear.
- Create a RevenueDot webhook that points at an endpoint that only logs. RevenueDot sends RevenueCat's payload,
{ "api_version": "1.0", "event": { ... } }, so deduplicate onevent.id(webhooks). - Do not point RevenueDot's webhook at the handler Adapty already feeds. Your backend would count every purchase twice.
- Compare. For ten known customers, check that their entitlements and expiry dates match in both dashboards. Adapty's events such as
subscription_startedandtrial_started(Adapty event feed) have RevenueCat-shaped equivalents such asINITIAL_PURCHASE,RENEWAL,CANCELLATIONandEXPIRATIONin RevenueDot. - Cut over when the old versions are a small share of active users. Create the real webhooks in RevenueDot, remove the forward, and switch Adapty off.
The cutover checklist lists the last steps.
What does Adapty do that RevenueDot does not?#
Adapty is a hosted growth suite and RevenueDot is an open-source backend, so each is stronger in different places.
| Area | Adapty | RevenueDot |
|---|---|---|
| Compliance | SOC 2 Type II attestation, available under NDA (Adapty) | No SOC 2 report yet |
| Source code | SDKs on GitHub (MIT), hosted backend | Server and dashboard open source (AGPL-3.0), self-hostable |
| Client SDK | Adapty's own SDKs | The RevenueCat SDK you may already know |
| Paywalls and A/B tests | Flow and paywall builder with A/B testing and segmentation (Adapty pricing) | Ten paywall templates, a visual editor, audiences and two-offering experiments |
| Add-ons | Refund Saver, Ads Manager, Mail and attribution are priced separately | Refund Control and win-back are included |
The RevenueDot vs Adapty comparison has the full table with sources. If you need SOC 2 Type II or deeper paywall experiments today, stay on Adapty.
Do it with RevenueDot#
- Create a free project and add your store credentials (connect your app).
- Rebuild products, entitlements and offerings, and build a paywall from a template if you want one.
- Ship the app update with the proxy URL and
syncPurchases(). - Route notifications through RevenueDot, forward to Adapty, and compare for a cycle.
- Cut over and watch the charts.
Start free on RevenueDot Cloud (free up to $10,000 monthly tracked revenue). The subscription revenue calculator helps you model your own numbers.
FAQ#
Can RevenueDot import my Adapty data?#
No. RevenueDot's importer reads RevenueCat projects only. For Adapty you recreate products and offerings, swap the SDK and let active subscribers re-sync from store receipts. Export your Adapty analytics as CSV first if you want a record of old reports.
Will my active subscribers lose access?#
Not if both systems stay on until old app versions fade out. Apple and Google keep sending renewals to the URLs on file, RevenueDot forwards them to Adapty, and each customer's access turns on in RevenueDot when the updated app posts their receipt.
Can I use the same user ids?#
Yes. Call Purchases.logIn with the id you gave Adapty as customerUserId. Purchases belong to the customer, so history follows the id.
Do I have to rewrite my paywalls?#
If they are Adapty-built, yes. Rebuild them from a RevenueDot template or keep your own screen and read offerings from the SDK. RevenueDot's paywalls are native screens the RevenueCat SDK renders without an app release.
Is the RevenueCat SDK the only choice?#
For now, yes. RevenueDot implements the API the RevenueCat SDKs call. The forks that need no proxy URL are built but not yet published on package registries.
About RevenueDot. RevenueDot is an open-source (AGPL-3.0) backend for in-app purchases and subscriptions that works with the RevenueCat SDK. Start free on RevenueDot Cloud, free up to $10,000 in monthly tracked revenue, or self-host it with Docker and Postgres. Point the SDK's proxy URL at RevenueDot and keep your app code, your offerings and your customers. Read the quickstart or the code on GitHub.