Churn rate measures recurring business lost during a period. Customer churn rate divides customers who left by the customers at the start of the period. Revenue churn divides recurring revenue lost by recurring revenue at the start. Gross revenue churn counts cancellations and downgrades. Net revenue churn also subtracts expansion from upgrades and added seats, so it can be negative when expansion is larger than the losses. Customer churn and revenue churn answer different questions.
Formula
The formulas below use the starting base as the denominator. New customers acquired during the period stay out of both the numerator and that starting denominator. Teams that divide by the ending count, or by the average of start and end, will publish a different percentage. Say which denominator you used.
| Metric | Formula |
|---|---|
| Customer churn rate | Customers lost in the period / customers at the start |
| Gross revenue churn | (MRR canceled + MRR downgraded) / MRR at the start |
| Net revenue churn | (MRR canceled + MRR downgraded - expansion MRR) / MRR at the start |
A downgrade keeps the customer and still reduces MRR, so it raises revenue churn and does not raise customer churn. Express the result as a percentage only after the division. A rate of 0.04 is 4%, not 4 used as a fraction later.
Worked example
Every figure in this example is hypothetical. It is not the public demo and not a customer account. At the start of the month the book has 100 customers and $10,000 of normalized MRR.
- 4 customers cancel, removing $500 of MRR.
- 2 customers downgrade, removing $200 of MRR. They are still customers.
- Upgrades and added seats add $450 of MRR.
- Customer churn = 4 / 100 = 4%.
- Gross revenue churn = (500 + 200) / 10,000 = 7%.
- Net revenue churn = (500 + 200 - 450) / 10,000 = 2.5%.
The 4% customer figure and the 7% gross revenue figure describe the same month. Quoting one of them as "churn" without the label hides whether logos or dollars moved.
How to compute it from Stripe
- Keep a snapshot of paying subscriptions and normalized MRR at the start of the period. A single current list of active subscriptions has no memory of who left.
- For customer churn, count customers (or subscriptions, if that is your unit) whose status became canceled during the period. Stripe can list status=canceled. Filter on the cancellation time. Paginate. Do not treat a Stripe Customer object that still exists as an active subscriber.
- For revenue churn, compare normalized MRR at the start with the MRR removed by those cancellations and by quantity or price decreases. Subtract expansion only when you are reporting net revenue churn.
- Stripe does not return a churn field. Invoice history can reconstruct cash, which is still not the same as a starting MRR snapshot.
What Data Lighthouse shows
The signed-in overview cards are Revenue (7, 14, or 30 days), Avg daily revenue, Monthly recurring revenue, Annual recurring revenue, Revenue per visitor, Visitor conversion rate, and Visitors online. The overview does not compute churn. You can compute it yourself from Stripe by keeping a snapshot of paying customers and normalized MRR at the start of the period, then listing subscriptions that canceled.
Visitor conversion rate appears after Postgres customer tables are configured. It is the higher of distinct checkout_completed users and distinct customers with status paid, divided by distinct signed_in users in the window. Paid customers are rows in the template customers table, not subscribers in the connected Stripe account. Without those tables the card says Configure Drizzle. The rate is not divided by anonymous visitors. Conversion rate is not churn. The public demo does not call Stripe or Postgres. Revenue, visitors, monthly recurring revenue, and annual recurring revenue are a seeded sample. ARR in the sample is the sample MRR times 12. Each day's visitors are seeded on their own, separate from that day's revenue, and the chart subtitle labels the series as sample data. Checkout for the $59 template license uses Polar after GitHub sign-in. Stripe is the optional revenue source inside the dashboard you host, through STRIPE_SECRET_KEY. If that key is missing, the revenue API returns an error and the overview says it could not load Stripe revenue.
Questions
What is the difference between customer churn and revenue churn?
Customer churn rate divides customers lost during a period by customers at the start of the period. Revenue churn divides recurring revenue lost by recurring revenue at the start. Gross revenue churn counts cancellations and downgrades. Net revenue churn also subtracts expansion, so it can be negative when upgrades exceed losses.
How do you calculate customer churn rate?
Using the starting-base formula, customer churn rate equals customers who left during the period divided by customers at the start. In a hypothetical book of 100 customers at the start and 4 cancellations, customer churn is 4%. Downgrades stay in the customer count and do not increase customer churn.
Can the Data Lighthouse revenue API compute churn?
The overview does not compute churn. You can compute it yourself from Stripe by keeping a snapshot of paying customers and normalized MRR at the start of the period, then listing subscriptions that canceled.
Related reading
- Next.js Stripe analytics dashboard template
- Public live demo
- Template checkout
- Monthly recurring revenue (MRR)
- Average revenue per user (ARPU)
- Customer lifetime value (LTV)