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:

  1. Go to Dashboard > Subscriptions
  2. Filter by status "Active" and note the count (this is your current active subscribers)
  3. Export your subscription list via Developers > Data exports or use the Stripe API: stripe.subscriptions.list({ status: 'canceled', created: { gte: startOfMonth } })
  4. Count how many subscriptions moved to canceled during the period
  5. 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 (compare previous_attributes.items with 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.

Frequently asked questions

Does Stripe show churn rate in the dashboard?

No. Stripe does not calculate or display churn rate anywhere in the Dashboard. It shows active subscriber counts and MRR trends, but it does not aggregate that data into a churn percentage. You need to calculate churn rate yourself using Stripe data exports, API queries, or a dedicated analytics tool.

What is a good monthly churn rate for SaaS?

For SMB SaaS companies, a healthy target is under 5% monthly logo churn and under 3% is considered great. MRR churn rate matters more than logo churn because losing one $200/month customer hurts more than losing four $10/month customers. Net negative churn, where expansion revenue exceeds churned revenue, is the gold standard.

How do I calculate churn rate from Stripe data?

Logo churn rate equals customers lost in the period divided by customers at the start of the period, times 100. Use stripe.subscriptions.list() filtered by status 'canceled' and created date range to get the numerator. For MRR churn, sum the plan amounts of cancelled subscriptions plus revenue lost to downgrades, divided by starting MRR.

How do I tell voluntary churn from involuntary churn in Stripe?

Check the cancellation_details.reason field on cancelled subscriptions. If reason is 'cancellation_requested,' it is voluntary churn. If reason is 'payment_failed,' it is involuntary churn. This split is critical because they have completely different fixes: voluntary churn needs better product or cancel flows, involuntary churn needs better dunning and payment recovery.

What Stripe webhooks do I need to track churn in real time?

Listen for customer.subscription.deleted (cancellation), customer.subscription.updated (downgrades and status changes), invoice.payment_failed (involuntary churn risk), and customer.subscription.created (new subscriber count). Store these events in a database table and run monthly queries to calculate logo churn, MRR churn, and voluntary vs involuntary split.

Your Stripe has a leak. Let's find it.

Free Revenue Scan: paste your Stripe key, see every dollar you lost in 60 seconds. No card needed.

Run my free scan