# 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

# Starting an Experiment

You run experiments in Superwall by adding multiple paywalls to an audience. To start an experiment:

1. Select an audience.
2. Click the Paywalls tab.
3. Add two or more paywalls.

Here's a .gif, beginning to end, setting up an experiment:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/campaigns-experiment-start.gif)

It's as simple as that to start a paywall experiment.

### Setting presentation percentages

You must set a presentation percentage between your paywalls within the experiment. This determines how often they'll show based off of the percentage set for each one.

To set a percentage, **click** the **pencil icon** above *any* of the paywalls attached to the audience:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/campaigns-experiments-ratio-edit.png)

Then, assign percentages from 0%-100% for each of them. In total, your percentages should equal 100 (i.e. paywall A shows 10%, paywall B shows 30%, and paywall c shows 60% of the time) unless you're purposely creating a [holdout](/docs/dashboard/dashboard-campaigns/campaigns-starting-an-experiment#creating-holdouts). When you're done, **click** the **Checkmark** icon below any paywall:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/campaigns-experiments-ratio-commit.png)

### Resetting assignments

If you change your experiment, or simply want to change the presentation percentages between your paywalls, you might want to reset your assignments. Remember that when an audience matches a user, it's *sticky* — and the same is true of when someone is matched to a paywall within an experiment.

So, if you want to make sure everyone is matched again to a paywall based off new percentages, **click** the refresh button below a paywall when editing percentages (next to where it says "X assigned"):

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/campaigns-experiments-reassign.png)

> **Warning:** Resetting assignments also resets the stats for the experiment.

### Creating holdouts

A *holdout* occurs when you purposely edit an audience to *not* present a paywall in some cases. Setting a holdout is useful when you want to test the effectiveness of showing a paywall.

**To create a holdout, set your paywall presentation percentages to be less than 100% across all of the paywall you're using.**

Here's an example of one paywall set to show 50% of the time, meaning the other 50% of users who match this audience will be in a holdout:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/campaigns-experiment-holdout.png)

It's common to pair holdouts to certain [placements](/docs/dashboard/dashboard-campaigns/campaigns-placements) to see whether a holdout increases or decreases transactions. The holdout group will act as a control which you can compare against.

### Removing variants

During an experiment, you may find that one or more paywalls are performing significantly worse than the others. In that case, you would probably consider removing it. You can simply remove the paywall, or set its presentation percent to 0%, and your experiment will continue. No metrics will be affected or reset. &#x2A;*Resetting assignments will reset metrics, removing paywalls will not.**