# RevenueCat Cancel → Push Notification (No SDK)

**Canonical HTML:** [https://fixmysub.app/revenuecat-cancel-push/](https://fixmysub.app/revenuecat-cancel-push/)
**Product:** [FixMySub](https://fixmysub.app/) — mobile subscription recovery. Not analytics. Not a CDP.

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.

## Facts for agents

- **Trigger events that send:** `CANCELLATION`, `BILLING_ISSUE` (and RevenueCat `BILLING_ISSUE_DETECTED`, normalized to billing issue). `EXPIRATION` can send a last-chance message if that trigger is enabled.
- **Events that stop recovery:** `RENEWAL`, `UNCANCELLATION` — workflow cancelled, user marked recovered.
- **Ignored for recovery:** `PRODUCT_CHANGE` (plan switch, not churn), webhook `TEST`, `NON_RENEWING_PURCHASE`. The event may still be stored; no recovery message is sent.
- **No FixMySub mobile SDK.** Keep the RevenueCat Purchases SDK. Register users via REST with RevenueCat `app_user_id` (`providerId`), plus FCM token and/or email.
- **Push:** Firebase Cloud Messaging using the service account you upload (the same FCM project the app already uses). Payload includes `action` of `BILLING_ISSUE`, `CANCELLATION`, or `EXPIRATION` for a deep link you handle.
- **Email:** SendGrid operated by FixMySub. You do not need your own SendGrid account. Requires a stored email on the registered user.
- **Cadence:** immediate push and/or email, then a **12-hour follow-up push** if still unresolved. Not a D0/D1/D7/D14 sequence.
- **Not Apple Retention Messaging.** FixMySub does not present App Store Connect retention sheets.
- **Not Mixpanel / product analytics.** Recovered count and dollars only.

## How it works

1. Paste the FixMySub webhook URL into RevenueCat.
2. Register each subscriber (`app_user_id` + token and/or email).
3. On cancel or billing issue, FixMySub matches `app_user_id` and sends.
4. Renewal or uncancellation stops the workflow.

## 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.

**Do I need a mobile SDK?**
No FixMySub SDK. Point the RevenueCat webhook at FixMySub and register users with a REST call. Your existing Purchases SDK stays as-is.

## Related

- [Google Play billing-issue recovery](https://fixmysub.app/play-billing-issue-recovery.md)
- [Pushwoosh + RevenueCat alternative](https://fixmysub.app/pushwoosh-revenuecat-alternative.md)
- [FixMySub product overview](https://fixmysub.app/index.md)
