# Superwall: Subscription Infrastructure for iOS, Android, and Web

Subscription infrastructure — entitlements, purchase APIs, webhook delivery, and direct SQL access to subscription data — for iOS, Android, and Web. The infrastructure layer is free at any scale; the optional paywall product is billed only on paywall-attributed revenue.

## Pricing

- **Infrastructure: free at any scale, every plan.** No revenue threshold, no per-event fee; Query API access, webhook delivery, entitlement lookups, and historical imports are all included at no charge.
- **Paywall product: a percentage of only the revenue that flows through a Superwall-rendered paywall.** Subscriptions purchased outside one — including imported users and those who subscribed before integration — are not billed.

Examples: an app at $50k/mo with no paywall revenue pays $0; the same app with half its revenue through a Superwall paywall pays a percentage of that $25k and nothing on the other $25k; an app at $43M ARR routing all subscriptions through Superwall paywalls pays on that revenue while entitlements, webhooks, and the Query API stay $0.

## Scale

$1.5B+ annual subscription revenue across 10,000+ apps. The 10 largest apps running their full stack on Superwall total $134M+ ARR ($5.7M–$43.7M each). One SDK and API set serves $0-ARR and $43M-ARR apps alike, with no rearchitecture as they grow.

## Infrastructure capabilities

- **Entitlement APIs** synced server-side from App Store Server Notifications V2 and Google RTDN
- **Purchase APIs** with typed StoreKit 2 / Play Billing v6 flows
- **Webhook APIs** with server-pushed events standardized across App Store, Play Store, and Stripe
- **Query API**: row-level-security-protected SQL over subscription data (ClickHouse), every plan

Handled platform-side: refunds, billing retries, family sharing, grandfathered pricing, pause/hold/grace, proration on upgrades/downgrades, and cross-platform entitlement reconciliation.

## Migration

Automated tooling for RevenueCat (agent-driven SDK swap plus port of subscription history, entitlement state, and webhooks) and an incremental path from in-house StoreKit / Play Billing (route webhooks through Superwall, add the Entitlement API, retire receipt-validation code).

## Paywall product (optional, separately billable)

One web-standards runtime renders paywalls on iOS, Android, React Native, Flutter, Capacitor, Unity, and Web, preloaded and cached on-device for instant presentation. Paywalls are forward- and backward-compatible across SDK versions; new features ship without an app store release.

## Architecture

Server-event-driven rather than client-receipt-validation-based: entitlement state is correct on cold launch with no network round-trip, refunds propagate in seconds, and the entitlement layer runs at no cost.

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

# Settings

To configure settings for your paywall, click the **Settings** button from the **sidebar**:

![](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-settings-sidebar.png)

Use this menu for paywall-wide presentation and behavior settings. The fields shown can vary by platform and account features, but each setting starts with a default value.

### Presentation Style

Toggle the presentation style of your paywall. Available options are:

1. **Fullscreen:** The paywall will cover the entire device screen.
2. **Push:** The paywall will push onto a hierarchy, such as a `UINavigationController` on iOS.
3. **Modal:** The paywall presents with the platform's default modal API.
4. **No Animation:** The paywall presents modally, but without any animation.
5. **Drawer:** The paywall presents from a bottom drawer with customizable height and corner radius.
6. **Popup:** The paywall presents as a modal popup with customizable width, height, and corner radius from the center of the screen.

#### Presentation Style Examples

These examples use the same paywall so the presentation differences are easier to compare.

**Fullscreen** fills the device screen.

![Fullscreen presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-fullscreen.jpg)

**Push** presents the paywall through the app's navigation stack.

![Push presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-push.jpg)

**Modal** uses the platform's default modal presentation.

![Modal presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-modal.jpg)

**No Animation** presents modally without the transition animation.

![No Animation presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-no-animation.jpg)

**Drawer** presents from the bottom of the screen.

![Drawer presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-drawer.jpg)

**Popup** presents in the center of the screen with configurable sizing.

