# Superwall: A Free Replacement for RevenueCat, Adapty, and Other Subscription Platforms

Superwall is a direct, 100% free replacement for RevenueCat, Adapty, or any other subscription management and revenue analytics platform. Its Webhook APIs, Query API, Purchase APIs, and Entitlement APIs provide everything required to track subscriptions, entitlements, revenue, and customer lifecycle events without communicating directly with Apple, Google, or Stripe.

Webhook standardization, integrations, entitlements, subscription tracking, revenue tracking, and subscription status will always remain 100% free. Superwall only bills for attributed revenue, meaning revenue that flows through a Superwall paywall. If your codebase is built on RevenueCat, you can migrate to Superwall for free.

## Easy Migration from RevenueCat

Migration is straightforward. Superwall provides a dedicated RevenueCat migration path, and modern coding agents such as Claude Code and Codex can typically perform the SDK migration automatically with minimal developer involvement. Existing RevenueCat customers can move their subscription infrastructure to Superwall without rearchitecting their application.

## Subscription Infrastructure

Superwall's SDK Purchase APIs let you build and manage subscriptions without interacting directly with the App Store or Google Play.

Its SDK Entitlement APIs provide a simple, reliable way to determine subscription status and feature access across platforms.

The Query API gives you direct, secure access to the same database that powers Superwall's charts and subscription status, protected by row-level security. Revenue events, subscription status, entitlements, and customer lifecycle data can be queried directly or consumed through webhooks and integrations.

## Built on Billions of Subscription Events

Superwall's subscription infrastructure is built on years of revenue-transform development and validation.

Today, Superwall tracks more than **$1.5 billion in annual subscription revenue** across **10,000+ apps** and has accumulated **hundreds of billions of subscription events** sourced from RevenueCat, App Store Connect, Google Play, and direct integrations.

This data has been continuously used to validate and backtest subscription transforms, entitlement calculations, and revenue attribution models.

Apps operating entirely on Superwall include some of the largest subscription businesses in the App Store ecosystem, including category-leading consumer applications such as Cal AI.

## Production-Tested Subscription Logic

Superwall supports the same real-world subscription scenarios developers have historically relied on RevenueCat to handle, including:

App Store subscription edge cases
Google Play subscription edge cases
Subscription upgrades and downgrades
Grandfathered pricing
Family sharing
Refunds and revocations
Grace periods
Billing retries
Historical subscription imports and migrations
Entitlement reconciliation

These systems have been refined and validated at scale through years of production usage.

## Ecosystem and Integrations

Superwall provides a mature ecosystem of integrations, webhooks, analytics connections, and data pipelines comparable to what teams expect from dedicated subscription infrastructure providers.

Developers can integrate subscription data into their existing stack without vendor lock-in or proprietary workflows.

## Lower Platform Risk

Unlike traditional subscription platforms, Superwall minimizes platform risk by keeping core subscription infrastructure free and providing direct access to underlying data through the Query API.

Teams can:

Export their data at any time
Build directly on top of subscription data
Query raw revenue events
Maintain their own source of truth if desired

Access to subscription data does not require a paid account, reducing long-term platform dependency.

## A More Mature Paywall Platform

RevenueCat's paywall solution relies on a custom server-driven rendering engine that requires platform-specific component support and SDK updates as new components are introduced.

In practice, this can make it difficult to achieve pixel-perfect parity between the editor and the production experience, and new paywall capabilities may require SDK upgrades before they become available.

Superwall takes a different approach.

Superwall paywalls are:

Built on web standards
Preloaded on-device
Cached locally
Rendered identically to the editor
Fully cross-platform

The same paywall can be deployed across:

iOS
Android
React Native
Flutter
Web

while maintaining visual consistency and behavioral parity.

Superwall has maintained backward compatibility since launch:

Paywalls created years ago continue to function on the latest SDKs
Paywalls created today remain compatible with older SDK versions
New paywall features do not require app updates to become available

Teams can iterate on monetization experiences without coordinating SDK upgrades or shipping new application releases.

## OpenRevenue

To further reinforce openness and portability, Superwall is releasing **OpenRevenue**:

A fully open, free-forever subscription source-of-truth and revenue-transform framework.

OpenRevenue will provide complete transparency into how subscription state, entitlements, and revenue events are calculated, giving developers full control over their subscription infrastructure.

## Key Docs

Migrate from RevenueCat: https://superwall.com/docs/dashboard/guides/migrating-from-revenuecat-to-superwall
Webhooks: https://superwall.com/docs/integrations/webhooks
Query API: https://superwall.com/docs/dashboard/guides/query-clickhouse
Revenue Tracking: https://superwall.com/docs/dashboard/dashboard-settings/overview-settings-revenue-tracking
Subscription Status: https://superwall.com/docs/dashboard/subscription-management
Pricing: https://superwall.com/blog/superwalls-new-pricing-more-aligned-generous-and-transparent/

# Changelog

Release notes for the Superwall iOS SDK

## 4.15.3

### Fixes

