# 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

# Paywall Localization

To localize your paywall, **click** on the **Localization** button from the **sidebar**:

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

There are two ways to localize your paywall:

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

1. **Simple**: Here, you can use AI to localize your paywall into any language. You can manually refine each value at any point. Quick and accurate.
2. **Advanced**: User external .strings files to localize your paywall. This is ideal when you are using external localization services.

> **Note:** You can switch between the two methods at any time.

### Simple localization

Simple localization covers all translatable content on your paywall, including text elements and [multiple choice](/docs/dashboard/dashboard-creating-paywalls/paywall-editor-multiple-choice-component) labels. Choice labels are treated the same as text: they appear in the translation panel, are included in CSV exports, and are covered by AI auto-translate.

Once enabled, a new side panel will present to help you localize you paywall:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-simple-ui-localize.jpeg)

You can control localization with the options at the top:

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

Here's what each options does, left-to-right:

| Name          | Description                                                                                                             |
| ------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Localization  | Opens a menu with options to access AI localize settings, switch to advanced localizations, or clear all localizations. |
| Missing Only  | Filters the list to show only keys that have no localized value.                                                        |
| Import/Export | Allows importing or exporting localization data as a `.csv` file.                                                       |
| AI Localize   | Starts the AI-powered localization process for selected keys.                                                           |
| Add Language  | Lets you specify a new language to add for localization.                                                                |

To start the AI localization process, **click** on the **Add Language** button. Then, choose **AI Localize**. Superwall will being to localize each value, while respecting the AI Localize settings in place:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-localize-in-progress.jpeg)

Once finished, you'll see all localized values:

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

> **Tip:** You can click on any value to edit it manually.

#### AI localization settings

You can customize how AI localization behaves by changing the settings in the **AI Localize Settings** menu:

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

The **Formality Style** lets you toggle between formal and informal language. Use the **Localization Style Guide** to provide specific instructions to your brand's voice accurately.

#### Managing languages

To remove or reset a language, **click** on the **three dotts** button next to the language:

![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/pe-editor-localize-remove-reset.png)

To switch back and forth between languages, simply **click** the language at the top:

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

### Advanced localization

After opening the localization panel referenced above, **click** on the **Add Language** button. Choose the language identifier of the locale you're localizing for, and **click** on **Add**:

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

If there are any existing text components on your paywall, all of them with currently *unlocalized* strings will populate in the sidebar (in this example, we're localizing our text for Spanish speakers):

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

Click on the **Localize** button on any of them to enter in localized values. When you're done, click **Save**:

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

From there, go through and localize all of the values. Keep an eye on the progress bar at the top to see how far along you are. Remember to **click** on the **Publish** button at the top right of the editor to commit any localization edits.

> **Tip:** When you are localizing strings, the editor will reflect the locale you're editing against so you
> can see a live preview of how the text will appear.

#### Associating localized strings to new or existing text components

When you add new text components, or need to associate a different localization to an existing one — **click** the **Localize** button when the text component is selected. You can either use an existing localized string, or add a new one by clicking the plus button:

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

When a text component has a localized string attached to it, you'll see the localized string's key in place of the localize button:

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

> **Tip:** You can use variables with localized strings, too. Simply use liquid syntax within your localized
> string values to access any variable. Currently, variables themselves are not able to be
> localized. Learn more about using variables [here](/docs/dashboard/dashboard-creating-paywalls/paywall-editor-variables).

#### Using .strings files

You can download and import .strings files to speed up your translations. This is ideal when you are using external localization services or have a large number of strings to localize.

#### Exporting .strings files

Select **Localization** from the left sidebar, **click** on the **Import** button. Choose "Download template" and the .strings file will be downloaded with all of your currently localized strings:

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

#### Importing .strings files

Select **Localization** from the left sidebar, **click** on the **Import** button.  Choose "Import Strings File" and select your local .strings file to upload. Then, all of the updated values will be reflected in the editor.

### Localizing period lengths

Superwall will automatically localize period lengths for products. Simply use any of the period-based variables in your text:

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

For example:

```liquid
Analyze the math of caffeine this {{ products.primary.period | locale: "en" }}

// English, French, and any or any other localized regions you support...
Analyze the math of caffeine this year
Analysez les chiffres de la caféine ce année
```

You can override and remove auto-localization on specific items by setting a `locale` filter:

```liquid
Analyze the math of caffeine this {{ products.primary.period | locale: “en” }}

// Now, it'll show in English in every language 
Analysez les chiffres de la caféine ce year
```

### Testing localized strings

You can preview how localized strings will appear on device. To set this up:

1. Make sure you've got [in-app previews](/docs/sdk/quickstart/in-app-paywall-previews) configured.
2. Open the paywall editor and click "Preview":
   
![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/localizePreview.jpeg)

3. When it opens, tap the menu located at the top left and choose "Localization":
   
![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/localizeMenuButton.jpg)

4. Then, select the language to display and the preview will reload with it:
   
![](https://claude-centralize-agent-preamble-superwall-docs.staffbar.workers.dev/docs/images/localizeResult.jpg)