Marketing metrics explained

What is net revenue retention

Net revenue retention (NRR) is the recurring revenue you have at the end of a period from the customers you had at the start, as a share of what those same customers paid at the start.

It counts upgrades, downgrades and cancellations, and ignores new customers entirely. Above 100%, existing customers are paying you more than they were; below, less. In the US it is often called net dollar retention, the same calculation.

It is a subscription metric: it needs a recurring amount per customer per period, which a shop selling one-off orders does not have.

How it's calculated

NRR = (starting recurring revenue + expansion - contraction - churn) ÷ starting recurring revenue

Expansion is upgrades and added seats. Contraction is downgrades. Churn is the revenue of customers who cancelled. All three are measured on the customers paying at the start of the period, usually a month or a year.

In Google Sheets, with the four figures in B2 to E2:

=IF(B2=0, "", (B2+C2-D2-E2)/B2)

A worked example

A software company's March, for the customers it had on 1 March:

Amount
Recurring revenue on 1 March10,000.00
Expansion during March1,500.00
Contraction during March600.00
Churned during March1,200.00
Recurring revenue on 31 March, same customers9,700.00

NRR = (10,000 + 1,500 - 600 - 1,200) ÷ 10,000 = 9,700 ÷ 10,000 = 97%

The £2,000 from customers who signed up during March is not in the calculation. If it were, the figure would be 117%, and it would no longer be a retention figure.

Gross revenue retention leaves out expansion: (10,000 - 600 - 1,200) ÷ 10,000 = 82%. GRR can never exceed 100%. The 15-point gap between the two is how much upselling is covering for churn.

What it tells you, and what it doesn't

NRR tells you whether the business would grow with no new customers at all. At 97% it would shrink slowly. At 110% it would grow by a tenth a year before a single new sale.

Set beside LTV, it drives the orders-per-customer term, since a customer whose spend grows is worth more than the average order suggests.

It says nothing about new customer acquisition or about customer count. A business can post 105% NRR while losing a third of its customers, if the rest upgrade enough. Logo retention (customers kept ÷ customers at start) is the figure for that; read the two together.

Where it goes wrong

Letting new customers in. The commonest error. If end-of-period revenue includes anyone not paying at the start, the figure is contaminated by sales performance and stops being a retention metric. Build it from a fixed list of customer IDs taken at the start.

Counting one-off charges as recurring. A setup fee in the expansion column inflates NRR this period and deflates it next.

Different periods for different terms. Annual churn against monthly expansion is nonsense. All four terms come from one window.

Treating it as a shop metric. A store whose customers buy irregularly has no recurring revenue to retain. Cohort analysis and retention rate are the equivalents. A store with a subscription product can calculate NRR on that product alone.

Keeping it current

The input is a list of customers with their recurring amount at the start and end of each period. For most subscription businesses that lives in the billing system, and an export from there is the input.

For a Shopify store with subscriptions, the customer against each order comes from Shopify's own orders export (Orders, then Export, in the admin), whose Email column identifies the customer and whose Total column holds the order value. Source: Shopify Help Centre, Exporting orders. Paste it into a tab called Orders and take each customer's monthly amount with a SUMIFS, found by heading:

=SUMIFS(INDEX('Orders'!A:Z, 0, MATCH("Total", 'Orders'!1:1, 0)), INDEX('Orders'!A:Z, 0, MATCH("Email", 'Orders'!1:1, 0)), B2)

Compare each customer's amount across two months and the three movement columns fall out of the differences. A scheduled Fresh Sheets report keeps the period totals, orders and net payment by day, in a Shopify tab of their own for the top line; it carries no customer field, so the per-customer table stays on the export. It replaces that tab's contents on every refresh, so keep your formulas on a separate tab.

Start free trial

30 days of Plus, free from sign-up. No card needed.

Sign in with Google or a work or school Microsoft account.

Add to Google Sheets

Prefer to stay in Google Sheets? Add the add-on and start from the Extensions menu.