Analytics

How to Analyze Churn in Stripe: The Complete Guide for SaaS Founders

Stripe is great at processing payments. It's terrible at showing you where your revenue is leaking. Here's how to extract the churn insights Stripe hides from you.

Analyze churn in Stripe by tracking 5 key webhooks: customer.subscription.deleted, invoice.payment_failed, customer.subscription.updated (downgrades), charge.dispute.created, and customer.subscription.trial_will_end. Stripe's dashboard doesn't split voluntary vs. involuntary churn. You need webhook data or a dedicated analytics tool to see the full picture.

February 28, 202611 min readKailesk Khumar
How to Analyze Churn in Stripe: The Complete Guide for SaaS Founders

Stripe Isn't Telling You the Full Story

Stripe is the gold standard for SaaS billing. But here's what most founders don't realize: Stripe's dashboard is designed for payment processing, not retention analytics. To truly understand your churn, you need to [track churn in Stripe](/how-to-track-churn-in-stripe) with the right setup.

Stripe can tell you:

  • ✓ How much revenue you processed
  • ✓ How many subscriptions you have
  • ✓ Your MRR (basic calculation)

Stripe cannot easily tell you:

  • ✗ Your real churn rate (voluntary vs involuntary breakdown)
  • ✗ How much MRR you're losing to failed payments specifically
  • ✗ Which customers are at risk of churning
  • ✗ What cancellation reasons are most common
  • ✗ How your churn compares to benchmarks
  • ✗ The revenue impact of downgrades vs cancellations

This gap is a massive blind spot. You're flying your SaaS business using half the instruments.

The 5 Churn Metrics Stripe Hides From You

1. [Voluntary](/what-is-voluntary-churn) vs [Involuntary](/what-is-involuntary-churn) Churn Split

Stripe's MRR chart shows a single "churn" number. It doesn't separate customers who chose to cancel from those whose payments failed. These are fundamentally different problems requiring different solutions.

How to find it manually: Export your subscription events, filter by cancellation reason (customer-initiated vs payment failure), and calculate each separately. This takes hours.

2. Failed Payment Recovery Rate

When a payment fails, Stripe retries it a few times. But Stripe doesn't prominently show you: How many payments failed this month? How many were recovered? What's your recovery rate?

Why it matters: If your recovery rate is 20% (Stripe default) vs 65% (with a proper recovery system), you could be leaving thousands on the table. Use the [failed payment recovery calculator](/failed-payment-recovery-calculator) to quantify the gap.

3. Revenue at Risk

Some of your active customers are showing warning signs: declining usage, support complaints, downgrade requests. Stripe has no concept of "at-risk" customers. It only knows "active" or "canceled."

4. Contraction MRR

When a customer downgrades from $99/mo to $49/mo, Stripe counts them as active. But you just lost $50/mo in [MRR](/what-is-mrr). Most founders don't track contraction MRR separately, which means their "churn" number is actually understated. The [revenue churn calculator](/revenue-churn-calculator) captures this.

5. Churn Cohort Analysis

Are customers who signed up in January churning faster than those from March? Is a specific plan or pricing tier churning more? Stripe doesn't offer cohort-based churn analysis out of the box.

How to Extract Real Churn Data from Stripe

Method 1: Manual Stripe Dashboard Analysis

You can piece together some churn data from Stripe's existing reports:

Step 1: Go to Billing → Subscriptions. Filter by "Canceled" and set the date range. Count the cancellations.

Step 2: Go to Payments → Filter by "Failed." This shows failed payment attempts.

Step 3: Export both datasets to a spreadsheet and calculate:

  • Total MRR lost = sum of all canceled subscription amounts
  • Failed payment MRR = sum of failed payment subscription amounts
  • Voluntary churn = Total - Failed payment churn

Time required: 1 to 2 hours, monthly. And the data is approximate at best.

Method 2: Stripe API + Custom Dashboard

Build a custom analytics pipeline using Stripe's API. Here are the key endpoints you'll need:

// Fetch canceled subscriptions with customer and plan details

GET /v1/subscriptions?status=canceled&created[gte]=timestamp&expand[]=data.customer&expand[]=data.plan

// Fetch uncollectible invoices (failed payments that were never recovered)

GET /v1/invoices?status=uncollectible&created[gte]=timestamp

// List recent subscription events for a specific customer