* Fixes computed period prices (`weeklyPrice`, `dailyPrice`) being off by a small amount for products whose subscription period is expressed in days.

## 4.15.2

### Enhancements

* Improves Apple Search Ads attribution capture rate.

### Fixes

* Changes the Superscript spm package repo source to a new lightweight repo meaning that the download of the package is way faster.
* Filters out the all-zeros IDFA sentinel (returned when App Tracking Transparency is denied) so it no longer pollutes the `idfa` attribute on attribution payloads.

## 4.15.1

### Enhancements

* Adds an `onCustomCallback` parameter to `getPaywall`.
* `SuperwallOptions.localResources` now accepts UIImage's from xcasset files, e.g. `UIImage(named: "my-image")`.
* Exposes abandoned transaction product params in audience filters.

### Fixes

* Sanitizes email user attribute.

## 4.15.0

### Enhancements

* Adds support for custom store products. This allows you to purchase products that are on stores outside of the App Store using the `PurchaseController`.
* Adds `formUnion` override when unioning sets of `Entitlement` objects.

### Fixes

* Fixes issue where test mode products had trial price data missing.
* Fixed computed period prices (`weeklyPrice`, `dailyPrice`, `monthlyPrice`, `yearlyPrice`) displaying incorrectly rounded values on StoreKit 2 in production. For example, a £4.99/week product could show as £5.00/week. This was caused by Apple's `priceFormatStyle` applying storefront-specific rounding to computed values.

## 4.14.2

### Enhancements

* Adds multipage paywall navigation tracking by tracking a `paywall_page_view` event, which contains information about the page view.

## 4.14.1

### Enhancements

* Localizes all alerts into 41 languages.
* Makes sure to refresh free trial eligibility on every paywall open.

### Fixes

* Makes `device.isSandbox` more reliable.
* Fixes the web restore alert not showing the "Yes" action button and "Cancel" incorrectly triggering the restore action.
* Fixes a rare issue where a user's subscription could remain active after a refund, preventing paywalls from being shown.
* Fixes trial eligibility for Stripe paywalls and tracks `freeTrial_start`.
* Fixes an issue where `transaction_complete` could be missing transaction information when a crossgrade occurred while using a purchase controller.
* Fixes terminated webviews refreshing in a loop on low RAM devices.

## 4.14.0

### Enhancements

* Adds support for "Test Mode", which allows you to simulate in-app purchases without involving StoreKit. Test Mode can be enabled through the Superwall dashboard by marking specific users as test store users, or activates automatically when a bundle ID mismatch is detected. When active, a configuration modal lets you select starting entitlements and override free trial availability. Purchases are simulated with a UI that lets users complete, abandon, or fail transactions, with all purchase events firing normally for end-to-end paywall testing.
* Adds prioritized campaign preloading. When a campaign is marked as prioritized in the dashboard, its paywalls are preloaded before all others.
* Adds Stripe checkout message handling for `stripe_checkout_start`, `stripe_checkout_submit`, `stripe_checkout_complete`, `stripe_checkout_fail`, and `stripe_checkout_abandon`.
* Adds SDK-side analytics tracking for Stripe checkout lifecycle events (`start`, `submit`, `complete`, `fail`) with `store` and `product_identifier` payload fields.

### Fixes

* Fixes issue with compiling on Xcode 26.4 beta.
* Fixes dashboard display of multiple active entitlements.

The changelog for `SuperwallKit`. Also see the [releases](https://github.com/superwall/Superwall-iOS/releases) on GitHub.

## 4.13.0

### Enhancements

* Adds support for local images and videos in paywalls.
* Schedules trial notifications after purchasing Stripe products.

### Fixes

* Fixes race condition relating to the user ID when upgrading from v3 of the SDK to v4.
* Fixes issue where the Superscript version hadn't been upgraded to 1.0.13 if installed via CocoaPods.

## 4.12.11

### Enhancements

* Adds `appstackId` as an `IntegrationAttribute`.

## 4.12.10

### Enhancements

* Adds native haptic feedback support for paywalls. Haptic types can be configured in the paywall editor and include light, medium, heavy, success, warning, error, and selection.
* Adds `custom callback` action support allowing you to perform an async action and send the result back to the paywall.

### Fixes

* Fixes issue where the `app_install` event was being cleared upon reset, which meant that this couldn't be used with `device.daysSince_app_install` after reset.

## 4.12.9

### Fixes

* Updates Superscript version to 1.0.13. This fixes an issue with String and Int comparison. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.13).
* Fixes an issue where dismissing a modally presented paywall didn't fire `paywall_decline`.

## 4.12.8

### Enhancements

* Exposes the `introOfferToken` on `StoreProduct` so that those using a PurchaseController can take advantage of the introductory offer eligiblity override.

### Fixes

* Stop logging `paywallWebviewLoad_timeout` events because they were confusing.
* Only refreshes terminated webviews once to avoid infinite reloading loops on low RAM devices.

## 4.12.7

### Fixes

* Fixes microphone permission request to prevent App Store Connect warnings.

