Monthly recurring revenue (MRR) is the predictable subscription revenue a business earns in one month, with every plan normalized to a monthly amount. It is the single most-watched growth metric for SaaS and subscription startups because, unlike one-off sales, it recurs - so it measures the durable size of the business, not last month's luck.
If you only remember one sentence: MRR is the sum of the monthly value of every active, paid subscription, net of discounts.
The MRR formula
There are two equivalent ways to write it.
Bottom-up (the honest one):
MRR = Σ (monthly value of each active paid subscription − its discounts)
Top-down (the quick one):
MRR = paying customers × average revenue per account (ARPA)
The top-down version is useful for napkin math and for spotting whether growth is coming from more customers or from higher prices. The bottom-up version is what your billing system (and HitMRR) actually computes, and it is the one you should trust when the two disagree.
A worked example
Say a startup has these subscriptions on the last day of the month:
| Customer | Plan | Billing | Price | Monthly value |
|---|---|---|---|---|
| A | Starter | monthly | $29/mo | $29.00 |
| B | Pro | monthly | $79/mo | $79.00 |
| C | Pro | yearly | $790/yr | $65.83 |
| D | Team | monthly, 20% coupon | $199/mo | $159.20 |
| E | Pro | weekly | $20/wk | $86.67 |
| F | Starter | monthly, trialing | $29/mo | $0 |
| G | Pro | monthly, past due | $79/mo | $0 |
MRR = 29 + 79 + 65.83 + 159.20 + 86.67 = $419.70.
Customer C pays $790 once a year, but only one-twelfth of that is this month's recurring revenue. Customer E pays weekly; a year has 52 weeks and 12 months, so a weekly price is worth 52 ÷ 12 ≈ 4.33× per month. Customer D's coupon is subtracted because MRR is what customers actually pay. Customers F and G contribute nothing: one hasn't paid yet, the other has stopped paying.
Normalizing billing intervals
Every plan gets converted to "what is this worth per month":
| Billing interval | Monthly value |
|---|---|
| Weekly | price × 52 ÷ 12 |
| Monthly | price |
| Quarterly | price ÷ 3 |
| Every 6 months | price ÷ 6 |
| Yearly | price ÷ 12 |
| Every N months | price ÷ N |
A common mistake is to count an annual payment in full in the month it lands. That makes MRR spike in good months and collapse afterwards, which hides what is actually happening to the business. Cash collected and recurring revenue are different numbers; keep them apart.
What to exclude
Accurate MRR leaves out anything that isn't recurring, paid, and active:
- Free trials. No revenue has been collected. Count them the day they convert.
- Past-due and unpaid subscriptions. A subscription whose last invoice failed is not revenue until it's paid. Most billing systems mark these
past_dueorunpaid. - One-time charges. Setup fees, consulting, add-on purchases and usage overages aren't recurring. They're revenue, but not MRR.
- Cancelled subscriptions. Once a subscription is cancelled it's gone, even if the customer is still inside a paid period. (Some teams count it until the period ends; pick one rule and stick to it.)
- Taxes. MRR is pre-tax.
- Test-mode data. Obvious, but worth saying: revenue from your own test cards doesn't count.
Including any of these inflates the number and, worse, hides real churn until it's already happened.
The five MRR movements
Month-over-month, MRR changes for exactly five reasons. Splitting your growth into these is the difference between "we grew 8%" and knowing why.
| Movement | What it is | Sign |
|---|---|---|
| New MRR | Brand-new paying customers | + |
| Expansion MRR | Existing customers upgrading, adding seats, or buying add-ons | + |
| Reactivation MRR | Previously churned customers coming back | + |
| Contraction MRR | Existing customers downgrading or applying discounts | − |
| Churned MRR | Customers cancelling entirely | − |
Net new MRR = new + expansion + reactivation − contraction − churn. It's the number that tells you whether the business is compounding or leaking.
A useful derived metric is the SaaS quick ratio: (new + expansion) ÷ (contraction + churn). Above 4 is excellent; between 2 and 4 is healthy; below 1 means you're shrinking regardless of how many new logos you sign.
MRR growth rate
MRR growth rate = (this month's MRR − last month's MRR) ÷ last month's MRR
Growth compounds, so small monthly rates matter more than they look: 10% a month is 3.1× in a year; 15% a month is 5.4×.
Rough benchmarks by stage, from public SaaS data and investor rules of thumb:
- Pre-seed / seed (< $10k MRR): 15–20% month-over-month is strong, 10% is solid. Below that, the launch hasn't found its channel yet.
- Seed to Series A ($10k–$100k MRR): 8–12% is good.
- Growth stage (> $100k MRR): 3–8% monthly on a big base is what Series B investors expect.
Benchmarks are a floor for ambition, not a verdict. A bootstrapped founder at 6% monthly with no marketing spend is doing something right.
MRR vs ARR
ARR (annual recurring revenue) is simply MRR × 12. Early-stage startups report MRR because monthly numbers are more granular and more honest about churn; later-stage companies and investors talk in ARR because the numbers are large and contracts are often annual. MRR vs ARR covers when to use which and the traps in converting.
Common mistakes
- Counting cash, not recurring revenue. Annual payments booked in full. See normalization above.
- Including trials. Especially with card-required trials - "they'll probably convert" is not revenue.
- Ignoring discounts. A $100 plan with a 50% lifetime coupon is $50 of MRR.
- Mixing currencies. If you bill in EUR and USD, convert to one currency at a consistent rate before summing, otherwise exchange-rate moves show up as fake growth.
- Reporting a screenshot. Anyone can type a number into a dashboard mock. If you want the figure to be believed, make it verifiable.
How HitMRR computes it
Stripe's dashboard shows an MRR figure, but there is no MRR endpoint in the Stripe API. HitMRR reads your active subscriptions through a read-only restricted key and applies exactly the rules above: active and paid only, normalized to monthly (weekly plans × 52 ÷ 12), net of coupons, trials and past-due excluded. Everything is then converted to USD with a daily exchange rate so a EUR startup and a USD startup rank fairly on the leaderboard. Test-mode keys are silently hidden from every public board.
The result matches what Stripe shows you, refreshed every 30 minutes, and it can't be typed in by hand. See the FAQ for how verification and key handling work.