Migrate from Adapty
Map Adapty concepts and SDK calls to Voidhash, and move your app over without losing subscribers.
This page maps Adapty's concepts and SDK calls to their Voidhash equivalents, then lists the steps specific to moving from Adapty. The overall plan, a parallel run followed by a switch behind a flag, is in Migrate to Voidhash.
Concepts
| Adapty | Voidhash | Notes |
|---|---|---|
| App | Project | One per app, across platforms. |
| Access level | Perk | Checked by slug, such as premium. |
| Product | Product mapped to store products | One Voidhash product can map to the App Store, Google Play and Stripe. |
| Placement | Paywall location | A stable slug in your app, such as onboarding. |
| Paywall | Paywall | Designed and deployed in Studio. |
| Audience | — | A location shows one paywall to everyone; see No targeting rules. |
| A/B test | A/B test | Tests paywalls at a location. |
| Profile | Person | Shown on People; returned by getCurrentPerson(). |
| Customer user ID | Distinct ID | Your user ID, passed to identify. |
| Custom attributes | Person attributes | Set with setPersonAttributes. |
| Promotional offers | Offers | Mapped per store under one offer ID. |
| Webhooks and integrations | Webhook delivery | Signed; see Webhook events. |
| Observer mode | Observer mode | readOnly in Voidhash. |
SDK calls
Adapty names below are the Swift ones; the other Adapty SDKs use close equivalents.
| Adapty | Swift | Kotlin | React Native |
|---|---|---|---|
Adapty.activate(_:) | Voidhash.configure(publishableKey:options:) | Voidhash.configure(context, publishableKey, options) | createVoidhashClient(publishableKey) |
Adapty.identify(_:) | identify(externalUserId:) | identify(externalUserId) | client.identify(userId) |
Adapty.logout() | signOut() | signOut() | client.signOut() |
Adapty.getProfile() | getCurrentPerson() | getCurrentPerson() | client.getCurrentPerson() |
accessLevels["premium"]?.isActive | person?.hasActivePerk("premium") | person?.hasActivePerk("premium") | client.hasPerk("premium") or useHasPerk |
Adapty.getPaywall(placementId:) and its products | presentFlow(placement: "onboarding"), or getProducts() for your own screen | presentFlow(activity, "onboarding") or getProducts() | client.presentFlow("onboarding") or useProducts() |
Adapty.makePurchase(product:) | purchase(product:) | purchase(activity, product) | client.purchase(product) |
Adapty.restorePurchases() | restorePurchases() | restorePurchases() | client.restorePurchases() |
Adapty.updateProfile(params:) | setPersonAttributes(_:) | setPersonAttributes(...) | client.setPersonAttributes(...) |
presentFlow returns a failed result when nothing is assigned to the location, so keep a fallback
screen for important entry points.
Steps specific to Adapty
Rebuild the catalog
For each access level, create a perk. For each product, create a Voidhash product, map it to the same store products and attach its perks. Import products on the Products page lists the store products that aren't mapped yet. See Products and perks.
Recreate placements and paywalls
Create a location for each placement, with the same slug if you can, so app code changes little.
Paywalls don't import: rebuild them in the designer, deploy, and assign each to
its location. Paywalls are in early access; until they're on for your team, sell from your own
screens with getProducts() and purchase.
Keep Adapty in charge, and observe
Ship the Voidhash SDK with readOnly on, next to Adapty, which keeps finishing transactions. After
each purchase Adapty completes, call reportTransaction with the App Store transaction ID or Google
Play purchase token. See Observer mode.
Use the same user IDs
Call identify with the same customer user ID you pass to Adapty. Anonymous Adapty profiles don't
carry over; anonymous buyers appear in Voidhash once their app reports their purchases.
Share store notifications
Point App Store Server Notifications at Voidhash and set Voidhash's forwarding URL to the URL Adapty gave you. On Google Play, add Voidhash's subscription to your existing Pub/Sub topic. See Store notifications.
Compare, then switch
Log Voidhash webhooks next to Adapty's, compare access for a sample of people, then move purchase UI
and transaction ownership to Voidhash behind one flag with setReadOnly(false). Remove Adapty once
the flag is at 100%.
Exactly one SDK must finish or acknowledge each transaction. Decide which from one flag, read before either SDK starts a purchase, and never let both, or neither, own purchases.
Next steps
- Migrate to Voidhash: the phased plan and timeline.
- Run in observer mode
- Paywall locations
Something wrong or missing on this page? Tell us by email or on Discord.