Skip to content

SaaS Metrics

MRR, Churn, and NRR — The Three Numbers That Run a SaaS

All articles
💰 📉 📈

Founders Track Vanity. Investors Track Three. You're Probably Tracking Wrong.

Your dashboard has 47 numbers. DAUs. WAUs. CAC payback. Activation rate. Feature adoption. Churn rate. Engagement. "Velocity." None of them matter if investors aren't looking at them. Investors care about three: MRR growth %, gross churn %, and net revenue retention (NRR). If NRR is above 100%, your existing customers are spending more than churners cost you. That's compounding. That's the money printer. Everything else is noise.

Velocity X ships these three numbers in the top row of the dashboard. One tile. Three metrics. No fluff. This post walks the math, the SQL, and why NRR >100% is the golden benchmark every founder should hunt.

MRR: The Revenue You Counted On Last Month

Monthly Recurring Revenue (MRR) is the revenue you can forecast with confidence 30 days from now, assuming no new customers and no surprises. If you have 100 customers paying $100/month and 50 paying $50/month, your MRR is $12,500. That's it. No one-time charges, no upsells pencilled in for "maybe", no optimism. Just the recurring stuff.

MRR breaks into four buckets:

New MRR: revenue from customers who signed up this month. 10 new customers at $100/month = $1,000 new MRR.

Expansion MRR: revenue from existing customers who upgraded this month. 5 customers move from $50 to $100 = $250 expansion MRR.

Contraction MRR: revenue lost when existing customers downgrade. 3 customers move from $100 to $50 = −$150 contraction MRR (negative).

Churned MRR: revenue lost when customers cancel entirely. 2 customers at $100/month cancel = −$200 churned MRR (negative).

Month-over-month MRR growth = (New + Expansion − Contraction − Churned) / Last Month's MRR. If last month was $12,500 and this month's net change is +$900, growth = 7.2%. That's a good month. A great SaaS grows 10%+ MoM early (under $10K), then settles into 3–5% as it scales.

Gross Churn: The Customer You Lost

Gross churn is the percentage of customers who cancelled this month. If you had 100 customers and 5 churned, gross churn = 5%. Simple. This is the scary number because it's visible and honest. A 5% monthly churn rate compounds to 60% annual loss — you'd need 50%+ growth just to break even.

But gross churn is a trap. It ignores expansion. You fired 10 customers at $50/month but closed 15 customers at $100 for an upgrade. Gross churn says "you lost 10 customers". Net revenue retention says "you grew $500 on top of the $50K you kept." Investors ask about gross churn to understand your customer stability; they ask about NRR to understand your economics.

Gross Churn % = Churned Customers This Month / Total Customers Last Month. Benchmark: under 3% is world-class, under 5% is good, over 7% is a siren for SaaS (you need to fix either product-market fit or positioning).

Net Revenue Retention: The Metric That Matters

Net Revenue Retention (NRR) is the percentage of last month's MRR that carried forward into this month *after expansion and contraction*. If you kept $12,500 in MRR from last month, added $1,000 in new customers, gained $250 in expansion, lost $150 in contraction, and lost $200 in churn, your NRR is ($12,500 + $250 − $150 − $200) / $12,500 = 98%.

An NRR of 98% means you kept 98% of the MRR cohort. Sounds good, right? It's not. Every month you're losing 2% of the cohort to net (expansion + contraction + churn combined). That's 22% annual attrition on the base. Brutal.

An NRR of 100% means you broke even. You added expansion and contraction in equal measure. Stable, but not growing.

An NRR of 110%+ means the cohort grew. Existing customers expanded by 10% more than they contracted and churned combined. At 110% NRR, the cohort doubles every ~7 years without a single new customer. That's a compounding machine. Salesforce, Slack, and Stripe all hit 130%+ NRR. That's why they won.

NRR = (MRR This Month − Churn − Contraction + Expansion) / MRR Last Month. Benchmark: above 100% is great, above 110% is world-class, below 90% is a red flag.

The Dashboard Tile: Three Numbers, One Truth

Velocity ships MRR growth %, gross churn %, and NRR as a three-stat card in the top-left corner. Each stat updates daily. MRR growth shows the last 30 days' net change. Gross churn shows churned customers as a percentage of the month-before base. NRR shows the cohort-carrying-forward percentage. A single query touches the entire subscription table — sign-ups, upgrades, downgrades, cancellations, and churn dates — and calculates all three.

The SQL: Segment by Month, Calculate Retention

The query groups subscriptions by customer, month, and event (new/upgrade/downgrade/churn), then calculates MRR per month, changes month-to-month, and retention ratio:

