RevenueCat
Forward RevenueCat subscription events into SignalSeal.
The RevenueCat integration pushes subscription events - trials, conversions, renewals, refunds, churn - from RevenueCat into SignalSeal, so they get forwarded to your ad networks alongside the events your SDK already reports. You still install the SignalSeal SDK; RevenueCat just covers the subscription side.
An app counts revenue from one subscription source - you can't run RevenueCat and SuperWall at the same time. While RevenueCat is connected, Revenue and Proceeds come from RevenueCat. See Revenue & Proceeds.
Events RevenueCat sends
SignalSeal normalizes every RevenueCat webhook to an rc_* event name. Map any
of these to an ad-network event in Event mapping.
| RevenueCat webhook | SignalSeal event |
|---|---|
| Initial purchase, in a trial/intro period | rc_trial_started |
| Initial purchase, paid | rc_subscription_started |
| Renewal that converts a trial | rc_trial_converted |
| Renewal, paid | rc_renewal |
| Cancellation (auto-renew turned off) | rc_cancellation |
Cancellation with reason CUSTOMER_SUPPORT, or a REFUND | rc_refund |
| Refund reversed | rc_refund_reversed |
| Uncancellation | rc_uncancellation |
| Expiration | rc_expiration |
| Billing issue | rc_billing_issue |
| Product change | rc_product_change |
| Subscription paused | rc_subscription_paused |
| Subscription extended | rc_subscription_extended |
| Non-renewing purchase | rc_non_renewing_purchase |
| Invoice issuance | rc_invoice_issuance |
RevenueCat's TEST, TRANSFER, TEMPORARY_ENTITLEMENT_GRANT,
VIRTUAL_CURRENCY_TRANSACTION and EXPERIMENT_ENROLLMENT events are
acknowledged but not recorded - they carry no revenue SignalSeal can attribute,
and counting them would dilute the verification match rate.
Qualified events
A trial or subscription that starts and is immediately refunded or cancelled
isn't worth optimizing toward. So SignalSeal also emits a derived event 2 hours
after the start, only if no rc_cancellation or rc_expiration arrived in
that window:
| Start event | Emitted 2h later if still active |
|---|---|
rc_trial_started | rc_trial_qualified |
rc_subscription_started | rc_subscription_qualified |
Map the _qualified events when you want campaigns to optimize against trials
and subscriptions that stuck rather than every raw start. (Refunds, billing
issues and pauses don't disqualify - those are separate signals you can map on
their own.)
Set up
Add the integration
In SignalSeal, open your app → Integrations → Add integration → RevenueCat. Copy the webhook URL and secret it gives you.
Add the webhook in RevenueCat
RevenueCat dashboard → your project → Project settings → Integrations → Webhooks:
- URL - the webhook URL from SignalSeal
- Authorization header -
Bearerfollowed by the secret from SignalSeal
Save it.
Link the install to RevenueCat
So SignalSeal can match RevenueCat's events to the right install, your app writes the SignalSeal ID - and the campaign that drove the install - onto the RevenueCat subscriber.
On React Native, install @signalseal/react-native-revenuecat and
call it once at startup:
npm install @signalseal/react-native-revenuecatimport { SignalSealSDK } from '@signalseal/react-native'
import * as SignalSealRevenueCat from '@signalseal/react-native-revenuecat'
const attributes = await SignalSealSDK.getAttributionParams()
await SignalSealRevenueCat.syncAttributes(attributes)This sets signalseal_id plus the campaign, ad set, ad and keyword on
the subscriber, so RevenueCat's own dashboards show which ad drove each
subscription too. Safe to call more than once. Purchases.configure()
must have run first.
On iOS and Android, do the same with RevenueCat's setAttributes using
the values from getAttributionParams() - see the
iOS and Android SDK pages.
Verification
A new integration starts in Verification mode: SignalSeal watches the incoming webhooks and checks they match real installs. After ~24 hours of healthy traffic with a match rate above 50% it auto-promotes to Active and events flow to ad networks.
If the match rate stays low, it's almost always one of:
signalseal_idisn't being set on the RevenueCat subscriber (the step above).- The SignalSeal SDK isn't on every entry point of the app.
- RevenueCat is sending events for users who installed before you added SignalSeal - those can't be matched.
Troubleshooting
- Webhook returns 401 in RevenueCat - the authorization header is wrong.
It must be
Bearer <secret>, not just the secret. - Events arrive but match rate is low - open a recent webhook in the Live
Feed. No install attached means
signalseal_idwasn't set on that user; confirmsyncAttributesruns at startup, before the first purchase. - Duplicate events - RevenueCat re-delivers webhooks it isn't sure landed. SignalSeal dedupes them automatically.