Net revenue retention (NRR) vs gross revenue retention: formulas and pitfalls
How to compute net and gross revenue retention monthly and over 12 months, worked examples on hypothetical numbers, and the pitfalls that inflate either metric.
Net revenue retention (NRR) and gross revenue retention (GRR) both ask the same question: of the recurring revenue you had at the start, how much do you still have? They differ on one thing. NRR counts expansion from existing customers; GRR does not.
That one difference makes NRR the number companies like to show and GRR the number that tells you whether the bucket leaks. This guide gives both formulas, the monthly and the 12-month versions, examples on hypothetical numbers, and the mistakes that quietly inflate either one.
The formulas
Start from the recurring revenue of the customers you had at the start of the period. Call it starting MRR (or ARR, the logic is the same).
GRR = (starting MRR − churned MRR − contraction MRR) ÷ starting MRR
NRR = (starting MRR − churned MRR − contraction MRR + expansion MRR)
÷ starting MRR
Where:
- Churned MRR is revenue from customers who left, voluntarily or because a payment could not be collected.
- Contraction MRR is revenue lost to downgrades, fewer seats or lower usage among customers who stayed.
- Expansion MRR is revenue gained from upgrades, more seats, add-ons or price increases among customers who were there at the start.
Two properties follow directly:
- GRR can never exceed 100%. If yours does, expansion leaked into it.
- NRR can exceed 100%, and does whenever expansion outweighs churn plus contraction.
New customers never appear in either formula. Neither do customers who left before the period and came back during it (reactivations); treat them as a separate line, as Stripe’s MRR roll-forward does with its “reactivation” category (Stripe analytics docs, accessed November 2026).
Monthly example (hypothetical numbers)
A fictional company starts June with $80,000 MRR from its existing customers. During June, among those customers:
- Cancellations and failed payments remove $3,200.
- Downgrades remove $1,000.
- Upgrades and seat additions add $2,400.
GRR = (80,000 − 3,200 − 1,000) ÷ 80,000 = 94.75%
NRR = (80,000 − 3,200 − 1,000 + 2,400) ÷ 80,000 = 97.75%
Same month, three points apart. The gap is the expansion.
The 12-month cohort version
Many companies report NRR and GRR over 12 months rather than monthly. The cleanest definition takes a fixed group of customers and compares their revenue a year apart:
12-month NRR = current ARR of customers who were customers 12 months ago
÷ ARR of those same customers 12 months ago
12-month GRR = same, but each customer's current ARR is capped
at their ARR 12 months ago
The cap is how expansion is removed customer by customer: a customer who grew from $1,000 to $1,500 counts as $1,000; a customer who shrank to $600 counts as $600; a customer who left counts as $0.
Example (hypothetical numbers)
Five customers had $10,000 ARR in total a year ago:
| Customer | ARR a year ago | ARR today | Capped for GRR |
|---|---|---|---|
| A | $4,000 | $5,500 | $4,000 |
| B | $2,000 | $2,000 | $2,000 |
| C | $2,000 | $1,200 | $1,200 |
| D | $1,000 | $0 (churned) | $0 |
| E | $1,000 | $1,800 | $1,000 |
| Total | $10,000 | $10,500 | $8,200 |
12-month NRR = 10,500 ÷ 10,000 = 105%
12-month GRR = 8,200 ÷ 10,000 = 82%
An NRR above 100% sits on top of a GRR of 82%: nearly a fifth of last year’s revenue base left or shrank, and growth from two customers covered it.
Do not multiply monthly figures
Compounding monthly NRR (for example 0.98 to the power of 12) gives a rough number at best. Expansion and churn are not evenly spread across months, and a customer who churns in month 3 cannot expand in month 9. If you report a 12-month figure, compute it from the cohort.
When to look at which
| Question | Use |
|---|---|
| Is the base leaking? | GRR |
| Does the existing base grow on its own? | NRR |
| Are cancel flows and payment recovery working? | GRR (they act on churn and contraction) |
| Is upsell or seat growth working? | NRR minus GRR (the expansion share) |
A business with high NRR and low GRR depends on a few customers growing fast. If that growth stops, the churn underneath shows up all at once. A business with high GRR and NRR close to it keeps its customers but does not grow them. Both are worth knowing.
Pitfalls that inflate NRR or GRR
1. New customers in the numerator
The most common error. If a customer signed up during the period, their revenue belongs to growth, not retention. Filter on the customer’s start date, not on whether they appear in this month’s MRR.
2. Reactivations counted as expansion
A customer who left in January and returned in May was churned in January. Counting their return as expansion turns a loss into a gain. Keep reactivation as its own line.
3. Price increases presented as product pull
A list price increase applied to existing customers shows up as expansion and lifts NRR. That is real revenue, but it is not the same signal as customers buying more. Note it next to the number in months with a price change.
4. Discounts ending
A three-month 50% discount that expires looks like expansion when the price returns to normal. Decide whether MRR is before or after discounts; Stripe’s analytics let you choose to exclude recurring and one-time discounts. Be consistent.
5. Currency movements
If you bill in several currencies and report in one, exchange rates move revenue without anyone buying or leaving. Stripe’s roll-forward has a separate FX adjustment line for this reason. Exclude FX from NRR or hold rates constant.
6. Past-due revenue counted as retained
A subscription in past-due status still counts in MRR in many systems, including Stripe’s active subscriber count. If dunning is slow to end subscriptions, GRR looks better than collected revenue. Decide when a failed payment becomes churn and apply it.
7. Usage-based volatility
For usage-based pricing, one quiet month can look like contraction and one busy month like expansion. Use a trailing average of usage, or report NRR on the committed portion only, and say which.
8. Small bases
With 30 customers, one large account moves NRR by several points. Show the customer count next to the percentage.
How to improve each one
GRR moves with churn and contraction, so it responds to the retention work: recovering failed payments, matching cancel offers to the reason (a downgrade instead of a cancellation still reduces GRR, but less), and catching risk before renewal. NRR adds expansion, which is product and pricing work: seat growth, add-ons, usage. Improving GRR is usually faster, because a share of churn, the failed payments in particular, never involved a decision to leave. See involuntary churn and downgrade offers.
Doing this with NoChurn
NoChurn works on the churn and contraction side of GRR. It recovers failed payments with smart retries timed to the decline reason and payday (on Stripe), AI-written recovery emails you can review and a hosted card update page. It runs cancel flows with an offer per reason, including a plan change instead of a cancellation, with one-click cancel always visible. It sends win-back emails at day 30, 60 and 90 by cancel reason, and scores each customer’s churn risk from 0 to 100 at signup and on every change. Every feature is on every plan, priced by MRR only (pricing).