WITH monthly_subscriptions AS ( SELECT DATE_TRUNC('month', created_at)::date AS month, customer_id, amount_cents, status, cancelled_at FROM subscriptions WHERE created_at >= now() - interval '24 months' ), mrr_by_month AS ( SELECT month, SUM(CASE WHEN status = 'active' AND (cancelled_at IS NULL OR cancelled_at > month + interval '1 month') THEN amount_cents ELSE 0 END) / 100 AS mrr, COUNT(DISTINCT CASE WHEN status = 'active' AND (cancelled_at IS NULL OR cancelled_at > month + interval '1 month') THEN customer_id END) AS active_customers, COUNT(DISTINCT CASE WHEN cancelled_at >= month AND cancelled_at < month + interval '1 month' THEN customer_id END) AS churned_customers FROM monthly_subscriptions GROUP BY month ), new_expansion_contraction AS ( SELECT m.month, SUM(CASE WHEN LAG(m.mrr) OVER (ORDER BY m.month) IS NULL THEN m.mrr - COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0) ELSE 0 END) / 100 AS new_mrr, SUM(CASE WHEN m.mrr > LAG(m.mrr) OVER (ORDER BY m.month) THEN m.mrr - COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0) ELSE 0 END) / 100 AS expansion_mrr, SUM(CASE WHEN m.mrr < LAG(m.mrr) OVER (ORDER BY m.month) THEN COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0) - m.mrr ELSE 0 END) / 100 AS contraction_mrr FROM mrr_by_month m GROUP BY m.month ) SELECT m.month, m.mrr, ROUND(100.0 * (m.mrr - COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0)) / NULLIF(COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0), 0), 1) AS mrr_growth_percent, m.churned_customers, COALESCE(LAG(m.active_customers) OVER (ORDER BY m.month), 0) AS prior_month_customers, ROUND(100.0 * m.churned_customers / NULLIF(COALESCE(LAG(m.active_customers) OVER (ORDER BY m.month), 0), 0), 1) AS gross_churn_percent, ROUND(100.0 * m.mrr / NULLIF(COALESCE(LAG(m.mrr) OVER (ORDER BY m.month), 0), 0), 1) AS nrr_percent FROM mrr_by_month m ORDER BY m.month DESC LIMIT 13;

This query window-functions over months, compares cohorts month-to-month, and spits out 13 months of history (12 months + current partial). MRR growth is the % change month-to-month. Gross churn is churned customers / prior active base. NRR is current MRR / prior MRR (capturing expansion and churn in the ratio).

Reading the Dashboard

The tile shows three numbers in bold: MRR growth % (green if +3%+, red if negative), gross churn % (green if under 3%, amber if 3–5%, red if 5%+), and NRR % (green if 100%+, amber if 90–99%, red if under 90%). Tap each number to see the 12-month trend (a simple line chart). A founder glancing at the dashboard for 5 seconds should know: are we growing, are we losing customers, and are existing customers expanding?

Six FAQs

Should I include one-time charges in MRR?

No. MRR is recurring. Consulting fees, setup costs, and one-time licenses inflate the number and make month-to-month comparison meaningless. Track ARR (Annual Recurring Revenue) separately if you have it. Investors will ask "what's your MRR?", and if you include one-time stuff, they'll dig into your subscription cohort and discover the truth anyway. Just track recurring.

How do I handle annual subscriptions in MRR?

Divide by 12. If a customer pays $1,200/year, that's $100/month MRR. Your database should store the subscription amount and billing period; the query divides annual by 12, quarterly by 3, and monthly stays as-is. The cohort always normalizes to a monthly view.

What if a customer has multiple subscriptions?

Sum them. If they have a $100/month base plan and a $50/month add-on, count $150 in MRR. The churn logic looks at cancellation of *any* active subscription from that customer; if they kill the add-on but keep the base, they're a contraction event, not churn. Build the logic to segment by subscription, not just customer.

How do I calculate NRR if I have free trial customers?

Exclude them from the MRR cohort. NRR measures the value retention of paid customers. Free trials are a funnel stage; until they convert, they're not MRR. Once they upgrade, include them in the next month's cohort. The same applies to free tiers — they're engagement metrics, not revenue metrics.

Can NRR exceed 100% indefinitely?

Mathematically yes. But in practice, saturation happens. A customer can only pay so much before they hit budget ceiling or usage limit. At some point, everyone is buying the top tier. When that saturation hits, expansion flattens, and NRR drops toward 100%. That's not a failure — it's maturity. The goal shifts from "expansion" to "retention". Salesforce, for instance, is in this zone now (great NRR, but limited expansion runway because so many customers are already at top tier).

Should I worry about NRR if I'm pre-product-market-fit?

Not yet. If you're under 100 customers, NRR is noisy (a single churn event swings it 5 points). Focus on churn rate (%, not MRR), and get to product-market fit first (healthy engagement, word-of-mouth growth, low gross churn). Once you're at 200+ customers with sub-5% gross churn, NRR becomes actionable. Until then, it's premature optimization.

The Bottom Line

MRR growth % tells you if revenue is accelerating. Gross churn % tells you if customers are stable. NRR % tells you if existing customers are expanding faster than they're churning. An NRR above 100% is the definition of a SaaS that compounds without new customer acquisition. Velocity ships all three in the top-left tile so you see them before anything else. Build the queries today, populate the dashboard, and obsess over NRR. If it's above 110%, you've unlocked a machine that funds itself. If it's below 90%, fixing product fit is more urgent than adding features.

Want to dig deeper into the cohort retention curves behind these numbers? Check cohort retention curves to see how churn shapes up over customer lifetime. Or view Velocity pricing to see how MRR, churn, and NRR ship in the full dashboard suite.

Let us make some quick suggestions?
Please provide your full name.
Please provide your phone number.
Please provide a valid phone number.
Please provide your email address.
Please provide a valid email address.
Please provide your brand name or website.
Please provide your brand name or website.