EnableYourData.com

KPI · Subscriptions and SaaS

Net revenue retention (NRR): formula and example.

Net revenue retention (NRR) is the MRR from a group of existing customers after a period, usually twelve months, divided by their MRR at the start, as a percentage. Expansion counts, as do contraction and cancellations; new customers do not. NRR shows whether your existing customer base grows or shrinks on its own.

Net revenue retention (NRR) formula

(Starting MRR + expansion − contraction − churn) ÷ starting MRR × 100%

Worked example

Customers active with Acme's subscription service on 1 October 2025 were worth €36,000 MRR at the time. A year later they had added €6,480 in expansion, while €1,080 was lost to contraction and €2,520 to cancellations. Their MRR is now €38,880. NRR is €38,880 ÷ €36,000 × 100% = 108%.

Fictitious figures for Acme Groothandel, a sample wholesaler.

How to read this KPI

NRR above 100% means your existing customers pay more in total than a year ago, even though some have left. Below 100%, existing revenue shrinks and new sales must make up for it before you grow. Compare NRR by segment and plan, and always next to gross revenue retention to see how much expansion is needed to offset losses.

Pitfalls with net revenue retention (NRR)

  • Including revenue from customers who started during the period in the ending MRR.
  • Not separating out price increases, which lift NRR without customers using more.
  • Calculating NRR monthly and comparing it with other companies' annual figures.

SQL & DAX

Calculating net revenue retention (NRR) in SQL and DAX

Two examples on a fictitious data warehouse for Acme Groothandel: a PostgreSQL query and a measure for a Power BI model. Adjust table and column names to your own model.

SQL · PostgreSQL
WITH per_customer AS (
  SELECT customer_id,
         SUM(mrr) FILTER (WHERE started_at <= current_date - interval '1 year'
           AND (ended_at IS NULL OR ended_at > current_date - interval '1 year')) AS start_mrr,
         SUM(mrr) FILTER (WHERE started_at <= current_date
           AND (ended_at IS NULL OR ended_at > current_date)) AS end_mrr
  FROM subscriptions
  GROUP BY customer_id
)
SELECT SUM(start_mrr) AS start_mrr,
       SUM(COALESCE(end_mrr, 0)) AS mrr_same_customers_now,
       ROUND(100.0 * SUM(COALESCE(end_mrr, 0)) / NULLIF(SUM(start_mrr), 0), 1) AS nrr_pct
FROM per_customer
WHERE start_mrr > 0;
DAX · Power BI
NRR (12 months) % =
VAR StartDate = EDATE(MAX('Date'[Date]), -12)
VAR Window = DATESINPERIOD('Date'[Date], MAX('Date'[Date]), -12, MONTH)
VAR Cohort =
    CALCULATETABLE(VALUES(MrrMovements[customer_id]), REMOVEFILTERS('Date'), MrrMovements[month] <= StartDate)
VAR StartMRR = CALCULATE([MRR], DATEADD('Date'[Date], -12, MONTH))
VAR Expansion =
    CALCULATE(SUM(MrrMovements[amount]), Window, Cohort, MrrMovements[movement_type] = "expansion")
VAR Lost =
    CALCULATE(SUM(MrrMovements[amount]), Window, Cohort, MrrMovements[movement_type] IN {"contraction", "churn"})
RETURN
    DIVIDE(StartMRR + Expansion - Lost, StartMRR)

In ENABLE

Tracking this KPI in ENABLE

Plain-language questions

Ask for net revenue retention (NRR) per month, customer or product in the SQL Explorer with AI. The AI writes the SQL, you see the query and run it yourself; the AI only receives metadata.

Read more →

In your Power BI dashboard

Define the KPI as a measure in your Power BI model and show it in the portal, with "Last refreshed" next to it. Access profiles and optional row-level security decide who sees which figures.

Read more →

Custom dashboards (pilot)

Add the KPI as a tile to a custom dashboard, compared with last year. The Dashboard Builder is a pilot and can be switched on per client.

Read more →

Monthly targets

With the built-in Targets app you set a target for the KPI per month, so you see actuals and target side by side.

Read more →

FAQ

Frequently asked questions

How do you calculate net revenue retention?

Take the customers who were active at the start of the period and compare their MRR now with their MRR then. Expansion is included, contraction and cancellations are deducted, and new customers are left out. With €100,000 starting MRR and €104,000 now, NRR is 104%.

What does NRR above 100% mean?

NRR above 100% means your existing customers generate more revenue in total than at the start of the period. Expansion, such as extra users or a higher plan, outweighs losses from downgrades and cancellations. You then grow even without new customers.

What is the difference between NRR and GRR?

NRR includes expansion from existing customers; GRR (gross revenue retention) does not. GRR can therefore never exceed 100% and shows purely how much revenue you hold on to. The gap between the two is the contribution of expansion.

Use AI on your own data. Securely, and without the headache.

In an online demo we show how ENABLE makes your data securely available and how you build on it: describing an app in the AI Builder, plain-language questions, dashboards and APIs. And how we set it up and manage it for you.