SaaSGuide
daLæs på danskSaaS Metrics Explained: MRR, Churn, LTV and CAC
SaaS metrics explained with worked examples in euros: MRR, churn, LTV and CAC, the mistakes that inflate them, and how to pull them from your own database.

Freelance full-stack developer
- Published
- Reading time
- 13 min
In this post9
Four numbers tell you whether a subscription business is healthy: MRR (monthly recurring revenue), churn (the customers and revenue you lose), LTV (what a customer is worth over the whole relationship) and CAC (what it costs to win one). Below are those core SaaS metrics explained with formulas, one worked example in euros, and the SQL to pull them straight from your own database. Get MRR and churn right first, because everything else is calculated from them.
I am a freelance developer, not an accountant. My focus is that the numbers are calculated the same way every month and come out of the system without a spreadsheet ritual.
The short answer
These are the seven numbers most early-stage SaaS founders need. The examples use a made-up B2B tool with 100 paying customers at the start of the month: 80 pay €50 per month and 20 pay €480 per year. All figures exclude VAT.
| What it measures | Formula | Example | |
|---|---|---|---|
| MRR | Monthly value of active, paying subscriptions | Sum of each subscription's monthly price | 80 × €50 + 20 × €40 = €4,800 |
| ARR | MRR expressed per year | MRR × 12 | €57,600 |
| ARPU | Average MRR per paying customer | MRR ÷ paying customers | €4,800 ÷ 100 = €48 |
| Customer churn | Share of customers who leave | Customers lost ÷ customers at start | 3 ÷ 100 = 3% |
| Revenue churn | Share of MRR lost | MRR lost ÷ MRR at start | €190 ÷ €4,800 = 4% |
| LTV | What an average customer contributes | ARPU × contribution margin ÷ customer churn | €48 × 0.8 ÷ 0.03 = €1,280 |
| CAC | Cost of winning one new paying customer | Sales and marketing spend ÷ new customers | €3,000 ÷ 10 = €300 |
My rule: if you only track two numbers, track MRR and churn, every month, from your first paying customer. LTV and CAC become useful once you have enough customers and enough months that a single cancellation no longer swings them.
The steps that lead up to your first paying customers are in my step-by-step guide to building a SaaS.
MRR: what counts and what doesn't
MRR is the monthly value of all active, paying subscriptions. Every other metric in this post builds on it, so lock the definition down early. Four rules cover most cases:
- Annual plans are divided by 12. A customer who pays €480 in January adds €40 to MRR every month of the year, not €480 in January.
- VAT stays out. In the EU you collect it on behalf of the tax authorities, so it was never your revenue.
- One-off fees stay out: setup fees, paid onboarding, consulting hours and add-ons that don't repeat.
- Free accounts and trials don't count until they pay.
Discounts are a judgment call. Stripe always subtracts permanent discounts, lets you decide for time-limited ones, and calls subtracting them a more conservative approach in its billing metric definitions. I subtract every ongoing discount: 50% off forever turns a €50 customer into a €25 one.
Selling across Europe usually means several currencies. Convert everything to one reporting currency at a fixed monthly rate, or exchange-rate swings show up as fake growth or churn. Stripe reports FX effects separately for the same reason.
Where the movement comes from
A single MRR figure is a snapshot. The useful part is the month-to-month change, split into five parts. Here's the next month in the example:
- New MRR: 10 new customers on a monthly plan, +€500
- Expansion: 4 customers add a seat at €25, +€100
- Contraction: 2 customers remove a seat, -€50
- Churned MRR: 2 monthly customers cancel and 1 annual customer doesn't renew, -€140
- Reactivation: none this month
MRR ends at €5,210. Growth looks healthy, but the breakdown shows what the total hides: without new customers, MRR would have dropped. How much room you have for expansion revenue depends on your pricing, which I cover in nine SaaS pricing models and how to choose.
Churn: customers lost vs revenue lost
Customer churn is the number of customers who leave divided by the number you had at the start of the period: 3 out of 100, or 3%. Revenue churn, also called gross MRR churn, is the MRR lost to cancellations and downgrades divided by starting MRR: (€140 + €50) ÷ €4,800, just under 4%.
Revenue churn above customer churn means your bigger accounts are the ones leaving or cutting back, which usually hurts more than the reverse.
Three things trip people up:
- Net churn hides losses. Subtract expansion and you get net revenue churn: (€190 minus €100) ÷ €4,800 = 1.9%. Its mirror image is net revenue retention (NRR), about 98% for the month here. Both are useful, but a16z warns that net churn understates the damage, so always report gross churn next to it.
- Monthly churn doesn't multiply by 12. Losing 3% a month adds up to roughly 31% a year, not 36%, because each month you lose 3% of a slightly smaller base.
- Pick one definition and keep it. Stripe divides by customers at the start plus new customers during the period, which gives 3 ÷ 110 = 2.7% here. Neither version is wrong, but switching halfway through the year makes months impossible to compare.
Some churn is nobody's decision, just an expired card or a failed payment. I cover how to find and fix those in the technical causes of SaaS churn.
LTV and CAC: what a customer is worth vs what it costs
Lifetime value (LTV)
LTV estimates what an average customer contributes before they leave. The simple formula is ARPU divided by customer churn, which is also how Stripe calculates it. With €48 and 3% churn, that's €1,600.
That figure flatters you because it uses revenue. a16z recommends contribution margin instead: revenue minus the variable cost of serving each customer, such as hosting, payment fees, support and any AI usage. At an 80% margin, LTV becomes €48 × 0.8 ÷ 0.03 = €1,280.
The formula is also very sensitive. One extra cancellation that moves churn from 3% to 4% drops LTV from €1,280 to €960. With few customers, LTV can swing by hundreds of euros without anything real changing. A more grounded number is first-year value: at 3% monthly churn, a new customer pays for just over 10 of their first 12 months on average, which works out to about €390 in contribution.
Customer acquisition cost (CAC)
CAC is your total sales and marketing spend in a period divided by the new paying customers you won in that period. The example company spends €3,000 on ads, tools and content and wins 10 customers, so CAC is €300.
It's easy to calculate CAC too low. Include discounts, free months and referral rewards, as a16z also points out. If you do the selling yourself, put an hourly rate on your time, or the channel looks cheap until you have to pay someone else to run it. Also split blended CAC (all channels) from paid CAC (ads only); only the second shows whether paid acquisition pays off.
CAC payback: putting them together
An LTV of €1,280 against a CAC of €300 is a ratio of just over 4 to 1. I find payback period easier to act on: CAC divided by monthly contribution per customer. Here that's €300 ÷ €38.40 (€48 × 0.8), just under 8 months. That's how long a new customer must stay to earn back their acquisition cost. If payback is longer than customers typically stay, every new customer loses you money.
How to pull SaaS metrics from your own database
Stripe, Paddle and similar providers only show MRR and churn for the payments that run through them. Once some customers pay by invoice, you use more than one billing provider, or you want revenue next to product usage, the numbers have to come from your own database. Here's how I'd set it up in a Laravel app with Laravel Cashier; the pattern carries over to other stacks.
- Store the price locally. Cashier keeps each subscription's status and Stripe price ID in its
subscriptionstable, but not the amount, as the Laravel Cashier documentation shows. Add a table with price ID, amount in cents excluding VAT, currency and billing interval. If a subscription has several prices, they live insubscription_items, so sum from there. - Keep status in sync. Cashier updates its tables from Stripe webhooks once webhook handling is configured. Without it, canceled customers stay "active" in your database.
- Keep history, not just the present. The
subscriptionstable tells you what's true today. To calculate March churn, you need to know what was true on March 1. The simplest fix is a monthly snapshot: a table with date, account and MRR, filled by a scheduled command on the first of each month. - Normalize to one month and one currency. Divide annual prices by 12, store amounts as integer cents to avoid rounding errors, and convert GBP, SEK or DKK to your reporting currency at a fixed monthly rate.
- Query and reconcile. With snapshots in place, MRR and churn are short queries. Compare with Stripe's dashboard for the first month. Differences almost always come down to a definition: discounts, trials or failed payments.
Example: snapshot, MRR and churn in SQL
The snapshot stores each paying account's MRR on the day. Like Stripe, it counts active and past_due subscriptions as paying. Subscriptions in a trial have the status trialing and are left out. In B2B the paying party is usually a team or a company rather than a person, so make sure you snapshot billable accounts, not users. The example assumes a single currency.
INSERT INTO mrr_snapshots (taken_on, user_id, mrr_cents)
SELECT
CURRENT_DATE,
s.user_id,
SUM(
CASE p.billing_interval
WHEN 'year' THEN p.amount_cents / 12
ELSE p.amount_cents
END * COALESCE(s.quantity, 1)
)
FROM subscriptions s
JOIN prices p ON p.stripe_price = s.stripe_price
WHERE s.stripe_status IN ('active', 'past_due')
GROUP BY s.user_id;
MRR and customer count per month is then a simple grouping:
SELECT
taken_on,
COUNT(*) AS customers,
SUM(mrr_cents) / 100 AS mrr_eur
FROM mrr_snapshots
GROUP BY taken_on
ORDER BY taken_on;
March churn means finding accounts that were there on March 1 but are missing on April 1:
SELECT
COUNT(*) AS churned_customers,
SUM(m.mrr_cents) / 100 AS churned_mrr_eur
FROM mrr_snapshots m
LEFT JOIN mrr_snapshots a
ON a.user_id = m.user_id
AND a.taken_on = '2027-04-01'
WHERE m.taken_on = '2027-03-01'
AND a.user_id IS NULL;
Divide the result by the customer count and MRR from March 1, and you have customer churn and revenue churn for the month. Expansion and contraction work the same way: compare MRR for the accounts that appear in both snapshots.
Mistakes that make the numbers look better than they are
Most calculation errors in SaaS metrics push in the same direction: they make the business look healthier. Watch for these:
- Counting an annual payment as MRR in the month it arrives, which creates a fake spike followed by a slow "decline".
- Counting trial users and free accounts as customers, which distorts both ARPU and churn.
- Mixing up users and customers. A company with 12 seats that cancels is one lost customer, not twelve.
- Leaving failed payments "active" for months. Stripe counts
past_duein MRR but treats a subscription as churned once it's marked unpaid. Decide how long an account can stay past due before you count it as lost.
When you don't need to build anything
Not every product needs metrics built in, and I'd rather tell you that than sell you work you don't need.
- If every payment runs through Stripe and you have one or two plans, use Stripe's own billing dashboard. It shows MRR, churn, ARPU and LTV, and lets you choose how discounts count. No development required.
- Below 20-30 paying customers, percentages are mostly noise. A spreadsheet with customer, amount, start date and end date is enough, and your time is better spent talking to customers.
- If you run a free trial or a freemium plan, conversion often matters more than churn in the first months. I compare the models in freemium vs free trial vs paid from day one.
Building it yourself starts paying off when you have invoiced customers, several billing providers, annual contracts with custom prices, or you want revenue and product usage side by side. Your billing setup decides how much work that is, so look at my comparison of Stripe, Paddle and other subscription billing options first.
Next steps: getting your metrics in order
Start with definitions, not dashboards. Write down what counts as a paying customer and how you handle annual plans, discounts, currencies and failed payments. Then stick to it, so one month can be compared with the next.
Checklist: can you trust your SaaS metrics?
- MRR excludes VAT, one-off fees, free accounts and trials
- Annual plans are divided by 12
- Ongoing discounts are subtracted
- Churn is tracked as both customers and revenue, with gross churn reported next to net churn
- A customer means a paying account, not a user
- There's a fixed rule for when a failed payment becomes churn
- All currencies are converted to one reporting currency at a fixed monthly rate
- LTV is based on contribution margin
- CAC includes discounts, tools and your own time
- A snapshot is saved every month so history isn't lost
- The numbers have been reconciled with your billing provider at least once
Once MRR and churn are in place, the next number to add is activation: how many new customers actually start using the product. That needs events from inside the product, and I compare the tools for it in GA4 vs Plausible vs PostHog.
If you want metrics built into a SaaS you already run, or into one you're planning, here's how I approach SaaS development for founders and B2B teams.
Frequently asked questions
What is a good churn rate for SaaS?
There's no single good number, because churn depends heavily on who you sell to. Products for small businesses and individuals typically see higher churn than products sold to larger companies on annual contracts. Compare yourself with your own history rather than an average you found online. If churn rises three months in a row, treat it as a warning sign, whatever the level.
How do I measure churn on annual plans?
Measure the renewal rate among the customers who were actually up for renewal in the period. An annual customer can only leave once a year, so in monthly customer churn they look artificially stable. If 18 of 20 annual customers renew in January, your renewal rate is 90%. If you sell both monthly and annual plans, report them separately.
Is MRR the same as revenue in my accounts?
No. MRR is an operating metric that shows the current value of your subscriptions, while your accounts follow accounting rules. An annual payment of €480 in January counts as €40 of MRR each month, but how it's recognized in your books depends on your accounting policies and local rules. Ask your accountant about that part, and use MRR to run the business.
Which SaaS metrics do investors ask about first?
Expect questions about MRR growth, churn and CAC, and expect investors to look past the headline figures. According to a16z, investors weigh paid CAC more heavily than blended CAC when judging whether a business is viable, and the same list pairs monthly customer churn with retention by cohort. Have gross and net revenue churn ready, and be able to explain exactly how you define each metric.