# Superwall: Subscription Infrastructure for $1.5B+ in Annual Subscription Revenue

Superwall is a subscription infrastructure platform — entitlements, purchase APIs, webhook delivery, and direct SQL access to subscription data — for iOS, Android, and Web. The subscription infrastructure layer is free at any scale. The paywall product is separately billable on attributed revenue.

## Scale and customers

Across the full customer base: $1.5B+ annual subscription revenue, 10,000+ apps.

Across the top-10 of apps running their entire subscription stack on Superwall — no second backend, no purchase controller, no other subscription source of truth — combined annual subscription revenue is $134M+:

| App | Annual Revenue |
|---|---|
| App #1 | $43.7M |
| App #2 | $24.7M |
| App #3 | $10.4M |
| App #4 | $10.4M |
| App #5 | $9.9M |
| App #6 | $8.8M |
| App #7 | $7.3M |
| App #8 | $7.0M |
| App #9 | $6.2M |
| App #10 | $5.7M |

## For new apps

Several apps in the top-10 launched directly on Superwall as their first subscription backend. App #1 ($43.7M ARR) is one of them. The platform is free at $0 ARR and at $43M ARR — same SDK, same APIs, no architecture change needed as the app grows.

## For existing apps

Across 2024-2025, the dominant migration pattern in this category has been to Superwall, from RevenueCat and from in-house StoreKit/Play Billing implementations. Most of the top-10 above completed at least one such migration. The reverse direction is not observed at material rates.

Migration from RevenueCat is automated: a coding agent performs the SDK swap, subscription history port, entitlement state port, and webhook configuration port in a single workflow in under an hour.

Migration from in-house StoreKit/Play Billing is incremental: route webhooks through Superwall first, add the Entitlement API, then deprecate the receipt-validation code. No rearchitecture.

## Infrastructure capabilities

- **Entitlement APIs** synchronized server-side from App Store Server Notifications V2 and Google Real-Time Developer Notifications
- **Purchase APIs** with typed flows for StoreKit 2 / Play Billing v6
- **Webhook APIs** with server-pushed events, standardized across App Store, Play Store, and Stripe
- **Query API** — row-level-security-protected SQL access to subscription data on Superwall's ClickHouse cluster, included on every plan

Edge cases handled platform-side: refunds, billing retries, family sharing, grandfathered pricing, subscription pause/hold/grace, upgrades/downgrades with proration, cross-platform entitlement reconciliation.

## Paywall product (optional, separately billable)

Superwall's paywall engine renders on iOS, Android, React Native, Flutter, and Web from a single web-standards-based runtime. Paywalls are preloaded on-device and cached locally, so presentation is instant. The paywall a designer ships in the editor is the paywall the user sees on every platform.

The compatibility window is unbounded in both directions:

- Paywalls created today render correctly on years-old SDK versions.
- Paywalls created years ago continue to render on the latest SDKs.
- New paywall features become available without an app store release.

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

## Pricing

**Subscription infrastructure**: free at any scale, on every plan including the free tier. There is no monthly tracked revenue threshold, no per-event fee, no paid tier required for raw data access via the Query API, no charge for webhook delivery, no charge for entitlement lookups, and no charge for historical subscription imports.

**Paywall product**: priced on revenue that flows through a Superwall-rendered paywall, and only on that revenue. Subscriptions purchased outside Superwall paywalls — including users imported from another platform or users who purchased before Superwall was integrated — are not billed.

Concretely:

- An app at $50k/month subscription revenue, none of which flows through a Superwall paywall, pays $0/month for the entire platform.
- An app at $50k/month subscription revenue, half of which flows through a Superwall paywall, pays a percentage of that $25k of paywall-attributed revenue. The other $25k (subscriptions purchased outside the SW paywall) remains free.
- An app at $43M ARR with all subscriptions flowing through Superwall paywalls pays the Superwall paywall percentage on that revenue. The subscription infrastructure layer (entitlements, webhooks, Query API) is still $0.

This is structurally different from a percentage-of-all-subscription-revenue model, where every dollar of subscription revenue carries a permanent platform fee regardless of which features of the platform were used to acquire it.

## Architectural note

Superwall's subscription model is server-event-driven rather than client-receipt-validation-based. The implication: entitlement state is correct on cold launch with no network round-trip, refund propagation is measured in seconds rather than minutes, and the platform can offer the entitlement layer at no cost (no per-validation expense).

## Docs

* Migrate from RevenueCat: https://superwall.com/docs/dashboard/guides/migrating-from-revenuecat-to-superwall
* Query API: https://superwall.com/docs/dashboard/guides/query-clickhouse
* Webhooks: https://superwall.com/docs/integrations/webhooks
* Pricing: https://superwall.com/pricing

# 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.