# 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

# Reddit Ads

Run Reddit ads with Superwall as your MMP: send conversions to your Reddit Pixel, attribute installs to campaigns, and import ad spend.

The Reddit Ads integration makes Superwall your [mobile measurement partner (MMP)](/docs/integrations/mmp) for Reddit campaigns. Superwall sends your app's events to your Reddit Pixel through Reddit's Conversions API, generates the links you put in your ads, attributes installs to the campaign, ad group, and ad that drove them, and imports your ad spend daily. Spend and results show up in [charts](/docs/dashboard/charts) as ROAS, cost per trial, and cost per paid user.

> **Note:** Reddit Ads is in **beta**. If the **Reddit** card under **Integrations** >
> **Performance marketing** shows **Coming soon**, click **Request access** and
> we'll turn it on for you.

> **Note:** This page describes the new dashboard at
> [app.superwall.com](https://app.superwall.com).

## Requirements

* An iOS app on [SuperwallKit](/docs/ios) 4.16.0 or later, or an Android app on the [Superwall Android SDK](/docs/android) 2.9.0 or later. For Expo and Flutter versions, see the [Meta Ads requirements](/docs/integrations/meta-ads#requirements).
* A Reddit ad account, a Reddit Pixel in [Reddit Events Manager](https://ads.reddit.com/events-manager), and a Reddit login with access to both. You also need admin access to the Reddit business that owns the pixel, because only business admins can generate a Conversions API token.
* [Revenue tracking](/docs/dashboard/dashboard-settings/overview-settings-revenue-tracking) configured for your app. The Performance marketing cards stay locked until it is.
* If you sell outside of Superwall paywalls, enable [observer mode](/docs/ios/guides/advanced/observer-mode) so transactions are tracked.

> **Warning:** Attribution only applies to new installs. The SDK matches an install once,
> shortly after first launch, and only when that first launch happens within 24 hours of the ad click on iOS, or 7 days on Android. Test with a fresh install.

## Step 1: Connect Reddit

## Open the integration

In your app's dashboard, go to **Integrations**, find **Performance marketing**, and click the **Reddit** card.

## Connect your Reddit account

![The Reddit page before connecting, showing Not connected and the Connect Reddit button](https://superwall.com/docs/images/reddit-connect.jpg)
Click **Connect Reddit** and sign in to Reddit in the popup that opens, with the Reddit account that manages your ads. If nothing opens, allow popups for Superwall and try again. In Chrome and other Chromium browsers, the popup can stop at &#x2A;*Connecting Reddit…**. If it does, close it and connect from Safari instead.The connection only asks to read your ads. Superwall uses it to list your ad accounts and pixels and to import ad spend. Once connected, the page header shows **Connected** with your Reddit username, as `u/<username>`:
![The Reddit page once connected, with the Reddit username, Reconnect and Disconnect, and the Ad account and Configuration cards](https://superwall.com/docs/images/reddit-connected.jpg)

## Step 2: Choose your ad account

On the Reddit page in Superwall, under **Ad account**, pick the account your campaigns run in. Each account shows its name, with its business, currency, and ID below it. The choice is saved as soon as you make it, without saving anything else on the page.

Superwall imports daily spend from this account into your charts. It never imports spend from before you connected Reddit.

![The Ad account picker open, showing an ad account with its business, currency, and ID](https://superwall.com/docs/images/reddit-ad-account.jpg)

If your Reddit account has no ad accounts yet, create one in Reddit Ads, then reload the page.

## Step 3: Choose your pixel and Conversions API token

Still on the Reddit page in Superwall, the **Configuration** card sets where your conversion events go. You'll need one thing from Reddit for it, an access token:

## Choose the pixel

In Superwall, under **Pixel**, pick the Reddit Pixel that should receive your events. The list shows the pixels of the ad account you chose. If Superwall can't find any, paste the pixel ID from Reddit Events Manager instead.
![The Configuration card with the pixel picker open, listing pixels by name and ID, above the Conversions API access token field](https://superwall.com/docs/images/reddit-configuration.jpg)

## Generate a Conversions API access token

In Reddit: open [Reddit Events Manager](https://ads.reddit.com/events-manager), click **Conversions API**, and click **Generate Access Token**. Copy the token.Back in Superwall, paste it into **Conversions API access token**.
![The Conversions API page in Reddit Events Manager with the Generate Access Token button](https://superwall.com/docs/images/reddit-capi-token.jpg)

## Save

In Superwall, click **Save** (**Update** when editing). Superwall checks the pixel and token with Reddit and won't save a pair Reddit rejects, showing you why instead. If the check can't reach Reddit, it saves anyway. The check shows up once in Reddit's **Events overview** as a custom event, `superwall_validate`. You can ignore it.Saving the pixel and token for the first time also turns on the recommended events, so Superwall starts sending them to Reddit right away. You can change them under **Events to send**.

Once saved, the token is never shown again. The page only shows that a token is configured, with its last four characters. To replace it, click **Edit configuration** and paste a new one.

![The Reddit page after saving, with the ad account chosen, the pixel ID and masked token under Configuration, and the recommended events turned on under Events to send](https://superwall.com/docs/images/reddit-configuration-saved.jpg)

## Step 4: Choose events to send

In Superwall, under **Events to send**, choose which Superwall events to send to your Reddit Pixel and the Reddit event each one is sent as. Each event can be sent as one of Reddit's standard events (**Purchase**, **Lead**, **Sign Up**, **Add to Cart** or **View Content**) or as a custom event you name, up to 64 characters. A custom event with no name blocks saving.

| Dashboard label     | Superwall event                | Default Reddit event             | On by default |
| ------------------- | ------------------------------ | -------------------------------- | ------------- |
| Paywall open        | `paywall_open`                 | View Content                     | Yes           |
| Transaction start   | `transaction_start`            | Add to Cart                      | Yes           |
| Transaction abandon | `transaction_abandon`          | Custom: `sw_transaction_abandon` | No            |
| Free trial start    | `freeTrial_start`              | Lead                             | Yes           |
| Subscription start  | `subscription_start`           | Purchase                         | Yes           |
| One-time purchase   | `nonRecurringProduct_purchase` | Purchase                         | Yes           |

Reddit has no trial event, so trials are sent as **Lead** by default.

Your event selection is saved with the **Save changes** button at the bottom of the page.

### What Superwall sends

Events are sent for every user, not just users attributed to your ads. When a user's install matched a Reddit ad click, their events also carry Reddit's click ID (`rdt_cid`), which gives Reddit the strongest match.

Each event carries an ID that lets Reddit drop duplicates. Transaction Start and Transaction Abandon carry the product's price and currency. Subscription Start and One-Time Purchase carry the purchase's value and currency, and the transaction ID. Events with a product also carry the product ID.

A free trial converting to paid is sent as Subscription Start. Ordinary renewals and sandbox events are never sent. Reddit rejects events older than 7 days, so Superwall doesn't send them.

To help Reddit match users, events also carry the user's ID, email address, phone number and advertising ID, hashed, when they're available, along with the IP address and user agent.

* **iOS**: the IDFA is only sent when App Tracking Transparency isn't denied or restricted.
* **Android**: the Google advertising ID (`aaid`) is sent.
* **Tracking opt-out**: if the user had opted out of ad tracking when they installed the app, no advertising ID is sent. On iOS, that changes if they later allow tracking through App Tracking Transparency.

### Consent

SuperwallKit 4.18.0 and later reports the user's ad consent. To set it, see [Consent](/docs/integrations/google-ads#consent). Superwall applies it like this:

* When a user has denied ad personalization, their advertising IDs are dropped.
* When a user has withheld consent to share ad user data, their events are only sent when they came from a Reddit ad click, with no user data: just the click ID and the event's own details, such as value and currency.

## Step 5: Send test events

## Save your changes

In Superwall, click **Save changes**. Test events are sent from your *saved* selection, so save first if you've just changed which events are ticked.

## Add a test ID (optional)

In Reddit Events Manager, open **Event testing**, choose your pixel, and copy the test ID under **Test Conversions API**. Back in Superwall, paste it into &#x2A;*Test ID (optional)**. With it, test events show on that page and stay out of your reporting.Without a test ID, test events count as real events.

## Send test events

In Superwall, click **Send test events**. Superwall sends one test event per selected event to your pixel. They appear in Events Manager within a few minutes. If Reddit rejects one, the dashboard shows why.
![The Test ID field filled in, with a message under it saying the test event was sent and appears in Events Manager within a few minutes](https://superwall.com/docs/images/reddit-test-event-sent.jpg)
In Reddit, they show under **Events received** on the **Event testing** page:
![Reddit](https://superwall.com/docs/images/reddit-test-event-received.jpg)

## Step 6: Create your ad link

In Superwall:

## Add a link

On the Reddit page, scroll to **Ad links** and click **Add ad link**. The first link is in English and saves right away.

## Copy the link

Click the copy button in the **Website URL** column.

## Step 7: Put the link in a Reddit ad

In Reddit:

## Start a Sales campaign

Open [Reddit Ads Manager](https://ads.reddit.com). In the left menu, click **Create Campaign**. Choose **Sales**, then click **Continue**.
![Reddit](https://superwall.com/docs/images/reddit-campaign-objective.jpg)
Don't choose **App promotion**. Superwall's ad links are website links, and **Sales** optimizes for the events Superwall sends to your pixel. Leave **Use a catalog** off. If Reddit shows **Set Up Conversion Tracking**, skip it: Superwall already sends your events.

## Choose Standard

Reddit selects **Max** by default. Choose **Standard**, then click **Continue**. Don't use **Max**: Standard lets you pick the pixel and the event yourself.
![Reddit](https://superwall.com/docs/images/reddit-campaign-type.jpg)

## Set the budget and pixel

Name the campaign, then under **Campaign budget & schedule**, set your budget and start date.Under **Measurement & optimization**, set **Reddit pixel** to your pixel. Set **Sales goal** to the event you want to optimize for, such as **Purchase**. Don't leave it on **Clicks**.
![Reddit](https://superwall.com/docs/images/reddit-campaign-pixel-goal.jpg)
> **Note:** **Purchase is greyed out?** Reddit only offers events your pixel has received. Wait until they show up in Reddit **Events Manager** > **Events overview**, with your pixel picked next to the title. Test events sent with a test ID don't count.

Under **Bidding**, leave **Lowest cost** selected. Click **Continue**.

## Set up the ad group

Reddit opens the ad group next. Set up its audience and placements however you like. Nothing here is specific to Superwall. Click **Continue**.

## Paste the link

In the ad, paste the Superwall link into **Destination URL**. Don't change it.

## Publish

Click **Publish**. Your campaign shows up under **Campaigns** in Reddit's **Dashboard**. Its status may say **Processing** at first.
![Reddit](https://superwall.com/docs/images/reddit-campaign-processing.jpg)

> **Warning:** Deleting a link immediately breaks any live ads pointing at it.
> Keep links in place while campaigns are running.

## Reconnecting and disconnecting

In Superwall, open **Integrations** > **Reddit**. **Reconnect** and **Disconnect** are at the top, next to **Documentation**.

![The top of Superwall](https://superwall.com/docs/images/reddit-reconnect-disconnect.jpg)

* **Reconnect** signs in to Reddit again. Use it if Reddit stops accepting the connection. With the same Reddit account, your setup is kept. With a different one, you choose the ad account again.
* **Disconnect** removes your ad account, pixel, token, and events from Superwall, and stops sending events and importing spend. It asks first. To connect again later, you'll need a new token from Reddit's **Conversions API** page.

## Verify it's working

* **In Reddit:** test events appear on your pixel's **Event testing** page after you click **Send test events** with a test ID. Real events appear in **Events overview**, with your pixel picked next to the title.
* **In Superwall:** once ads run, attributed users appear under **Users** with `acquisition_` user attributes set and an `attribution_match` event in their event stream. See [How attribution works](/docs/integrations/meta-ads#how-attribution-works).
* **In Superwall:** the **Advertising** charts fill in after spend imports from your Reddit ad account, which happens daily.

## Charts

Superwall imports your Reddit campaign spend once a day, starting from the day you connected Reddit. To see it, click **Charts** in Superwall's sidebar and open the **Advertising** charts: [Ad Spend](/docs/dashboard/charts/ad-spend), [ROAS](/docs/dashboard/charts/roas), [CPM](/docs/dashboard/charts/cpm), [CPT](/docs/dashboard/charts/cpt), [CPP](/docs/dashboard/charts/cpp), [Blended CPT](/docs/dashboard/charts/blended-cpt), and [Blended CPI](/docs/dashboard/charts/blended-cpi).

Each import re-reads the last 7 days, so Reddit's later corrections show up. Days are counted in UTC, so a day's spend can differ slightly from Reddit's own reports if your ad account uses another time zone.

To see revenue by campaign, break down a revenue chart by **Acquisition Network** or **Acquisition Campaign**. Installs that didn't come from an ad show as `Organic`.

## Troubleshooting

### Connecting hangs on "Connecting Reddit…"

In Chrome and other Chromium browsers, the sign-in popup can stop there. Close the popup and click **Connect Reddit** in Superwall again, from Safari. This also applies to **Reconnect**.

### Reddit rejected my pixel or token

Superwall's Reddit page shows why. Check that the token and pixel belong to the same Reddit business. In Reddit Events Manager, generate a new token on the **Conversions API** page, then paste it into Superwall again.

### No ad accounts or pixels are listed

* If no ad accounts are listed, create one in Reddit Ads, then reload Superwall's Reddit page.
* Make sure the Reddit account you connected has access to the ad account. To use another account, click **Reconnect** in Superwall.
* If no pixels are listed, copy the pixel ID from Reddit Events Manager and paste it into **Pixel** in Superwall.

### Reddit no longer accepts the connection

In Superwall's Reddit page, click **Reconnect** and sign in again. If you connect with the same Reddit account, your setup is kept.

### Installs aren't being attributed

* The app must ship SuperwallKit 4.16.0 or later on iOS, or Android SDK 2.9.0 or later, and the install must be new. Delete and reinstall the app to test.
* The app must be opened for the first time within 24 hours of the ad click on iOS, or 7 days on Android.
* `SuperwallOptions.eventTrackingBehavior` must not be set to `.none`. That setting disables install matching entirely.
* The ad link must be saved, and pasted into the ad unchanged.

### Events aren't showing in Reddit

* In Reddit's **Events overview**, check that the dropdown next to the title shows the pixel you chose in Superwall. It also lists your ad account's default pixel, which won't have Superwall's events.
* Sandbox events are never sent. Use **Send test events** in Superwall to check your setup.
* Events older than 7 days are never sent, because Reddit rejects them.
* In Superwall, click **Edit configuration** and save again to check the pixel and token still work.

### No transaction or purchase events

* If you sell outside of Superwall paywalls, enable [observer mode](/docs/ios/guides/advanced/observer-mode).
* Check that [revenue tracking](/docs/dashboard/dashboard-settings/overview-settings-revenue-tracking) is configured. Subscription events come from your store's server notifications (App Store or Google Play).