Stripe Webhook Event Decoder for Churn
Pick a Stripe webhook event. See what it actually means for churn, whether to email the customer, and how ChurnNote handles it automatically.
Cancellation
Failed payment
Lifecycle
Refund
customer.subscription.deleted
Churn event- What happened
- The subscription was permanently cancelled. Either the customer cancelled it themselves, an admin cancelled on their behalf, or Stripe auto-cancelled after exhausting smart retries on a failed payment. The customer no longer has access at end of the current period (unless cancellation was set to be immediate).
- Should you email the customer?
- Send a founder-style cancellation email within 24 hours asking why they left. Avoid generic 'sorry to see you go' templates. Skip this if the cancellation was driven by a failed payment (use a dunning email instead).
- Should this be treated as churn?
- Voluntary churn if the cancel originated from the customer. Involuntary churn if Stripe auto-cancelled after failed retries. Inspect the cancellation_details object to tell them apart.
- What ChurnNote does
- Detects customer.subscription.deleted, looks at cancellation_details.reason to distinguish voluntary from involuntary, and sends a founder-style email from your inbox asking for feedback. Captures and groups replies.
Why "the customer cancelled" is more than one event
Most founders building their own churn tracking listen for customer.subscription.deleted and call it done. That misses two important moments: the scheduled cancel (when cancel_at_period_end flips to true on customer.subscription.updated) and the pre-churn risk (invoice.payment_failed).
The scheduled cancel is the right moment to ask for feedback, because the customer just made the decision and still remembers why. By the time the subscription is fully deleted at the end of the period, they've moved on.
The pre-churn risk is the cheapest churn to fix. Failed payments that get a fast, code-aware email recover at 50-70 percent. Failed payments that get nothing or a generic email recover at 15-25 percent.
Frequently Asked Questions
Which Stripe webhook events should I listen to for churn tracking?
At minimum: customer.subscription.deleted, customer.subscription.updated (for cancel_at_period_end transitions), invoice.payment_failed, invoice.payment_action_required, and invoice.payment_succeeded (to close the recovery loop). For full coverage, add customer.subscription.paused/resumed and charge.dispute.created.
What's the difference between subscription.deleted and cancel_at_period_end?
cancel_at_period_end being true means the customer has scheduled a cancellation. The subscription is still active and they keep access until the end of the current period. customer.subscription.deleted fires later, when the period actually ends and the subscription is fully cancelled. The right moment to ask for feedback is when cancel_at_period_end flips to true, not weeks later when it deletes.
Is invoice.payment_failed the same as churn?
No, it's pre-churn risk. The customer's subscription is still active. Stripe will retry the charge automatically (smart retries) and only auto-cancel the subscription if all retries fail. The window between payment_failed and the eventual subscription_deleted is where dunning emails actually recover revenue.
How do I tell voluntary churn from involuntary churn?
On customer.subscription.deleted, inspect cancellation_details.reason. 'cancellation_requested' = voluntary (the customer chose to cancel). 'payment_failed' = involuntary (Stripe auto-cancelled after retries). 'cancellation_at_period_end' = voluntary, scheduled. They need very different follow-up emails.
Does ChurnNote require me to write any webhook code?
No. ChurnNote subscribes to the relevant webhooks on its own. You add a Stripe connection in the dashboard and it starts capturing events, sending decline-aware dunning emails, and surfacing feedback from cancelled customers automatically.
How ChurnNote helps
Building your own churn pipeline from Stripe webhooks is a 2-week side quest. ChurnNote ships it for you in 5 minutes.
ChurnNote connects to Stripe or Lemon Squeezy and automatically captures cancellation reasons, recovers failed payments, and queues win-back emails. So you stop losing revenue silently.
Start recovering churnNext step
Drill down into decline codes
invoice.payment_failed events carry a decline_code. The Decline Code Explainer tells you what each one means and how to recover.