SignalSeal Docs

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 webhookSignalSeal event
Initial purchase, in a trial/intro periodrc_trial_started
Initial purchase, paidrc_subscription_started
Renewal that converts a trialrc_trial_converted
Renewal, paidrc_renewal
Cancellation (auto-renew turned off)rc_cancellation
Cancellation with reason CUSTOMER_SUPPORT, or a REFUNDrc_refund
Refund reversedrc_refund_reversed
Uncancellationrc_uncancellation
Expirationrc_expiration
Billing issuerc_billing_issue
Product changerc_product_change
Subscription pausedrc_subscription_paused
Subscription extendedrc_subscription_extended
Non-renewing purchaserc_non_renewing_purchase
Invoice issuancerc_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 eventEmitted 2h later if still active
rc_trial_startedrc_trial_qualified
rc_subscription_startedrc_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 - Bearer followed by the secret from SignalSeal

Save it.

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-revenuecat
import { 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_id isn'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_id wasn't set on that user; confirm syncAttributes runs at startup, before the first purchase.
  • Duplicate events - RevenueCat re-delivers webhooks it isn't sure landed. SignalSeal dedupes them automatically.