# 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

# Slack

The Slack integration sends real-time notifications about subscription events to your Slack channels. Get instant updates about new subscribers, cancellations, renewals, and revenue changes with rich, color-coded messages and contextual emojis.

In the **Communication** section within **Integrations**, you can connect your Slack account to Superwall:

![](https://json-ld-superwall-docs-staging.staffbar.workers.dev/docs/images/integrations-slack.jpeg)

### Required Fields

Fill out the following fields and **click** the **Enable Slack** button at the bottom right to save your changes:

![](https://json-ld-superwall-docs-staging.staffbar.workers.dev/docs/images/integrations-config-slack.jpeg)

* **Webhook Url:** Your Slack webhook URL for sending messages to a channel.
* **Include Sandbox:** Whether to include sandbox events in Slack notifications.
* **Event Type:** Type of events to send: revenue only or all lifecycle (includes trials, cancellations).

### Features

* **Real-time Notifications**: Instant Slack messages for subscription events
* **Smart Filtering**: Choose between revenue events only or all subscription lifecycle events
* **Visual Design**: Color-coded messages with contextual emojis for quick scanning
* **Revenue Insights**: See price, proceeds, and currency information at a glance
* **Sandbox Control**: Optional inclusion of sandbox events
* **Rich Context**: Includes user ID, product, country, and transaction details

## Configuration

### Required Settings

| Field             | Description                       | Example                                                |
| ----------------- | --------------------------------- | ------------------------------------------------------ |
| `integration_id`  | Must be set to `"slack"`          | `"slack"`                                              |
| `webhook_url`     | Your Slack incoming webhook URL   | `"https://hooks.slack.com/services/..."`               |
| `include_sandbox` | Whether to include sandbox events | `"Production Only"` or `"Production & Sandbox"`        |
| `event_type`      | Types of events to send           | `"Revenue Events Only"` or `"All Subscription Events"` |

### Example Configuration

```json
{
  "integration_id": "slack",
  "webhook_url": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXX",
  "include_sandbox": "Production Only",
  "event_type": "Revenue Events Only"
}
```

## Setting Up Slack Webhooks

1. **Create Incoming Webhook**:
   * Go to [api.slack.com/apps](https://api.slack.com/apps)
   * Create a new app or select existing
   * Enable "Incoming Webhooks"
   * Add new webhook to workspace
   * Select target channel

2. **Copy Webhook URL**:
   * Format: `https://hooks.slack.com/services/T.../B.../...`
   * Keep this URL secure

3. **Verify Connection**:
   * Trigger a real sandbox transaction (see Testing section below)
   * Verify a message appears in your selected channel

## Event Filtering

### Revenue Events Only

Sends notifications for events with monetary impact:

* ✅ Initial purchases (paid)
* ✅ Renewals
* ✅ Refunds (negative amounts)
* ✅ Trial/intro conversions (when paid)
* ❌ Cancellations (no immediate revenue impact)
* ❌ Expirations
* ❌ Billing issues

### All Subscription Events

Sends notifications for all lifecycle events:

* ✅ All revenue events (above)
* ✅ Trial starts
* ✅ Cancellations
* ✅ Uncancellations
* ✅ Expirations
* ✅ Billing issues
* ✅ Product changes
* ✅ Subscription pauses

## Message Format

### Visual Indicators

Messages use colors and emojis for quick scanning:

#### Colors

* 🟢 **Green** (#36a64f): Positive events (purchases, renewals, uncancellations)
* 🔴 **Red** (#FA6A6A): Negative events (cancellations, expirations, refunds)
* ⚫ **Gray** (#666666): Neutral events (product changes, pauses)

#### Emojis by Event Type

**Trial Events:**

* 🤩 Trial start
* 💰 Trial conversion
* 😞 Trial cancelled
* 😞 Trial expired
* 🤩 Trial uncancelled
* 🤬 Trial refunded

**Intro Offer Events:**

* 💰/🤩 Intro offer start
* 💰 Intro offer conversion
* 😞 Intro offer cancelled
* 😞 Intro offer expired
* 🤩 Intro offer uncancelled
* 🤬 Intro offer refunded

**Subscription Events:**

* 💰 New subscriber
* 💰 Renewal
* 😞 Subscription cancelled
* 😞 Subscription expired
* 🤩 Subscription uncancelled
* 🤬 Subscription refunded

**Special Events:**

* 😵‍💫 Product change
* 🫠 Billing issue
* ⏸️ Subscription paused
* 💸 Non-renewing purchase

### Message Structure

Each Slack message includes:

```
[Emoji] [Event Description]
━━━━━━━━━━━━━━━━━━━━━
💵 $9.99 USD (Proceeds: $6.99)
📦 com.example.premium.monthly
🌍 United States
👤 User123
🏪 APP_STORE
🔗 Transaction: 700001234567890
```

### Field Descriptions

| Field           | Description           | Example                     |
| --------------- | --------------------- | --------------------------- |
| **Header**      | Event type with emoji | "💰 renewal"                |
| **Price**       | Transaction amount    | "$9.99 USD"                 |
| **Proceeds**    | Net after fees        | "Proceeds: $6.99"           |
| **Product**     | Product identifier    | "com.example.premium"       |
| **Country**     | User's country        | "United States"             |
| **User**        | User identifier       | "User123" or transaction ID |
| **Store**       | Payment provider      | "APP\_STORE"                |
| **Transaction** | Transaction ID        | "700001234567890"           |

## Sandbox Handling

### Production Only

* Production events → Sent to Slack
* Sandbox events → **Skipped**

### Production & Sandbox

* Production events → Sent to Slack
* Sandbox events → Sent to Slack with 🧪 indicator

Sandbox events include a note in the message to differentiate from production.

## Special Event Handling

### Refunds

Identified by negative price values:

* Header changes to "refunded \[type]"
* Emoji changes to 🤬
* Color remains red
* Shows negative amount

### Family Sharing

Events with `isFamilyShare: true`:

* Shows shared subscription indicator
* Price may be $0 for family members
* Original purchaser shows full price

### Trial Conversions

Renewals with `isTrialConversion: true`:

* Header shows "trial conversion"
* Indicates successful trial-to-paid transition
* Always green/positive color

### Product Changes

Shows when users switch plans:

* Displays old and new product IDs
* Neutral gray color
* May have $0 price

## Use Cases

### Revenue Monitoring

Track real-time revenue with "Revenue Events Only":

* Monitor daily subscription revenue
* Get alerts for high-value purchases
* Track refund activity
* Celebrate trial conversions

### Customer Success

Track lifecycle with "All Subscription Events":

* Monitor cancellation trends
* Identify billing issues quickly
* Track trial-to-paid conversion
* Spot at-risk subscribers

### Team Celebrations

Share wins with your team:

* New subscriber notifications
* Trial conversion celebrations
* Renewal milestones
* Recovery from cancellations

## Best Practices

1. **Dedicated Channels**: Create specific channels for different event types
2. **Filter Appropriately**: Use "Revenue Only" for finance, "All Events" for customer success
3. **Include Context**: User IDs help connect events to support tickets
4. **Monitor Patterns**: Watch for unusual cancellation or refund spikes
5. **Sandbox Separation**: Consider separate webhooks for production vs testing

## Troubleshooting

### Messages Not Appearing

1. **Check Webhook URL**: Ensure URL is valid and not revoked
2. **Check Channel**: Verify bot has access to target channel
3. **Check Filters**: Confirm event type and sandbox settings
4. **Check Slack Limits**: Webhook rate limits (1 per second)

### Incorrect Information

1. **Check Timezone**: Timestamps are in UTC
2. **Check Currency**: Amounts in USD, original currency shown
3. **Check User ID**: Falls back to transaction ID if not available

### Verify the Integration

1. Trigger a sandbox transaction in your app:
   * iOS: Use TestFlight with a sandbox Apple ID. StoreKit Configuration files do not generate App Store Server Notifications, so webhooks and downstream integrations won't fire.
   * Google Play: Use license test accounts to perform sandbox purchases.
   * Stripe: Use Stripe Test Mode to create sandbox transactions.
2. Confirm the message arrives in the configured Slack channel.
3. If you enabled Production & Sandbox, sandbox messages include an 🧪 indicator.

## Rate Limits

Slack incoming webhooks have a rate limit of 1 message per second. The integration sends events individually as they occur, typically well within this limit.

## Security Considerations

* **Webhook URLs are sensitive**: Treat like passwords
* **Rotate if compromised**: Generate new webhook URL if leaked
* **Channel permissions**: Ensure appropriate team members have access
* **PII considerations**: User IDs may be visible to channel members

## Advanced Configuration

### Multiple Channels

Set up multiple integrations for different channels:

* Revenue events → #revenue-alerts
* Cancellations → #customer-success
* All events → #subscription-monitoring

### Custom Filtering

While the integration offers two preset filters, you can:

* Use Slack workflows for additional filtering
* Set up multiple integrations with different settings
* Use Slack's notification preferences per channel

## Message Examples

### New Paid Subscription

```
💰 new subscriber
━━━━━━━━━━━━━━━━━━━━━
💵 $49.99 USD (Proceeds: $34.99)
📦 com.example.premium.yearly
🌍 United States
👤 user_abc123
🏪 APP_STORE
🔗 Transaction: 700001234567890
```

### Trial Start

```
🤩 Trial start
━━━━━━━━━━━━━━━━━━━━━
💵 $0.00 USD
📦 com.example.premium.monthly
🌍 Germany
👤 user_xyz789
🏪 PLAY_STORE
🔗 Transaction: GPA.1234-5678-9012
```

### Refund

```
🤬 refunded subscription
━━━━━━━━━━━━━━━━━━━━━
💵 -$9.99 USD (Proceeds: -$6.99)
📦 com.example.premium.monthly
🌍 United Kingdom
👤 user_def456
🏪 STRIPE
🔗 Transaction: sub_1234567890
```

### Billing Issue

```
🫠 Billing issue
━━━━━━━━━━━━━━━━━━━━━
💵 $0.00 USD
📦 com.example.premium.monthly
🌍 Canada
👤 user_ghi789
🏪 APP_STORE
🔗 Transaction: 700009876543210
❗ Payment failed - subscription at risk
```