RevenueCat webhook → FCM
RevenueCat cancel and billing-issue recovery
When RevenueCat fires CANCELLATION or BILLING_ISSUE, FixMySub maps the event to your subscriber and sends a push through the FCM project you already run, or an email if you stored the address. The job is simple: get them to update payment or come back before the period ends. PRODUCT_CHANGE is ignored. This is not Apple’s Retention Messaging API, and it is not a second Mixpanel. There is no mobile SDK — webhook in, recovery message out.

The path, in four boxes
- 1
RevenueCat emits
CANCELLATION or BILLING_ISSUE hits your FixMySub webhook URL. No extra RC integration beyond the webhook.
- 2
We match the user
Join on app_user_id / providerId. If that user was registered with a token or email, we can message them.
- 3
Push and/or email
FCM on your Firebase project, or email we send for you. Immediate send, then a 12-hour follow-up push if still unresolved.
- 4
Stop if they recover
RENEWAL or UNCANCELLATION cancels the workflow. No extra “come back” spam after they are already back.
Which RevenueCat events we act on
RevenueCat can emit a lot of types. Recovery only cares about churn-shaped events. Everything else is stored or ignored — including plan switches that are not a cancel.
Send recovery
- CANCELLATIONUser turned off renewal. Ask them to come back before expiration.
- BILLING_ISSUECharge failed. Ask them to update the payment method.
- EXPIRATIONAccess is ending. Last-chance message if you enabled that trigger.
Do not send
- PRODUCT_CHANGEPlan upgrade/downgrade. Not churn. Never a recovery send.
- TESTWebhook test pings. Logged, not messaged.
- NON_RENEWING_PURCHASENot a subscription lifecycle cancel.
What this is not
Not Apple Retention Messaging
Apple’s Retention Messaging API is an App Store sheet you configure in App Store Connect / StoreKit. FixMySub never presents that sheet. We send your push or email after RevenueCat already told you the user cancelled or hit a billing issue.
Not a second Mixpanel
We do not replace product analytics. Events are used to start a recovery workflow, mark recovered / lost, and show you dollars saved. If you want funnels and cohorts, keep Mixpanel (or RevenueCat charts).
Push (FCM)
You upload the Firebase Cloud Messaging service account you already use for the app. FixMySub sends on that project. Payload includes an action of BILLING_ISSUE, CANCELLATION, or EXPIRATION for a deep link you handle.
If the registered user has an email, we send via SendGrid under your from-name. You do not need your own SendGrid account. Use email when the user is not opening the app — complementary to push, not a CDP.
FAQ
Which RevenueCat events trigger a recovery message?
CANCELLATION and BILLING_ISSUE start a recovery workflow (push and/or email, depending on what you enabled and what the user has). EXPIRATION can send a last-chance message. RENEWAL and UNCANCELLATION stop the workflow and mark the user recovered. INITIAL_PURCHASE moves a registered user to subscriber.
Why is PRODUCT_CHANGE ignored?
A product change is a plan switch, not a cancel and not a failed charge. Messaging those users as if they churned is spam. FixMySub does not start recovery on PRODUCT_CHANGE.
FCM vs email — which should I use?
Use FCM when you have a push token: it reaches people still in the app. Use email when you have an address: it reaches people who already left the app. Most setups enable both and let FixMySub pick what the user actually has. You do not need a separate ESP account for email.
Do I need a mobile SDK?
No FixMySub SDK. Point the RevenueCat webhook at FixMySub and register users with a REST call (RevenueCat app_user_id, plus push token and/or email). Your existing Purchases SDK stays as-is.
Point the webhook. Recover the next cancel.
First recovery is free. No card required.
Get started for free