# 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

# Apple Search Ads

Integrate Apple Search Ads with Superwall. View details on users acquired via search ads, visualize conversions from Apple Search Ads in charts, and create powerful campaign filters to target users using search ad data. Search ad integration requires 3.12.0 of the Superwall SDK or higher.

In the **Apple Search Ads** section within **Integrations**, you can the enable Apple Search Ads integration with Superwall:

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/integrations-asa.jpeg)

> **Note:** Apple offers two different search ad services, "Basic" and "Advanced" tiers. Superwall supports
> both of them, though more data is available with the Advanced ads.

### Basic search ads setup

If you're only using basic search ads, **click** the toggle next to **Basic Apple Search Ads** to enable the integration:

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-basic.jpeg)

That's it, you're all set. With basic Apple Search Ads enabled, you'll be to see users acquired via search ads in the [users page](/docs/dashboard/overview-users).

To see what you can do with advanced search ads data, skip down to the [use cases](#use-cases) section.

### Advanced search ads setup

Advanced search ads takes a few more steps since it requires the [Campaign Management API](https://searchads.apple.com/help/campaigns/0022-use-the-campaign-management-api). The overview is as follows, with more details about each step below them:

* First, you'll need to create a user in Apple Search Ads **using a different Apple Account** than your primary Apple Account.
* This new user will need to be set up with either the API Account Manager or API Account Read Only role.
* Then, you'll generate three things by pasting in a public key from Superwall: a client ID, team ID and key ID.
* Finally, you'll enter those three values into Superwall.

**Step One: Invite a new user**

1. Go to [searchads.apple.com](https://searchads.apple.com) and click **Sign In -> Advanced**.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-advanced-sign-in.jpeg)

2. Locate your account name in the top right corner and click **Account Name -> Settings**.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-settings.jpeg)

3. Under User Management, click **Invite Users**.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-invite-user.jpeg)

4. Grant the user appropriate permissions and enter in the rest of the details. The email address here is the one you'll want to use to create a new user in Apple Search Ads:
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-perms.jpeg)

**Step Two: Accept the invitation**<br />
Open the email and follow Apple's instructions to set up a new user with Apple Search ads. The email will look similar to this:

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-invite-email.jpeg)

Once you've accepted the invitation using the invited Apple Account:

1. Once again, go to [searchads.apple.com](https://searchads.apple.com) and click **Sign In -> Advanced**.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-advanced-sign-in.jpeg)

2. Locate your account name in the top right corner and click **Account Name -> Settings**.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-settings.jpeg)

3. Over in Superwall, go to the **Settings -> Apple Search Ads -> click copy** under the public key:
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-paste-sw.jpeg)

4. Back in Apple Search Ads, paste the public key under **Public Key** and click **Generate API Client**:
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-paste-asc.jpeg)

**Step Three: Generate the client ID, team ID and key ID**<br />
Now, you should see three values that have been generated by Apple Search Ads, a client ID, team ID and key ID.

1. Copy each generated value.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-values.jpeg)

2. In Superwall, paste each value in and click "Update ASA Configuration."
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-paste-stuff.jpeg)

3. Finally, click on "Check Configuration" and confirm everything is set up properly.
   
![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-confirm.jpeg)

### Use cases

Once you've enabled Apple Search Ads, you can use the data in a few ways. First, users who've been acquired from a search ad will display that information in the users page under "Apple Search Ads." This is available with either the basic or advanced search ads. This can be useful for understanding the quality of users acquired from search ads.

If you're using advanced search ads, you get significantly more capabilities:

* You can leverage search ad data in your campaigns. This opens up the ability to do things like showing a specific paywall to a user who was acquired via a search ad, tailor messaging from the keyword that was used, and more.
* You can view search ads data in charts, breaking down metrics by campaign name and more.

#### Viewing users acquired via Apple Search Ads

If any user was acquired via a search ad, you'll see that data in the [users page](/docs/dashboard/overview-users). This can be useful for understanding the quality of users acquired from search ads:

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overivew-settings-asa-user.png)

Here's a breakdown of the attributes you'll see:

| Attribute         | Example               | Description                                                                                                                                  |
| ----------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Ad Group Id       | 1684936422            | The identifier for the ad group. Use Get Ad Group-Level Reports to correlate your attribution response by adGroupId.                         |
| Ad Group Name     | Primary Ad Group      | The name of the ad group for organizational and reporting purposes.                                                                          |
| Ad Id             | -1                    | The identifier representing the assignment relationship between an ad object and an ad group. Applies to devices running iOS 15.2 and later. |
| Attribution       | true                  | A Boolean value indicating if the attribution was successful. Returns true if a user clicks an ad up to 30 days before downloading your app. |
| Bid Amount        | 0.25                  | The cost-per-click (CPC) bid amount placed for this ad group.                                                                                |
| Bid Currency      | GBP                   | The currency used for the bid amount.                                                                                                        |
| Campaign Id       | 1633810596            | The unique identifier for the campaign. Use Get Campaign-Level Reports to correlate your attribution response by campaignId.                 |
| Campaign Name     | Primary Campaign (US) | The name of the campaign, useful for tracking and organizational purposes.                                                                   |
| Conversion Type   | Download              | The type of conversion, either Download or Redownload.                                                                                       |
| Country Or Region | US                    | The country or region for the campaign.                                                                                                      |
| Keyword Id        | 1685193881            | The identifier for the keyword.                                                                                                              |
| Keyword Name      | baskeball app         | The specific keyword that triggered the ad.                                                                                                  |
| Match Type        | EXACT                 | The keyword matching type used to trigger the ad (e.g., EXACT, BROAD, or PHRASE).                                                            |
| Org Id            | 3621140               | The identifier of the organization that owns the campaign. This is the same as your account in the Apple Search Ads UI.                      |

#### Using search ad data in campaigns

Using the table above, you can turn around and use any of those values to create [campaign filters](/docs/dashboard/dashboard-campaigns/campaigns-audience#filters):

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/overview-settings-asa-filters.png)

> **Warning:** There is a delay from the moment a user downloads your app via a search ad to the time that event
> is sent to Superwall from Apple's servers. For that reason, using search ad data as a filter on
> events like an app's launch is discouraged.

#### Charts

Use data from Apple Search Ads in our [charts](/docs/dashboard/charts) as a breakdown and filter:

![](https://963b3ab1-superwall-docs-staging.staffbar.workers.dev/docs/images/asa-chart-breakdowns.png)

Apple Search Ads data can be used in the following charts:

* **Proceeds**
* **Sales**
* **Conversions**
* **New Subscriptions**
* **New Trials**
* **Trial Conversions**
* **Refund Rate**

As far as search ads data, you can create breakdowns using the following:

* **Ad Group Name**
* **Campaign Name**
* **Keywords Match Name**
* **Match Type**

Some common use cases here are:

* Attributing new trials from a search campaign.
* Seeing which keywords generate the most revenue.
* Understanding the quality of users acquired from a search ad.
* etc.