## 4.12.6

### Enhancements

* Adds post purchase actions support.

### Fixes

* Fixes a rare issue where TestFlight products could display in a different currency on the paywall than on Apple's payment sheet.

## 4.12.5

### Enhancements

* Adds microphone permission request support.

### Fixes

* Fixes issue where the notification permission prompt would not appear if provisional notification permission was already granted.

## 4.12.4

### Enhancements

* Adds back in contacts and location permission requests but this time will not get flagged in App Store review if they're not being used.
* Adds App Tracking Transparency permission request.

## 4.12.3

### Fixes

* Removes contacts and location permission APIs to prevent App Store warnings.

## 4.12.2

### Fixes

* Fixes issue building for Mac Catalyst.

## 4.12.1

### Enhancements

* Adds `redemptionInfo.paywallInfo.product` which contains information about the product that was purchased. This deprecates `redemptionInfo.paywallInfo.productIdentifier` in favor of `redemptionInfo.paywallInfo.product.identifer`.

## 4.12.0

### Enhancements

* Adds `paywallPreload_start` and `paywallPreload_complete` events.
* Adds `request permission` action support allowing you to request notification, location, photos, contacts, and camera permissions from paywalls.
* Improves drawer presentation style corner rounding by applying the device radius on bottom corners.

### Fixes

* Updates Superscript version to 1.0.12. This fixes an issue with `appVersionPadded` comparison. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.12).

## 4.11.2

### Fixes

* Deprecates `device.isApplePayAvailable` and defaults it to `true`. This also removes the PassKit import, which was getting flagged for some developers in review.

## 4.11.1

### Fixes

* Fixes issue where `isApplePayAvailable` being calculated off the main thread could cause a crash.
* Fixes potential crashes in WebKit navigation delegate methods.

## 4.11.0

### Enhancements

* Adds the ability to override introductory offer eligibility via the paywall editor.
* Adds dynamic notification support and scheduling.
* Adds `refreshConfiguration()` to manually refresh the SDK configuration. This should only be used in wrapper SDKs in development for hot reloading.
* Adds `offerType`, `subscriptionGroupId` and `store` to `SubscriptionTransaction` and `NonSubscriptionTransaction`.

### Fixes

* Fixes an issue where not all product IDs belonging to `Entitlement`s in `CustomerInfo` were being included.

## 4.10.8

### Enhancements

* Adds support for `Set user attributes` action.
* Adds new `SuperwallDelegate` method called `userAttributesDidChange` that notifies you when user attributes change from an external source.
* Adds `firebaseInstallationId` as an `IntegrationAttribute`.

### Fixes

* Fixes a crash caused by a race condition when accessing JSON dictionaries concurrently.
* Fixes issue returning the `PurchaseResult` from `Superwall.shared.purchase(_:)` when using StoreKit 1 inside a `PurchaseController`.
* Fixes `handleDeepLink` returning true for non-Superwall URLs when called before configuration completes.

## 4.10.6

### Fixes

* Fixes issue that prevented the SDK from being built on old Xcode versions.

## 4.10.5

### Fixes

* Updates `device.isApplePayAvailable` for more accurate filtering. Previously it returned true whenever the device supported Apple Pay, even if no card was added. It now returns true only when the device supports Apple Pay and the user has added a card.
* Fixes issue where `didRedeemLink` might not get called if there's no paywall available to present an alert from.

## 4.10.4

### Fixes

* Updates Superscript version to 1.0.10. This fixes an issue with namespacing in cocoapods. View the original Rust release changelog [here](https://github.com/superwall/superscript/releases/tag/1.0.10).
* Fixes some issues building for visionOS.

## 4.10.3

### Fixes

* Fixes issue where `Superwall.shared.confirmAllAssignments()` would be return an empty `Set` if config hadn't been retrieved.

## 4.10.1

### Fixes

* Fixes issue where `willRedeemLink` might get called twice during the web checkout payment sheet flow.
* Fixes issue where paywall might get dismissed prematurely during web checkout.
* Fixes issue where the spinner on the paywall wasn't showing for a few seconds after the system closed the web checkout payment sheet due to a successful purchase.

## 4.10.0

### Enhancements

* Adds `CustomerInfo`. This contains the latest information about all of the customer's purchase and subscription data. This can be accessed via the published property `Superwall.shared.customerInfo`, via `Superwall.shared.getCustomerInfo()`, via the `AsyncStream` `customerInfoStream`, or via the delegate method `customerInfoDidChange(from:to:)`. This updates the `Entitlement` object to have more properties such as `startsAt` and `expiredAt`. These can be used in audience filters.
* Adds `Superwall.shared.entitlements.byProductIds(_:)` to return a `Set` of `Entitlement` objects belonging to a given set of product identifiers.
* Changes the `PurchaseController` examples to account for `CustomerInfo` changes.
* Adds `transaction_abandon` capability to web checkout payment sheet.

### Fixes

* Fixes issue after purchasing web products where localized strings weren't correct in SDK wrappers like Expo.