mrr, ltv, and billing attributes, without running your own webhook relay.
What is Superwall?
Superwall runs remotely configured paywalls for iOS, Android, and web apps. It processes each store’s server notifications and sends one consistent webhook for every subscription change.How contacts are matched
Superwall identifies people by user ID, not email. Sequenzy matches each event to a contact in this order:- A contact whose
externalIdis the user ID you pass to Superwall’sidentify(), or the subscription’s original app user ID - The
emailuser attribute on the event - A user ID that is itself an email address
externalId to the same user ID you pass to identify(). Otherwise, set the email as a user attribute in your app:
$SuperwallAlias: users without an email, are skipped and listed as skipped in the integration’s Activity, so you can see which users need an email or externalId.
Name the user with firstName and lastName attributes, or a single name attribute, to fill the contact’s name.
Connecting Superwall
Step 1: Add the webhook in Superwall
- In Sequenzy, go to Settings → Integrations and click Connect next to Superwall
- Copy the Webhook URL from the dialog:
- In Superwall, open Settings → Integrations → Webhooks and add a webhook with that URL
Step 2: Paste the signing secret
- In Superwall, open the webhook you just added and copy its signing secret. It starts with
whsec_ - Paste it into the Signing secret field in the Sequenzy dialog
- Click Connect Superwall
Step 3: Confirm it works
Make a sandbox purchase in your app, then open Activity next to Superwall in Sequenzy. The event appears as skipped with “Sandbox event received. The connection works”. Sandbox purchases never change contacts, tags, or revenue.StoreKit configuration files don’t produce server notifications, so purchases
made with one never reach Superwall’s webhook. Test with a sandbox account
instead.
Tracked events
uncancellation clears a pending cancellation without an event. When a charge fails, a cancellation with cancelReason BILLING_ERROR is not treated as saas.cancelled, because the subscriber didn’t cancel and the store may still recover the payment. An expiration caused by a Google Play pause removes mrr but is not saas.churn. product_change, subscription_paused, and other types are acknowledged without events, so there is no saas.upgrade or saas.downgrade for Superwall.
Every event includes the Superwall context in its properties, for filters and merge tags: productId, store, environment, periodType, appUserId, countryCode, providerEventType (Superwall’s event name, such as renewal), cancelReason (on cancellations), expirationReason (on expirations), isTrialConversion (on renewals), isFamilyShare and offerCode when present, plus amount and currency on purchases.
Synced attributes
Contacts are also tagged
trial, customer, cancelled, or churned as their subscription changes.
How revenue is calculated
- Amounts use the price in the customer’s currency, converted to US dollars. When the currency can’t be converted, Superwall’s own US dollar price is used
- Prices include the store’s commission and tax. They are not your take-home proceeds
- MRR comes from the latest paid period whose interval is known
- MRR is removed at
expiration, not at cancellation, because access continues until the period ends - Refunds lower
ltv
Things to know
- No backfill. Superwall has no export Sequenzy can use, so existing subscribers update as their next event arrives (usually their next renewal). Sync Revenue is not available for Superwall
- Sandbox is ignored. Sandbox events confirm the connection in Activity but never update contacts or revenue
- Intervals are inferred from the length of the purchased period, or from words like
monthly,annual, or1yin the product ID when the period doesn’t tell (trials, introductory prices, unusual lengths). A purchase with no inferable interval counts towardltvbut notmrr - Connect one source per app. If RevenueCat already sends these purchases to Sequenzy, keep one of the two connected, or each purchase counts twice
- One connection per workspace. Reconnecting replaces the signing secret
- Contacts don’t move. If a subscription later resolves to a different contact (a changed email or a contact created afterwards with that
externalId), the earlier contact keeps itsmrrfor that subscription. Callidentify()and set the email before the first purchase to avoid this - Late deliveries never overwrite newer subscription state. A late purchase still counts toward
ltv - Retries are safe. Superwall retries failed deliveries with the same event ID, and Sequenzy records each event once
Troubleshooting
Events are skipped with “No contact matched this Superwall user”
The user has noemail attribute and no contact has their user ID as externalId. Call identify() and setUserAttributes after login, or set the contact’s externalId to the user ID you pass to Superwall. Anonymous users who never log in can’t be matched.