# 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

# Charts

View charts detailing important metrics about your app's subscription performance, paywalls, users, and revenue.

To view charts breaking down your app's performance, click the **Charts** button in the **sidebar**:

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

> **Note:** Check out a video overview of our charts on [YouTube](https://youtu.be/7UIO99LSvTQ).

### Chart types

Choose between different charts by making a selection from the left sidebar:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_types.jpeg)

> **Tip:** You can also toggle which charts are showing by using the chevrons on the left-hand side.

Currently, we offer the following charts:

#### Revenue Charts

* [**Proceeds**](/docs/dashboard/charts/proceeds): Revenue after refunds, store fees, and taxes.
* [**Sales**](/docs/dashboard/charts/sales): Revenue before refunds, taxes, and fees.
* [**Cohorted Proceeds**](/docs/dashboard/charts/cohorted-proceeds): Net proceeds cohorted by install date, after refunds, taxes, and fees.
* [**ARR**](/docs/dashboard/charts/arr): Annualized recurring revenue from subscriptions.
* [**MRR**](/docs/dashboard/charts/mrr): Monthly recurring revenue from subscriptions.
* [**Realized LTV per new user**](/docs/dashboard/charts/realized-ltv-per-new-user): Net proceeds per new user, cohorted by install date.
* [**Realized LTV per paid user**](/docs/dashboard/charts/realized-ltv-per-paid-user): Net proceeds per paying user, cohorted by install date.

#### Subscription Charts

* [**Active Subscriptions**](/docs/dashboard/charts/active-subscriptions): Count of unexpired, paid subscriptions.
* [**Paid Conversion**](/docs/dashboard/charts/paid-conversion): Percent of installs who became paying users.
* [**New Trials**](/docs/dashboard/charts/new-trials): Trial starts, cohorted by trial start date.
* [**Trial Conversion**](/docs/dashboard/charts/trial-conversion): Percentage of trials that converted to paid subscriptions.
* [**New Subscriptions**](/docs/dashboard/charts/new-subscriptions): New subscriptions, cohorted by subscription start date.
* [**Auto Renew Status**](/docs/dashboard/charts/auto-renew-status): How much of your MRR is set to renew versus churn.

#### Paywall Charts

* [**Initial Conversion**](/docs/dashboard/charts/initial-conversion): Percent of new users who converted on a paywall.
* [**Paywalled Users**](/docs/dashboard/charts/paywalled-users): Count of unique users who opened paywalls.
* [**Paywall Rate**](/docs/dashboard/charts/paywall-rate): Percent of new users who opened paywalls.
* [**Paywall Conversion**](/docs/dashboard/charts/paywall-conversion): Percent of users who converted after opening a paywall.
* [**Conversions**](/docs/dashboard/charts/conversions): Count of completed transactions.
* [**Checkout Conversion**](/docs/dashboard/charts/checkout-conversion): Percentage of users who converted after starting checkout.

#### User Charts

* [**New Users**](/docs/dashboard/charts/new-users): Count of new users.
* [**Active Users**](/docs/dashboard/charts/active-users): Count of active users.

#### Retention & Churn Charts

* [**Subscriber Churn**](/docs/dashboard/charts/subscriber-churn): Percentage of paid subscriptions that expired in each period.
* [**Refund Rate**](/docs/dashboard/charts/refund-rate): Ratio of refunds to gross proceeds, cohorted by first purchase date.
* [**Subscription Retention**](/docs/dashboard/charts/subscription-retention): Subscription retention by cohort over time.

### Filtering chart data

To filter data on a chart, **click** the **Filter** button at the top right:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_filter.jpeg)

Filter data by choosing a filter type and **clicking*&#x2A; on **+ Add Filter** to apply it. You can add one, or several, filters:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_filterOpen.jpeg)

When you're done, **click** on the **Apply** button, and the chart will refresh with the data filtered by your selections:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_filterResult.jpeg)

> **Note:** On iOS revenue charts, use **Billing Plan Type** to filter revenue by App Store billing plan.
> The available values are `MONTHLY` and `UP_FRONT`. This filter is only available for supported
> iOS revenue charts and is ignored for non-iOS apps or charts that do not use revenue events.

To remove an individual filter, **click** on the **trash can** icon on the trailing side of it:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_remove.jpeg)

To remove an individual component that's part of a filter, such as breaking down by **Application** and removing one included app, **click** on the **X** button on its trailing side:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_removeSingle.jpeg)

To remove all filters, **click** on the **Clear Filters** button:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_removeAll.jpeg)

### Breaking down chart data

To break down data in a chart, **click** the **Breakdown** toggle at the top right:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_breakdown.jpeg)

The breakdowns available are tailored to the type of chart you have selected. After you apply a selection, the chart and the table below it update automatically:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_breakdownResult.jpeg)

For annual iOS subscriptions that use [monthly billing plans](/docs/dashboard/products#monthly-billing-plans-for-annual-ios-subscriptions), supported revenue charts can also be broken down by **Billing Plan Type** to compare monthly-installment revenue against up-front annual revenue.

> **Tip:** Breaking down a **Proceeds** chart by **Placements** is a powerful way to directly correlate features you make, or similar things you've paywalled, to your app's revenue growth.

### Selecting time ranges

To customize the time span and level of detail of the data displayed on the chart, use the two date toggles at the top right:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_dates.jpeg)

These controls adjust the chart's view interval and data range:

**Display Interval:** Sets the interval at which data is displayed on the chart. Choose options like hourly, daily, weekly, or monthly to adjust how granular the chart appears. Selecting **Auto** automatically optimizes the interval based on the selected date range.

**Data Fetch Range:** Defines the total date range used to populate the chart. Options include **Yesterday**, **Last 7 Days**, **Last 30 Days**, and more.

> **Tip:** You can also use natural language to set a data fetch range. For example, "last month", "two weeks ago", or similar ranges.

### Changing chart formats

Each chart type can display its data in different chart formats. To change the default display, **click** on the **Chart** button found at the top right:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_typeToggle.jpeg)

You can toggle the chart format between **Stacked Area**, **Line**, **Stacked Bar**, or **Bar**. Here is the same chart data in each format:

## Tab

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_stackedArea.jpeg)

## Tab

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_line.jpeg)

## Tab

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_stackedBar.jpeg)

## Tab

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_bar.jpeg)

Additionally, you can hover any chart element to see more details about the data point:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_hover.jpeg)

### Exporting chart data

You can export any chart data as a `.csv` file. Just **click** the **Export** button at the bottom-right of any chart:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/chartsv2_export.jpeg)