# 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

# iPhone Duo Support

Superwall paywalls work on iPhone Duo. Keep your paywall clear of the front camera and status bar, preview it in the editor, and test it on a device or in the simulator.

Superwall paywalls work on iPhone Duo with any version of the Superwall SDK. On iPhone Duo, the front camera and status bar sit along one edge of the screen, and by default your paywall goes underneath them. If a close button or another control is near that edge, it can end up hidden, and people can't leave the paywall.

You fix this on the paywall itself, in the paywall editor. You don't need to update the SDK or release a new version of your app.

> **Note:** Apps built with Xcode 26 or earlier aren't affected. On iPhone Duo, Apple runs them beside the status bar and camera instead of under them, so their paywalls already stay clear.

## Which edge it's on

The edge with the camera and status bar changes as the phone folds and turns:

* **Closed:** the right edge, with the outer front camera.
* **Open, held upright:** the top, where the status bar is.
* **Open, turned sideways:** the right edge.

## Keep your paywall clear of the camera and status bar

Each paywall has an **iPhone Duo safe area** setting. In the paywall editor, click **Settings** in the sidebar, then choose an option under **iPhone Duo safe area**. The setting's hints in the editor call this edge the camera strip.

1. **Full screen (Default):** The paywall goes under the camera and status bar. Anything near that edge can be hidden.
2. **Fill with background:** The paywall stops before that edge, and the space under the camera and status bar is filled with your paywall's background color. Good for solid-color backgrounds.
3. **Black edge:** The paywall stops before that edge, and the space under the camera and status bar is black. The paywall's corners next to it are rounded. Good for image backgrounds.
4. **Full screen, env() only:** The paywall looks exactly like **Full screen**, but the CSS safe-area variables report how much space the camera and status bar take up. Use this when you want the paywall to stay full screen and only keep a few elements, like a close button, clear of that edge. See [Keep a close button clear](#keep-a-close-button-clear).

![iPhone Duo safe area setting in the paywall editor](https://superwall.com/docs/images/pe-editor-settings-iphone-duo-safe-area.jpg)

Here's the same paywall in the iPhone Duo (closed) preview with each option:

<ImageToggle labels="[&#x22;Full screen&#x22;, &#x22;Fill with background&#x22;, &#x22;Black edge&#x22;]">
  
![Full screen: the paywall runs under the camera and status bar on iPhone Duo](https://superwall.com/docs/images/pe-editor-iphone-duo-safe-area-full-screen.jpg)

  
![Fill with background: the paywall stops before the camera and status bar, and that edge shows the background color](https://superwall.com/docs/images/pe-editor-iphone-duo-safe-area-fill-with-background.jpg)

  
![Black edge: the paywall stops before the camera and status bar, that edge is black, and the corners beside it are rounded](https://superwall.com/docs/images/pe-editor-iphone-duo-safe-area-black-edge.jpg)

</ImageToggle>

A few things to know:

* Only iOS apps see this setting.
* It only changes your paywall on iPhone Duo. On every other iPhone and iPad, nothing changes.
* Like other paywall changes, it reaches your users once you [publish](/docs/dashboard/dashboard-creating-paywalls/paywall-editor-publishing) the paywall.

## Keep a close button clear

With **Full screen, env() only**, `env(safe-area-inset-top)`, `env(safe-area-inset-right)`, `env(safe-area-inset-bottom)` and `env(safe-area-inset-left)` give you the size of the camera and status bar edge and the home indicator on iPhone Duo. Add them to an element's position or margin to move just that element.

For example, to keep a close button 16px from the camera and status bar on the closed phone, set its **right** to:

```css
calc(env(safe-area-inset-right) + 16px)
```

A close button in the top-right corner is next to that edge in every position: the right edge when the phone is closed or open sideways, and the top when it's open upright. Offset it from both edges to cover all of them:

```css
top: calc(env(safe-area-inset-top) + 16px);
right: calc(env(safe-area-inset-right) + 16px);
```

On every other iPhone and iPad, and in **Full screen** mode, these values are `0`, so the same style is safe everywhere. With **Fill with background** and **Black edge**, the paywall already stops before that edge, so the top and side values are `0` and only the bottom one reports the home indicator.

## Preview iPhone Duo in the editor

To see how your paywall looks, pick &#x2A;*iPhone Duo (closed)** or &#x2A;*iPhone Duo (open)** from the device menu at the bottom of the editor. The preview shows the camera, the status bar and your safe area setting, so it matches what people see on a real iPhone Duo. These options show for iOS apps in [Device view and Canvas view](/docs/dashboard/dashboard-creating-flows/the-canvas#device-view-vs-canvas-view), which are the **Device** and **Flow** buttons in the editor's toolbar.

If your editor doesn't show the **Device** and **Flow** buttons, it's using the legacy preview, which doesn't have the iPhone Duo devices. To switch, turn on **Flows** under [**Settings → Public beta**](/docs/dashboard/dashboard-settings/overview-settings-public-beta) in the dashboard, then reopen the paywall in the editor. It's turned on per app.

![The editor](https://superwall.com/docs/images/pe-editor-preview-iphone-duo-devices.jpg)

## Test on a device or in the simulator

On a real iPhone Duo, the setting works with the SDK version your app already has.

In an iPhone Duo simulator, the SDK has to report which model the simulator is emulating, and that needs Superwall iOS SDK (SuperwallKit) **4.18.1 or later**. With older versions, the simulator shows the paywall as **Full screen** whatever you choose.

| SDK          | Simulator testing             |
| ------------ | ----------------------------- |
| iOS          | 4.18.1 or later               |
| Expo         | 1.7.0 or later                |
| Flutter      | Not in a released version yet |
| React Native | Not in a released version yet |

Other SDKs support it once their iOS side bundles SuperwallKit 4.18.1 or later. Until your SDK supports it, use the iPhone Duo previews in the editor.

## Framework paywalls

Paywalls built with [Superwall Framework](/docs/framework), which is in beta, handle this in code. Lay them out with the [inset variables](/docs/framework/styling#insets), and the paywall stays clear of the camera and status bar as the phone folds and turns. If a design needs to know about that edge, [`useDevice().cutout`](/docs/framework/variables#usedevice) is `"strip"` on iPhone Duo. The [studio](/docs/framework/studio#what-you-can-check) has iPhone Duo closed and open devices to check it.

## My close button is hidden on iPhone Duo

The paywall is using **Full screen**, and the close button sits under the camera and status bar. To fix it:

1. Open the paywall in the editor and click **Settings**.
2. Under **iPhone Duo safe area**, choose **Fill with background** or **Black edge**. To keep the paywall full screen instead, choose **Full screen, env() only** and [offset the close button](#keep-a-close-button-clear).
3. Check it in the &#x2A;*iPhone Duo (closed)** and &#x2A;*iPhone Duo (open)** previews. If your editor doesn't have them, turn on Flows first. See [Preview iPhone Duo in the editor](#preview-iphone-duo-in-the-editor).
4. Publish the paywall.

The fix is on the paywall, so it doesn't need an app update.