Net Revenue Retention Formula: NRR, GRR and Net Revenue Churn
Four formulas cover revenue retention, and three of them are the same number seen from different sides. The arithmetic is easy. Deciding what counts, and saying which period you used, is where the numbers people quote stop matching.
Net revenue retention (NRR) = (starting recurring revenue + expansion − contraction − churned revenue) ÷ starting recurring revenue. It measures what the customers you had at the start of a period pay at the end of it, including upgrades, and it leaves out every new customer. Net dollar retention is the same calculation under another name. Gross revenue retention (GRR) is the same formula without the expansion term, and net revenue churn is one minus NRR. Below are all four, a worked example, the spreadsheet formulas, and the Stripe details that change the answer.
The four formulas
| Metric | Formula | Can it pass 100%? |
|---|---|---|
| Net revenue retention (NRR), also net dollar retention (NDR) | (Starting + Expansion − Contraction − Churned) ÷ Starting | Yes |
| Gross revenue retention (GRR) | (Starting − Contraction − Churned) ÷ Starting | No |
| Net revenue churn | (Churned + Contraction − Expansion) ÷ Starting = 1 − NRR | Can go below zero |
| Gross revenue churn | (Churned + Contraction) ÷ Starting = 1 − GRR | No |
All four use recurring revenue, usually MRR. Starting is what the starting group paid on the first day. Expansion is extra revenue from those same customers: upgrades, added seats, add-ons. Contraction is downgrades and removed seats from customers who stayed. Churned is the full revenue of customers who cancelled.
A worked example
Take the customers who were paying on January 1, 2025 and follow them to January 1, 2026. The figures are illustrative.
Starting MRR, Jan 1 2025 (that group only) 50,000 + Expansion 6,000 - Contraction -1,500 - Churned -2,500 Same customers' MRR, Jan 1 2026 52,000 New customers signed during 2025 9,000 (not in any formula below) NRR 52,000 / 50,000 = 104.0% GRR 46,000 / 50,000 = 92.0% Net revenue churn (2,500 + 1,500 - 6,000) / 50,000 = -4.0% Gross revenue churn (2,500 + 1,500) / 50,000 = 8.0%
The company lost 8% of its starting revenue and still ended the year with 4% more from the same customers, because expansion covered the losses. Total MRR grew more than that, but the 9,000 from new customers is growth, not retention. The gap between 104% and 92% is the part worth discussing: it says how much the retention figure depends on upgrades.
What counts, and the choices you have to state
- New customers are out. Anyone who was not paying on the starting date stays out of the calculation, even if they expand during the period.
- Reactivations. A customer who cancelled before the start and comes back is not in the starting group, so they are out of a cohort calculation. In a monthly bridge, reactivation usually sits in its own line. Decide whether it counts and write it down.
- Only recurring revenue. Leave out one-time fees, setup charges, overages you do not bill every month, and tax.
- Annual plans. Divide by twelve, so an annual contract counts as monthly revenue instead of a spike in the month it was paid.
- Currency. Convert at a fixed rate, or exchange-rate moves show up as expansion and contraction.
The formulas in Excel or Google Sheets
Monthly, from an MRR bridge
If you already track MRR movements by month, put one month per row: A Month, B Opening MRR, C Expansion, D Contraction, E Churned. Then:
NRR F2: =(B2+C2-D2-E2)/B2
GRR G2: =(B2-D2-E2)/B2
Net revenue churn H2: =(D2+E2-C2)/B2
Format F to H as percentages and fill down. The same formulas work in Excel and Google Sheets. Keep new MRR in its own column if you track it, and never in these three.
A 12-month cohort, from customer-level MRR
The figure investors ask for is usually the cohort version. Make one row per customer: A Customer, B MRR on the starting date (0 if they were not yet a customer), C MRR on the end date (0 if they left). Add a helper column D with =MIN(B2,C2), which caps each customer at their starting revenue so expansion drops out. Then:
NRR =SUMIFS(C2:C500,B2:B500,">0")/SUM(B2:B500)
GRR =SUMIFS(D2:D500,B2:B500,">0")/SUM(B2:B500)
The ">0" condition keeps only customers who were paying on the starting date, so new customers drop out without being deleted from the sheet.
Why monthly and annual NRR disagree
Multiplying twelve monthly NRR figures together does not give the 12-month cohort NRR. Each monthly figure starts from whoever was paying that month, including customers signed in March or June, while the cohort follows only January's customers all year. If newer customers churn faster in their first months, as they often do, the compounded monthly figure comes out lower than the cohort figure. If they expand faster, it comes out higher.
Neither number is wrong. They answer different questions. Use monthly NRR to spot a bad month, and quote the cohort figure when someone asks what your NRR is, with the dates next to it.
If your subscriptions are in Stripe
- Stripe's MRR rules decide the inputs. Stripe Billing counts active and past-due subscriptions, leaves out trials, metered items and tax, and subtracts forever coupons. Your NRR inherits those rules, so say which ones you used.
- A plan switch can show as churn plus new. When an upgrade is recorded as one subscription ending and another starting, the upgrade lands in new MRR, which NRR leaves out, while the old plan lands in churn. A heavy upgrade month can make NRR look worse than it is. Read churn and new together, as described in Stripe reporting: MRR, refunds and fees.
- Customer-level MRR takes some work. For the cohort method you need each customer's MRR on two dates. A subscriptions export gives price, quantity and interval, so normalize annual plans to monthly and sum per customer before you use the formulas above.
Asking for NRR from your Stripe data
The Quiriz Stripe connector imports Subscriptions, MRR by month, Subscription snapshots and Customers, and it has metrics for each line of the bridge: MRR, New MRR, Expansion MRR, Contraction MRR, Churned MRR and Reactivation MRR. Add NRR to Company Context once, as opening MRR plus expansion, minus contraction and churned MRR, divided by opening MRR, and every question uses that definition. In Quiriz for Google Sheets you can ask from a cell:
=QUIRIZ("net revenue retention and gross revenue retention by month this year", "table")
In Excel, with the Excel add-in, the same question uses the dotted spelling:
=QUIRIZ.ASK("net revenue retention by month this year", "table")
The answer shows the opening MRR and the movements it used, so you can check it against the formulas above.
What it does not decide for you. Whether reactivations count, and whether you quote a monthly or a cohort figure, are your choices. Write them into the definition. A broader tour of the connector is in Stripe AI: ask your payments data questions, and if NRR goes on a slide in a monthly business review, put the definition in the appendix.
NRR from Stripe without the export
Try the questions on sample company data with no signup, then connect Stripe and ask for your own retention by month.
Try Quiriz free →