Subscription is cancelled (subscription.unsubscribed) fires when a store’s paid subscription to your app is cancelled. It’s the churn signal that arrives before an uninstall. Often the store keeps the app installed on a free plan.
When it fires
Three moments produce it, deduplicated so each cancellation fires once:
- Shopify reports the subscription as cancelled and it was active or frozen immediately before. A cancellation of something already cancelled doesn’t fire it, and neither does an out-of-order webhook describing a state older than the one recorded.
- The store cancels from inside your app, through the SDK’s cancel endpoint. The platform settles the subscription immediately, and the webhook that follows is recognized as a re-delivery.
- The store uninstalls your app while a subscription is live. Shopify cancels the subscription but tears down your webhooks in the same moment, so the platform settles it during uninstall handling and fires the trigger itself. A subscription still waiting for the store’s approval is cancelled at the same moment. It never became active, so it fires nothing. If the store reinstalled before the uninstall reached Meridian, only the subscriptions from before the uninstall are settled, and one created or approved since the reinstall is left alone.
Cancelling is not uninstalling. A cancelled store usually still has your app, still has a live token, and can still be emailed, which is why this trigger is worth a different flow from Uninstalled. On the uninstall path above both triggers fire, and emails addressed to the store are suppressed on this one since the merchant just left; emails to your own team and other actions, like populating a custom field, still run.
What it carries
The store’s variables, plus the subscription payload’s subscription_plan and subscription_status: the plan they’re leaving, which is usually what a save-the-customer email needs to reference.
Building on it
- Send a downgrade or win-back email while the app is still installed.
- Branch on
store_total_revenue so a long-paying customer gets a personal follow-up and a one-month trial doesn’t.
- Set a “churn risk” custom field and let a segment collect them for a campaign later.
Last modified on October 7, 2026