GET /v1/events?type=customer.subscription.deleted&created[gte]=timestamp

// Get failed payment attempts

GET /v1/payment_intents?created[gte]=timestamp

// Then filter where status = "requires_payment_method" or last_payment_error is present

Using expand[]=data.customer on the subscriptions endpoint avoids a separate API call per subscription. This matters when you're pulling hundreds of canceled subscriptions per month.

For webhook-driven analytics, listen for customer.subscription.deleted events and check the cancellation_details.reason field. Stripe sets this to cancellation_requested for voluntary cancellations and payment_failed for involuntary ones, giving you the voluntary/involuntary split automatically.

Cross-reference with customer events to categorize churn type. Build charts in a dashboard tool.

Time required: 20 to 40 hours of engineering time to build. Ongoing maintenance.

Key Stripe Events to Monitor

If you're building any kind of churn tracking, these are the Stripe webhook events that matter most:

invoice.payment_failed. Fires when a subscription payment attempt fails. This is your first signal of involuntary churn risk. The event includes the attempt_count field so you can track how many retries have happened and the next_payment_attempt timestamp for when Stripe will try again.

customer.subscription.updated. Fires on any subscription change: plan switches, quantity changes, trial endings, and status transitions. Watch for status changing from active to past_due (payment failed, retrying) or active to unpaid (all retries exhausted). Also monitor for downgrades by comparing plan.amount in the previous_attributes; a downgrade today is often a cancellation next month.

customer.subscription.deleted. The subscription is terminated. Check cancellation_details.reason to distinguish voluntary from involuntary. By the time you see this event, the customer is already gone, so your retention systems need to trigger on the earlier events above.

charge.failed. Lower-level than invoice.payment_failed but useful for tracking decline codes. The failure_code field tells you exactly why: card_declined, expired_card, insufficient_funds, authentication_required. Each failure type has a different recovery strategy and success rate.

customer.source.expiring. Stripe sends this 30 days before a card expires. This is your pre-dunning opportunity: email the customer to update their card before the next invoice fails. Proactive card updates prevent 15 to 25% of future payment failures.

Cohort Analysis: Segmenting Churn by Month, Plan, and Payment Method

The most actionable churn analysis isn't your overall churn rate. It's churn broken down by cohort, because different groups of customers churn for different reasons at different rates.

By signup month: Pull subscriptions created in each month and track what percentage are still active 30, 60, and 90 days later. If January signups churn at 12% but March signups churn at 5%, something changed (pricing, onboarding, traffic source) that you can identify and replicate.

By plan tier: Group active and canceled subscriptions by their plan.id or plan.amount. You'll typically find that your cheapest plan has 2 to 3x the churn rate of higher tiers. This tells you whether your entry-level plan delivers enough value or attracts the wrong customers.

By payment method: Compare churn rates for customers using cards vs. ACH/bank transfers vs. specific card brands. Customers on bank transfers tend to have lower involuntary churn because bank details change less frequently than credit cards. If card-based involuntary churn is disproportionately high, that's a strong signal to invest in pre-dunning and card update flows.

Practical approach: Export your Stripe subscriptions via the API with expand[]=data.customer and expand[]=data.default_payment_method, load them into a spreadsheet or simple database, and pivot by the dimensions above. Even a rough cohort analysis often reveals that 80% of your churn problem is concentrated in one segment.

Method 3: Automated Churn Analytics Tool

Connect a retention platform like SaveMRR via Stripe API key. It automatically:

  • Calculates voluntary vs involuntary churn
  • Tracks failed payment rates and recovery
  • Identifies at-risk customers using Stripe signals
  • Shows contraction MRR separately
  • Provides cohort analysis

Time required: minutes to connect. Data available in 60 seconds.

The Revenue Scan: What It Reveals

When you connect Stripe to a churn analytics tool, you get a "Revenue Scan," a complete breakdown of where your MRR is leaking:

Typical Revenue Scan findings for a $25K MRR SaaS:

Leak SourceMonthly ImpactAnnual Impact
Failed payments (unrecovered)$600 to $1,200$7,200 to $14,400
Voluntary cancellations$800 to $1,500$9,600 to $18,000
Downgrades (contraction)$200 to $500$2,400 to $6,000
Total MRR leak$1,600 to $3,200$19,200 to $38,400

