Stripe alert

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.

Updated July 6, 20266 min read

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.

What customer.subscription.deleted means

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.

Why a Stripe subscription canceled alert in Slack matters

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.

  • Real-time churn visibility — every cancellation shows up in #revenue automatically, not on a dashboard you have to remember to check.
  • Faster save-flows — per-cancellation visibility is what lets you run a win-back or a card-update nudge before the churn compounds.
  • The negative MRR delta, attached — the alert carries the exact recurring revenue you just lost, so the impact is obvious.

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.

Two churn types, two save-flows

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.

  • Voluntary (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.
  • Involuntary (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.

What a good subscription canceled alert includes

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.

#revenue
😕
ChargeBellApp

😕 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:

#revenue
😕
ChargeBellApp

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

Fields ChargeBell can include

  • The plan name and price of the canceled subscription
  • The negative MRR delta this cancellation represents
  • The cancellation reason, when Stripe's cancellation_details carries one
  • The customer name or email, when Stripe provides it

How to set up the alert

  1. 1

    Connect Stripe

    One-click, read-only OAuth. ChargeBell can see subscription events and can never cancel, refund, or change anything in Stripe.

  2. 2

    Connect Slack and pick a channel

    Add the app and choose where cancellations should post — a channel like #revenue or #founders works well.

  3. 3

    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.

  4. 4

    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.
  • It fires immediately on a direct cancel, or at period end for a scheduled cancel_at_period_end cancellation.
  • Every cancellation is a negative MRR delta; ChargeBell attaches it to the alert.
  • The cancellation_details.reason distinguishes voluntary from involuntary churn, so you can route each to the right save-flow.
  • A per-event Slack ping beats a lagging dashboard for closing the save window in time.

See every cancellation the moment it happens

Connect Stripe and Slack, pick a channel, and send a test alert. Free plan, no card needed.

Start freeFree plan · no card needed

Frequently asked questions

Which Stripe event fires when a subscription is canceled?

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.

Does this event warn me before a customer cancels?

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.

Can the alert tell me why the customer canceled?

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.

Does the alert show the MRR I lost?

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.

Does ChargeBell need write access to Stripe?

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.