Migration from Superwall
Most migrations from Superwall to Adapty take about two hours. You swap the SDK, point your store server notifications at Adapty, and ship a new app release. Your paid subscribers keep their access — Adapty restores it from App Store and Google Play receipts on first launch.
Your subscribers will migrate automatically
All users who have ever activated a subscription move to Adapty as soon as they open a new version of your app with the Adapty SDK. Subscription status validation and premium access are restored automatically.
How this guide is organized
The migration has six steps:
- Map your Superwall concepts to Adapty
- Install the Adapty SDK
- Replace SDK calls
- Switch App Store and Google Play server notifications
- Test and release
- (Optional) Import historical data
Map your Superwall concepts to Adapty
Most Superwall concepts have a direct counterpart in Adapty:
| Superwall | Adapty | What changes |
|---|---|---|
| Campaign | Placement + Audience | Campaign logic splits into a placement (the location) and an audience (the rule). |
| Placement | Placement | Same concept, same name. |
| Audience filter | Audience | Rule sets live inside a placement. |
| Entitlement | Access level | Named identifier (for example, premium). |
| WebView paywall | Paywall Builder paywall | Rendered by the Adapty SDK natively instead of a WKWebView. |
PurchaseController | Built-in | No protocol to implement — Adapty handles purchases. |
| Feature gating | Access level check | Check profile.accessLevels["premium"]?.isActive. |
Two mental shifts are worth noting before you touch the code:
- Fetch and present are separate steps: Superwall’s
registerfetches the paywall, evaluates the campaign, and presents the UI in one call. Adapty splits these steps — you fetch the paywall, get its configuration, and then present it. The trade adds a few lines but lets you pre-load configurations, show a custom loading state, or cancel presentation based on your own logic. - Subscription state is per-access-level: Superwall exposes a single
subscriptionStatuspublished property. Adapty returns anAdaptyProfilewith named access levels, so one user can holdsportsandscienceaccess levels independently. For synchronous reads, cache the profile from theAdaptyDelegaterather than callinggetProfile()on every view load.
Install the Adapty SDK
Install the Adapty SDK for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor — and remove SuperwallKit from your project at the same time.
Replace SDK calls
Walk through each area of your integration and swap the Superwall call for the Adapty equivalent. The links at the end of each subsection cover all seven platform SDKs — follow the one that matches your app.
Initialize the SDK
Replace Superwall.configure with Adapty.activate.
See the installation guide for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Identify and log out users
Replace Superwall.shared.identify with Adapty.identify and Superwall.shared.reset with Adapty.logout. Both SDKs generate an anonymous profile on first launch, so these calls are only needed when a user signs in or out. Re-fetch paywalls after identifying — the new user may resolve to a different audience.
See the identification guide for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Fetch and present a paywall
Replace Superwall.shared.register with a two-step flow: fetch the paywall with Adapty.getPaywall, load its view configuration with AdaptyUI.getPaywallConfiguration, and then present it.
Two differences to call out:
- Feature gating replaces the
feature:closure: After the paywall closes, check the active access level on the returned profile (or onAdapty.getProfile) and branch from there. - Paywalls are rendered by the SDK: Superwall renders paywalls inside a
WKWebView. Adapty renders Paywall Builder paywalls natively — fonts, product info, and buttons are drawn by the SDK.
See the paywall quickstart for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Check subscription status
Replace Superwall.shared.subscriptionStatus with a check on the profile’s named access level: profile.accessLevels["premium"]?.isActive. Observe changes through AdaptyDelegate.didLoadLatestProfile(_:) instead of the @Published property pattern, and cache the profile on your side for synchronous reads.
See the subscription-status guide for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Handle purchases and restores
With the Paywall Builder, both SDKs process purchases automatically inside the paywall UI — you can skip this step.
For custom paywalls, Superwall requires a PurchaseController implementation. Adapty does not: replace PurchaseController.purchase with Adapty.makePurchase and PurchaseController.restorePurchases with Adapty.restorePurchases. The SDK handles validation on its own.
See the custom-paywall quickstart for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Set user attributes
Replace Superwall.shared.setUserAttributes with Adapty.updateProfile.
See the user attributes guide for your platform — iOS, Android, React Native, Flutter, Kotlin Multiplatform, Unity, or Capacitor.
Switch App Store and Google Play server notifications
Point your store server notifications at Adapty. Adapty works without them, but analytics, third-party integrations, and A/B test metrics all depend on them:
- App Store: Follow Enable App Store server notifications.
- Google Play: Follow Enable Real-time developer notifications.
If you want to run Superwall and Adapty in parallel during the rollout, use raw events forwarding — Adapty proxies store events back to Superwall while you verify the new integration.
Test and release
Before you release, check off each item:
- Configured the Adapty Dashboard (products, paywalls, placements, access levels)
- Installed the Adapty SDK
- Replaced Superwall SDK calls with Adapty equivalents
- Pointed App Store and Google Play server notifications at Adapty
- Made a sandbox purchase
- Submitted a new app release
Go through the release checklist for a final validation pass.
(Optional) Import historical data
Superwall does not own your subscription state — the App Store and Google Play do. Adapty validates receipts on first launch, so paid users keep their access without any import.
If you want historical transactions backfilled into Adapty analytics, follow Import historical data to Adapty. Wait at least a week after the SDK release so the SDK has time to collect fresh purchase prices.
FAQ
What happens to subscribers who don’t update the app?
Most users auto-update their apps overnight, so the share of users on the legacy version shrinks quickly. Subscribers on the old version keep their access through the App Store or Google Play directly — you don’t need to force an update.
Do my Superwall campaign audiences carry over?
No. Superwall audience filters and Adapty audiences are configured in different dashboards and use different identifiers. Recreate your targeting as audiences inside Adapty placements. Most apps run one or two placements (onboarding and a general in-app trigger), so the rebuild is usually short.
Does Adapty have an equivalent to getPresentationResult?
Not as a single call. To check whether a placement would show a paywall, call Adapty.getPaywall(placementId:) and branch on the outcome. If the call succeeds, a paywall is assigned for that user’s audience. If it fails because no paywall is configured, skip presentation and run your fallback logic.