Net revenue retention answers one question: of the money your customers paid you a year ago, how much are the same customers paying you now? Boards ask for it first, and most teams calculate it three different ways.
The formula
Take every account that was paying 12 months ago. Their combined MRR on that date is the starting point. Add what those same accounts added since (expansion), subtract what they cut (contraction) and what left with the accounts that cancelled (churn). Divide by the starting point.
nrr = (start_mrr + expansion - contraction - churn) / start_mrr
Here is Fernhill's November 2026 calculation, the workspace our demo data comes from:
| Line | MRR (USD) |
|---|---|
| Starting MRR, accounts paying on Nov 1, 2025 | 138,600 |
| Expansion since then | +21,940 |
| Contraction | −3,180 |
| Churn | −7,140 |
| Ending MRR, same accounts | 150,220 |
| Net revenue retention | 108.4% |
A result of 108.4% means Fernhill would grow 8.4% over the next year with zero new customers, if the same pattern held.
Which accounts count
The cohort is fixed on the start date. Everything else follows from that one rule:
- Accounts that started paying after the start date are excluded, even if they signed up the next morning.
- An account in the cohort that cancelled and came back counts its current MRR. The return shows up as expansion.
- Free and trialing accounts are not in the cohort; their starting MRR is zero, and dividing by it tells you nothing.
Annual prepayments
An annual plan paid in one invoice is still one twelfth of that invoice in each month. If your billing source books it as one lump, spread it before you calculate, or January looks like a miracle and February like a disaster.
Currencies and credits
Convert each invoice at the exchange rate on its own date, not today's. Credits and refunds reduce MRR in the month they're issued, which is why a generous support team can show up as contraction.
Building the cohort table
A single NRR figure hides when the expansion happened. The table we review each month puts one cohort per row (the month the accounts started paying) and one column per quarter since.
| Cohort | Accounts | Month 3 | Month 6 | Month 9 | Month 12 |
|---|---|---|---|---|---|
| Nov 2025 | 214 | 101.2% | 103.9% | 106.1% | 108.4% |
| Dec 2025 | 188 | 100.8% | 104.4% | 106.7% | Pending |
| Jan 2026 | 203 | 99.6% | 102.1% | 104.8% | Pending |
| Feb 2026 | 176 | 101.9% | 105.0% | Pending | Pending |
Read across a row to see one cohort mature. Read down a column to see whether newer cohorts expand faster than older ones did at the same age. Here, the January cohort dipped below 100% at month 3 and recovered: two of its larger accounts paused for a quarter and came back on bigger plans.
View as table
| Month | NRR |
|---|---|
| Jun | 106.2% |
| Jul | 106.9% |
| Aug | 107.1% |
| Sep | 107.3% |
| Oct | 107.3% |
| Nov | 108.4% |
Three mistakes we see every month
- Counting new customers. If an account wasn't paying on the start date, it isn't retention. Track it under new MRR instead.
- Using bookings instead of MRR. A signed two-year contract is a booking. Only the monthly amount belongs in the calculation.
- Letting one big upgrade hide many small losses. A single account moving to Enterprise can lift NRR while ten small accounts leave. Read logo churn beside it.
Doing it in Brightkeel
Press G then D for the overview. Focus the NRR tile and press Enter to open the cohort's accounts, sorted by how much each one moved. The same numbers are available from the API:
GET /v1/metrics/nrr?window=12m&group=plan
{ "nrr": 1.084, "start_mrr": 138600, "expansion": 21940, "contraction": 3180, "churn": 7140 }
If NRR is above 100%, you'd grow with zero new customers. If it's below, every new customer is refilling a leak first.