Most founders are shocked by the failed payment number. It's almost always larger than they expected. Compare this against the [state of Stripe SaaS churn](/state-of-stripe-saas-churn) benchmarks.

Key Stripe Signals That Predict Churn

Even without external tools, these Stripe data points correlate strongly with future churn:

  • Declining invoice amounts. Customer is downgrading (75% churn within 90 days).
  • Multiple failed payment attempts. Even if recovered, indicates payment instability.
  • Subscription pause requests. 40% of paused subscriptions never resume.
  • Refund requests. Customers requesting refunds are 8x more likely to churn.
  • Short billing cycles. Monthly plans churn 3 to 5x more than annual plans.
  • Coupon/discount expiration. Customers who joined with a discount often churn when it expires.

Building a Churn Dashboard: The Metrics That Matter

If you're building your own dashboard (or evaluating tools), track these metrics:

MetricFormulaTarget
Gross Revenue ChurnMRR lost ÷ Starting MRR<5% monthly
Net Revenue Churn(MRR lost - expansion) ÷ Starting MRR<2% monthly
Involuntary Churn RateFailed payment MRR ÷ Starting MRR<2% monthly
Payment Recovery RateRecovered MRR ÷ Failed MRR>60%
Cancel Deflection RateSaved ÷ Cancel attempts>20%
Logo ChurnCustomers lost ÷ Starting customers<5% monthly

The 60-Second Stripe Diagnostic

Before investing in any churn tool, do this quick self-assessment:

  • Log into Stripe → Billing → Overview
  • Check your MRR trend. Is it growing, flat, or declining?
  • Filter Subscriptions by "Canceled" in the last 30 days. Count them.
  • Filter Payments by "Failed" in the last 30 days. Count them.
  • Quick math: (Canceled subscription MRR ÷ Total MRR) × 100 = your approximate churn rate.

If the number is above 5%, you have a churn problem worth fixing. If you see more than 5 failed payments per month, you have an involuntary churn problem that can be solved with automation.

Next Steps

Stripe processes your payments beautifully but gives you almost no visibility into where your revenue is leaking. To properly understand and fix churn, you need to go beyond Stripe's default dashboard, either with manual analysis (slow, incomplete), custom engineering (expensive), or a purpose-built retention tool (fast, affordable).

The first step is always the same: get a complete picture of your churn. You can't fix what you can't see. Start with the [churn rate calculator](/churn-rate-calculator) to understand your baseline, then explore the [best churn analytics tools](/best-churn-analytics-tool) and see how [SaveMRR compares to Baremetrics](/savemrr-vs-baremetrics) for Stripe-native analytics.

Frequently asked questions

Does Stripe show my churn rate?

Not directly. Stripe shows subscription counts and MRR but doesn't calculate churn rate, split voluntary vs. involuntary churn, or show cohort analysis. You need to calculate it yourself from webhook data or use a dedicated analytics tool like SaveMRR or Baremetrics.

Which Stripe webhooks do I need to track churn?

Five key webhooks: customer.subscription.deleted (cancellations), invoice.payment_failed (failed payments), customer.subscription.updated (downgrades), charge.dispute.created (disputes), and customer.subscription.trial_will_end (trial conversion risk). Log each to a database with timestamp and customer ID.

How do I separate voluntary from involuntary churn in Stripe?

Check the subscription's cancellation_details.reason field. 'payment_failure' means involuntary. 'cancellation_requested' means voluntary. For real-time tracking, listen for invoice.payment_failed events (involuntary) and customer.subscription.deleted with manual cancellation (voluntary).

What churn metrics should I track beyond the basic rate?

Track: monthly logo churn (customers lost), monthly revenue churn (MRR lost), voluntary vs. involuntary split, churn by cohort (signup month), churn by plan tier, cancellation reasons from exit surveys, and 90-day retention of saved customers. Revenue churn matters more than logo churn.

How often should I check my Stripe churn data?

Review weekly at minimum. Set up real-time alerts for high-risk signals: failed payments, subscription downgrades, and disputes. Monthly, do a deeper analysis of churn trends by cohort and reason. The faster you spot patterns, the faster you can respond.

Stripechurn analyticsSaaS metricsMRRrevenue analytics

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

Paste your Stripe key and see every dollar you lost in the last 90 days. Free Revenue Scan, 60 seconds, no card needed.

Run my free scan