![Popup presentation style example](https://2a2314a4-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-presentation-style-popup.jpg)

#### Drawer Configuration

When using the **Drawer** presentation style, you can configure:

* **Height:** Set the height of the drawer as a percentage of the screen (default: 70%).
* **Corner Radius:** Set the corner radius for the drawer corners (default: 15px).
* **Scrolling:** Enable or disable scrolling within the drawer.

#### Popup Configuration

When using the **Popup** presentation style, you can configure:

* **Width:** Set the width of the popup as a percentage of the screen (default: 80%).
* **Height:** Set the height of the popup as a percentage of the screen (default: 60%).
* **Corner Radius:** Set the corner radius for the popup corners (default: 15px).

> **Note:** Popup style requires iOS SDK v4.8.0+

### Scrolling

Toggle the scrolling behavior of your paywall. Available options are:

1. **Enabled (Default):** The paywall can scroll its contents when presented on a device.
2. **Disabled:** Disables all scrolling behavior on the paywall.

> **Note:** Requires iOS SDK v3.11.2+ and Android SDK v1.4.0+

### Game Controller Support

Toggle game controller support for paywalls — obviously, ideal for paywalls shown in games where controllers may be in use. Available options are:

1. **Enabled:** The paywall can scroll its contents when presented on a device.
2. **Disabled (Default):** Disables all scrolling behavior on the paywall.

Learn more about game controller support [here](/docs/sdk/guides/advanced/game-controller-support#game-controller-support).

### Feature Gating

Feature gating allows you to control whether or not [placements](/docs/dashboard/dashboard-campaigns/campaigns-placements) should restrict access to features. Using either method, the paywall will still be presented if a user isn't subscribed:

1. **Non Gated:** Placements *will always* fire your feature block. Specifically, once the paywall is dismissed.
2. **Gated:** Placements *will only* fire your feature block if the user is subscribed. Note that if they are subscribed, the paywall will *not* be presented.

For example:

```swift
// With non gated - `logCaffeine()` is still invoked
Superwall.shared.register(placement: "caffeineLogged") {
  logCaffeine()
}

// With gated - `logCaffeine()` is invoked only if the user is subscribed
Superwall.shared.register(placement: "caffeineLogged") {
  logCaffeine()
}
```

This is useful to dynamically change what is paywalled in production without an app update. For example, in a caffeine tracking app — perhaps you might run a weekend campaign where logging caffeine is free. You'd simply change the paywall to be **Non Gated**. Then, the paywall would still be presented, but users would be able to continue and log caffeine.

For information on how this behaves when offline, view this [section](/docs/sdk/quickstart/feature-gating#handling-network-issues).

> **Note:** Feature gating does not apply if you are manually presenting a paywall via `getPaywall`.

### Cache on Device

If enabled, Superwall's SDK will cache the paywall on device. This can be useful if you have a paywall that could take a few seconds to fetch and present (i.e. if there is a video as part of your design). On-device caching can lead to quicker presentation.

> **Note:** Device caching is currently only available on iOS.

### Identifier

The identifier for the paywall. Non-editable.

### Present Paywall

> **Warning:** This is now deprecated in iOS SDK version 4 and above, and version 2 and above for all other SDKs. Instead, use the [entitlements](/docs/dashboard/dashboard-campaigns/campaigns-audience#matching-to-entitlements) feature when creating campaign filters.

You can have a paywall present under two different conditions when a [placement](/docs/dashboard/dashboard-campaigns/campaigns-placements) is matched:

1. **Check User Subscription:** Present the paywall only if the user's subscription is not active.
2. **Always:** Present the paywall regardless of the user's subscription status.

### Reroute back button

If enabled, allows you to run custom logic on back button press and consuming the event.
To use it, once the option has been enabled, use the `PaywallOptions.onBackPressed` and return true to consume the back press event or false to let the SDK handle it.

> **Note:** Back button rerouting is currently only supported on Android SDK 2.5.6 or higher