Set up a Stripe subscription canceled alert in Slack
The customer.subscription.deleted event fires when a customer is truly gone. Here's how to turn it into a churn alert your team sees in Slack the instant it happens.
The customer.subscription.deleted event fires when a customer is truly gone. Here's how to turn it into a churn alert your team sees in Slack the instant it happens.
A Stripe subscription canceled alert Slack message is a ping posted the moment a customer's subscription ends for good. ChargeBell listens for Stripe's customer.subscription.deleted event and turns it into a plain-English churn alert — with the plan, the negative MRR delta, and the cancellation reason when Stripe has one — in the channel your team already watches.
In Stripe's own words, customer.subscription.deleted is "sent when a subscription is canceled." The cancellation can come from a direct API call to delete the subscription, or from a subscription with cancel_at_period_end: true reaching the end of its paid-through billing period. Either way, this is a terminal, past-tense event: the subscription is already gone.
This is churn, not a warning
Scheduling a cancellation with cancel_at_period_end: true does NOT fire this event — Stripe fires customer.subscription.updated at scheduling time instead. customer.subscription.deleted only fires later, when the period actually ends. So this event means the customer is truly, finally gone, not "about to churn."
Once it fires, the subscription's status becomes canceled, invoices stop generating, and Stripe records a canceled_at timestamp. The object is largely frozen — you can no longer update it except for its metadata and cancellation details.
Churn is the recurring revenue you lose when customers cancel — the negative side of MRR movement. Net New MRR is New MRR plus Expansion MRR, minus Churn MRR and Contraction MRR, so every deleted subscription is a negative delta subtracted from your growth. The problem is timing: founders often discover cancellations days later inside a Stripe metrics dashboard or a monthly MRR report. By then the save window is closed.
Stripe's Billing analytics do reflect canceled subscriptions in MRR and churn metrics — but those dashboards are polled and aggregated. They don't push a real-time, per-event ping to your team the way a webhook-driven Slack alert does. For the wider setup, see how to monitor Stripe subscriptions in Slack.
Cancellations are both voluntary and involuntary, and the same event fires for both. The subscription object's cancellation_details.reason tells you which — a system reason from the enum cancellation_requested, payment_failed, or payment_disputed. Surfacing that reason in the alert lets your team route each cancellation correctly.
reason=cancellation_requested) — the customer clicked cancel, emailed support, or canceled in the Customer Portal. Route it to a win-back, an exit survey, or a discount offer.reason=payment_failed) — by default Stripe can auto-cancel after up to eight consecutive failed payment attempts (this is configurable in your retry settings). These are often recoverable with a card-update nudge.Stripe doesn't always tell you why
Customer-submitted reasons — cancellation_details.feedback (e.g. too_expensive, missing_features, switched_service) and the free-text comment — only populate if you built a cancel flow that captured them. The raw webhook has no reason otherwise. A good alert exposes whatever Stripe did capture, so it's genuinely useful when it's there.
Raw webhook JSON isn't useful in Slack. A good churn alert answers "who left, what were they paying, and why?" at a glance. ChargeBell computes the negative MRR delta and adds the plan, the customer, and the cancellation reason when Stripe provides one.
😕 Subscription canceled — Acme Corp
Pro Monthly ($49/mo) · MRR delta −$49
Reason: cancellation_requested (customer canceled)
Route it to a win-back or an exit survey.
Involuntary churn looks different, and the reason tells your team it may be worth a win-back:
😕 Subscription canceled — jane@startup.io
Team Annual ($1,200/yr) · MRR delta −$100
Reason: payment_failed (dunning exhausted)
Likely recoverable — nudge a card update to win it back.
MRR-delta numbers here are illustrative. ChargeBell fills them in from the actual subscription so the amount you lost is real.
cancellation_details carries oneConnect Stripe
One-click, read-only OAuth. ChargeBell can see subscription events and can never cancel, refund, or change anything in Stripe.
Connect Slack and pick a channel
Add the app and choose where cancellations should post — a channel like #revenue or #founders works well.
Enable the subscription canceled alert
ChargeBell listens for customer.subscription.deleted and posts with the plan, negative MRR delta, reason, and customer. It's on by default.
Send a test alert
Confirm the message looks right before your next real cancellation lands.
Key takeaways
customer.subscription.deleted fires when a subscription is fully canceled — it's confirmed churn, not a warning.cancel_at_period_end cancellation.cancellation_details.reason distinguishes voluntary from involuntary churn, so you can route each to the right save-flow.Connect Stripe and Slack, pick a channel, and send a test alert. Free plan, no card needed.
customer.subscription.deleted. Stripe sends it when a subscription is canceled — either from a direct API call to delete it, or when a subscription with cancel_at_period_end reaches the end of its billing period. ChargeBell listens for it and posts a Slack alert.
No. This is confirmed, finalized churn — the subscription is already gone. Scheduling a cancellation with cancel_at_period_end fires customer.subscription.updated instead; deleted only fires later, when the paid-through period actually ends.
When Stripe has a reason, yes. ChargeBell surfaces cancellation_details.reason (like cancellation_requested for voluntary cancels or payment_failed for dunning). Customer-submitted feedback only exists if you built a cancel flow that captured it — Stripe's raw webhook has no reason otherwise.
Yes. ChargeBell attaches the negative MRR delta for the canceled subscription, so the recurring revenue you just lost is clear in the Slack message instead of buried in a monthly report.
No. ChargeBell connects with official read-only OAuth. It can see subscription events to build alerts, but it can never cancel, refund, or change anything in your Stripe account.