CHURN METRICSCHURN ANALYSIS

The churn dashboard: which metrics to track and how to compute them

The dozen metrics a subscription churn dashboard needs, with formulas, a worked example on hypothetical numbers, and the definition choices to write down.

Published 6 min read

A churn dashboard should answer three questions every month: how much revenue did we lose, why, and is it getting better? Most dashboards answer the first one and stop. This guide lists the metrics that answer all three, gives a formula for each, and works through one month of hypothetical numbers.

For the basics of customer, gross and net churn, see how to calculate churn rate. This article is about assembling them into one page you can trust.

The dashboard in four rows

Row Metrics Question it answers
1. Revenue base MRR, MRR movements How big is the base and how did it move?
2. Headline churn Customer churn, gross revenue churn, NRR, GRR How much did we lose?
3. Churn by cause Voluntary vs involuntary, cancel reasons Why did we lose it?
4. Levers Recovery rate, save rate, win-back rate, cohort retention Is what we do working?

Keep it to one screen. If a metric does not lead to a decision, move it to a secondary report.

Row 1: the revenue base

MRR

Monthly recurring revenue is the sum of every active subscription’s monthly value. Normalize other intervals: an annual plan counts as one twelfth of its price, a quarterly plan as one third.

Decide and document three things before you compute it:

  • Discounts. Is MRR before or after recurring discounts? Stripe’s Billing analytics let you choose whether to exclude discounts (Stripe analytics docs, accessed November 2026).
  • Past-due subscriptions. Stripe counts past-due subscribers as active. That is defensible, but it means MRR includes revenue you have not collected.
  • Usage-based charges. Either exclude variable usage from MRR or use a trailing average, and say which.

MRR movements

Break the month’s change into categories. Stripe’s MRR roll-forward uses new, reactivation, expansion, contraction, churn and FX adjustment; you can use the same list.

ending MRR = starting MRR
           + new + reactivation + expansion
           − contraction − churned
           ± FX adjustment

If this equation does not balance in your data, a category is missing or double counted. Fix that before reading any other metric.

Row 2: headline churn

customer churn  = customers lost ÷ customers at start
gross rev churn = (churned MRR + contraction) ÷ starting MRR
GRR             = 1 − gross rev churn
NRR             = (starting MRR − churned − contraction + expansion) ÷ starting MRR

Reactivations and new customers stay out of all four. A deeper look at the last two is in NRR vs GRR.

Stripe’s subscriber churn is a different number

Stripe’s subscriber churn rate uses a rolling 30-day window, and its denominator includes subscribers active at the start plus new subscribers added during the window. A start-of-period denominator gives a higher figure for the same losses. Neither is wrong; just do not put them side by side as if they were the same metric.

Row 3: churn by cause

Voluntary vs involuntary

involuntary churned MRR = MRR of subscriptions that ended on a failed payment
voluntary churned MRR   = MRR of subscriptions the customer cancelled

On Stripe, cancellation_details.reason on the subscription tells you which it was (cancellation_requested, payment_failed, payment_disputed) per the cancel API reference. The split matters because the fixes differ completely; see involuntary churn.

Cancel reasons

Show voluntary churned MRR by cancel reason, not just counts. Ten small customers saying “too expensive” and one large customer saying “missing feature” lead to different roadmaps.

At-risk MRR

at-risk MRR = MRR of subscriptions currently past due
            + MRR of subscriptions scheduled to cancel at period end

This is the only row that looks forward. It tells you what next month’s churn will be if nobody acts.

Row 4: the levers

Failed payment recovery rate

recovery rate = failed invoices later paid ÷ invoices that failed at least once

Measure it per cohort of failed invoices (for example, all invoices that first failed in March), and only after the retry window has closed. Otherwise this month’s rate looks low because many invoices are still in progress.

Cancel flow save rate

save rate (N days) = customers who started a cancellation and are still
                     subscribed N days later ÷ cancellation starts

Use 30, 60 and 90 days. Stripe’s retention performance counts a save if the customer stays at least 7 days after accepting an offer, which is a short window for monthly plans.

Win-back rate

win-back rate (N days) = churned customers who resubscribed within N days
                         ÷ customers who churned in the cohort

Cohort retention

A small table of logo or revenue retention by signup month. It is the best check that changes to onboarding or pricing actually worked. Step by step in cohort retention analysis.

Worked example (hypothetical numbers)

A fictional company starts April with 500 customers and $50,000 MRR.

Movement Customers MRR
New +40 +$4,000
Reactivation +5 +$400
Expansion +$1,500
Contraction −$700
Churned (voluntary) −15 −$1,600
Churned (failed payment) −10 −$900
Ending 520 $52,700

Check the balance: 50,000 + 4,000 + 400 + 1,500 − 700 − 1,600 − 900 = 52,700. It balances.

customer churn  = 25 ÷ 500                          = 5.0%
gross rev churn = (2,500 + 700) ÷ 50,000             = 6.4%
GRR             = 93.6%
NRR             = (50,000 − 2,500 − 700 + 1,500) ÷ 50,000 = 96.6%
involuntary share of churned MRR = 900 ÷ 2,500       = 36%

Reading it: a third of lost MRR came from failed payments, which is usually the cheapest churn to reduce. Churned customers paid $100 on average, the same as the base, so the gap between 5.0% customer churn and 6.4% gross revenue churn comes entirely from downgrades. That is worth a look at the contraction list.

Definitions to write down

Put these at the top of the dashboard, or in a linked note:

  1. When a cancellation counts as churn: on request or at period end. Stripe lets you choose either for its analytics.
  2. When a failed payment counts as churn: when the subscription is cancelled, or a fixed number of days after the last retry.
  3. How pauses count: active, churned or excluded.
  4. Whether trials and free plans are in the customer count (Stripe excludes them from active subscribers).
  5. Whether MRR is before or after discounts.
  6. Which currency and exchange rate date you use.

A metric whose definition changes silently is worse than no metric.

Common mistakes

  • Mixing new-customer revenue into NRR. It inflates retention.
  • Reading one month. Small bases swing. Show a 3-month trailing average next to the monthly value.
  • No segment split. Monthly consumer plans and annual B2B contracts behave differently; one blended number hides both.
  • Counting accepted offers as saves. Count only customers still subscribed later.
  • Dashboards with numbers nobody owns. Each row should have a person who acts when it moves.

Doing this with NoChurn

NoChurn reads your billing events (Stripe in one click; Chargebee, Recurly, Maxio, Zuora, Paddle, Lemon Squeezy, Polar, Braintree, Mollie, GoCardless, Razorpay, the App Store, Google Play, or any billing by REST API) and acts on the levers in row 4: smart retries and AI-written recovery emails for failed payments, cancel flows with an offer per reason and one-click cancel always visible, and win-back emails at day 30, 60 and 90 by cancel reason. Each customer gets a churn score from 0 to 100, and your own data sent by API shows churn drivers (correlation, not causation). Every feature is on every plan; the price depends only on MRR (pricing).

PROMPT

Read https://www.nochurn.sh/llms.txt,
then follow https://www.nochurn.sh/docs/quickstart/
to add NoChurn to this app. Use a test key
(nc_test_…) until I say we go live.

Stop leaking revenue.

  • Free until $300 MRR
  • No card needed
  • Live in 10 minutes
  • Never a cut of what we recover