How to Track Churn in Stripe
Track churn in Stripe by listening to customer.subscription.deleted and invoice.payment_failed webhooks, then calculating monthly logo churn and revenue churn separately. Healthy SMB SaaS targets under 5% monthly logo churn. Split voluntary from involuntary churn to know whether to fix your product or your payment recovery.
Stripe doesn't show you a churn rate. There's no "Churn" tab in the Dashboard. Stripe shows you subscriber counts, MRR, and subscription statuses, but it doesn't calculate the percentage of customers or revenue you're losing each month. That's a problem because churn rate is the single most important metric for a subscription SaaS. You need to track both logo churn (customers lost) and revenue churn (dollars lost), and split voluntary from involuntary churn to know whether to fix your product or your payment recovery. Here's how to calculate and track churn using Stripe data. See the State of Stripe SaaS Churn report for current benchmarks.
Why Stripe doesn't show churn
Stripe is a payments processor, not an analytics platform. It tracks individual subscriptions, invoices, and charges. It knows when a subscription moves from active to canceled. But it doesn't aggregate that data into a churn rate because churn rate depends on how you define it: do you count trial-to-paid conversions? Do you count plan switches as churn? What's your time window? These are product decisions, not payment decisions, and Stripe leaves them to you.
Stripe's "Revenue and Finance Automation" section in the Dashboard shows some subscriber metrics, but it's limited. You can see active subscriber counts over time and MRR trending up or down. You can't see churn rate, voluntary vs involuntary split, cohort analysis, or churn by plan/segment.
Manual churn calculation
You can calculate churn rate manually using Stripe's data exports. Here's the formula and the step-by-step process:
Logo churn rate (customer churn)
Logo churn measures how many customers you lost as a percentage of total customers:
Logo Churn Rate = (Customers lost in period / Customers at start of period) × 100
Example:
Start of month: 200 active subscriptions
End of month: 188 active subscriptions (12 cancelled or failed)
Logo churn rate: (12 / 200) × 100 = 6%To get these numbers from Stripe:
- Go to Dashboard > Subscriptions
- Filter by status "Active" and note the count (this is your current active subscribers)
- Export your subscription list via Developers > Data exports or use the Stripe API:
stripe.subscriptions.list({ status: 'canceled', created: { gte: startOfMonth } }) - Count how many subscriptions moved to
canceledduring the period - Divide by the count at the start of the period
MRR churn rate (revenue churn)
MRR churn is more important than logo churn because it accounts for the revenue impact. Losing one $200/mo customer hurts more than losing four $10/mo customers:
MRR Churn Rate = (MRR lost to cancellations + MRR lost to downgrades) / MRR at start of period × 100
Example:
MRR at start of month: $15,000
MRR lost to cancellations: $800
MRR lost to downgrades: $200
MRR churn rate: ($800 + $200) / $15,000 × 100 = 6.67%Stripe doesn't calculate MRR churn for you. You need to compute it from subscription data. The API approach: list all subscriptions that were cancelled in the period, sum their plan amounts, then add the delta from any downgrades (subscriptions that switched to a lower-priced plan).
Voluntary vs involuntary split
Not all churn is the same. You need to separate voluntary churn (customer chose to cancel) from involuntary churn (payment failed and all retries were exhausted). They have completely different causes and solutions.
- Voluntary churn; the customer clicked "Cancel." You fix this with better product, cancel flows, retention offers.
- Involuntary churn. payment failed and wasn't recovered. You fix this with dunning, pre-dunning, card updaters.
To split them in Stripe, check the cancellation_details.reason field on cancelled subscriptions. If reason is "cancellation_requested", it's voluntary. If reason is "payment_failed", it's involuntary. You can also check the cancellation_details.feedback field for the customer's selected reason (if you configured reasons in the Customer Portal).
Build a churn dashboard with webhooks
For real-time churn tracking, set up webhook listeners and store events in your database. Here are the key events:
customer.subscription.deleted; a subscription was cancelled. Record the customer ID, plan amount, cancellation reason, and timestamp.customer.subscription.updated; a subscription changed. Check for plan downgrades (compareprevious_attributes.itemswith current items) and status changes.invoice.payment_failed; a payment attempt failed. Track this to measure involuntary churn risk.customer.subscription.created; a new subscription started. Track this to measure your starting subscriber count each period.
Store these events in a database table. Run a monthly query to calculate:
-- Monthly churn rate from webhook events
SELECT
DATE_TRUNC('month', cancelled_at) AS month,
COUNT(*) AS churned_customers,
SUM(plan_amount) AS churned_mrr,
COUNT(*) FILTER (WHERE reason = 'cancellation_requested') AS voluntary,
COUNT(*) FILTER (WHERE reason = 'payment_failed') AS involuntary
FROM subscription_events
WHERE event_type = 'cancelled'
GROUP BY DATE_TRUNC('month', cancelled_at)
ORDER BY month DESC;Build time: 10-20 hours for the webhook handler, database schema, and a basic dashboard. This gives you real churn data but no automatic analysis or recommendations.
Key metrics to track
Once you have the raw data, track these metrics monthly:
- Logo churn rate. percentage of customers lost. Good: under 5%. Great: under 3%.
- MRR churn rate. percentage of revenue lost. More important than logo churn. Watch for high-value customer losses.
- Voluntary/involuntary split. tells you where to focus. High involuntary churn means add dunning. High voluntary churn means fix product or add retention flows.
- Net MRR churn. gross MRR churn minus expansion revenue. If negative, you have net negative churn (the gold standard).
- Churn by plan. are cheaper plans churning faster? That might mean your free-to-paid conversion is attracting the wrong customers.
- Churn by cohort. are older customers stickier? Month-1 churn is always highest. If month-6+ churn is still high, you have a retention problem.
Tool-assisted churn tracking
If building a churn dashboard from Stripe webhooks sounds like more work than it's worth, dedicated tools do this automatically. SaveMRR's Revenue Scan connects to your Stripe account and generates a complete churn analysis: logo churn, MRR churn, voluntary/involuntary split, churn by plan, cohort analysis, and actionable recommendations. The Revenue Scan is free. You connect your Stripe account (read-only mode) and get the full report in minutes.
Beyond the initial scan, SaveMRR's dashboard provides ongoing churn tracking. It monitors your Stripe webhooks in real time and updates your metrics automatically. You see your churn rate, recovery rate, save rate (from cancel flow offers), and revenue trends without writing any SQL or building any dashboards.
Next step
You can't improve what you can't measure. SaveMRR's free Revenue Scan gives you a complete churn analysis of your Stripe data in 2 minutes. It shows your exact churn rate, voluntary vs involuntary breakdown, revenue at risk, and specific recommendations for your situation. No code changes required. Start by understanding the problem, then decide how to fix it.
