Metric · Revenue

What is MRR, and how do you measure it in Metabase?

MRR (monthly recurring revenue) is the normalized monthly value of all your active subscriptions. It's the core signal of a subscription business: predictable, comparable month to month, and the base for churn, retention, and LTV. Measure it in Metabase from billing data synced into a database (Stripe, Chargebee, Paddle, or Recurly).

TL;DR — MRR = sum of active subscriptions' recurring amount, eachnormalized to a month (annual ÷ 12) and converted to one currency.ARR = MRR × 12. Exclude one-time charges, taxes, and refunds.

How is MRR calculated?

For each active subscription, normalize its recurring price to a monthly amount:

  • Monthly plan — take the amount as-is.
  • Annual plan — divide by 12.
  • Other intervals — convert to a monthly equivalent (e.g. quarterly ÷ 3, weekly × 52 ÷ 12).
  • Multiply by quantity, then sum across all active subscriptions.

ARR (annual recurring revenue) is simply MRR × 12 — don't sum annual contract values separately, or you'll double-count.

MRR movement

A single MRR number hides what's happening underneath. Break the month-over-month change into components so you can see growth and leakage:

  • New MRR — from newly acquired subscriptions.
  • Expansion MRR — upgrades, add-ons, and seat increases.
  • Contraction MRR — downgrades and seat decreases.
  • Churned MRR — from canceled or lapsed subscriptions.

Net new MRR = new + expansion − contraction − churned. A monthly waterfall of these components is the single most useful revenue chart.

What data does MRR need?

  • Active subscriptions with their status and quantity.
  • The plan/price behind each subscription, with amount and billing interval.
  • A single reporting currency (convert multi-currency with a documented rate).
  • For movement and trends, a monthly MRR model — one row per subscription per month.

SQL patterns

Current MRR (normalized)PostgreSQL

Amounts in cents; adjust for tools that store major units (Recurly v3).

SELECT
  ROUND(SUM(
    CASE p.interval
      WHEN 'year'  THEN p.unit_amount / 100.0 / 12.0
      WHEN 'month' THEN p.unit_amount / 100.0
      WHEN 'week'  THEN p.unit_amount / 100.0 * 52.0 / 12.0
      WHEN 'day'   THEN p.unit_amount / 100.0 * 365.0 / 12.0
    END * si.quantity / NULLIF(p.interval_count, 0)
  ), 2) AS mrr_now
FROM subscription_items si
JOIN prices p        ON p.id = si.price_id
JOIN subscriptions s ON s.id = si.subscription_id
WHERE s.status IN ('active', 'past_due');
MRR and net new MRR by monthPostgreSQL

Built on a monthly MRR model so every revenue chart agrees.

-- Requires a monthly MRR model: one row per subscription per month
SELECT
  month,
  ROUND(SUM(mrr), 2)                         AS mrr,
  ROUND(SUM(mrr) - LAG(SUM(mrr)) OVER (ORDER BY month), 2) AS net_new_mrr
FROM modeled_mrr
GROUP BY month
ORDER BY month;

Pitfalls

Summing raw plan amounts.→ Normalize every interval to a monthly figure first — annual plans are not monthly revenue.
Counting one-time charges and tax.→ MRR is recurring only; exclude setup fees, one-time items, tax, and refunds.
Mixing currencies.→ Convert to one reporting currency, or split by currency and say so.
Re-deriving MRR in every question.→ Build one monthly MRR model and reuse it so numbers don't drift.

Where this metric applies

Analytics

Metrics

FAQ

What's the difference between MRR and ARR?
ARR is just MRR × 12. Compute MRR once (normalized to a month) and multiply — don't sum annual contract values separately or you'll double-count.
Should trials count toward MRR?
Usually no — a trial isn't paying yet. Track trials separately and count them in MRR only once they convert to a paid subscription.
Do usage-based charges belong in MRR?
Pure usage revenue isn't recurring in the classic sense. Many teams report a committed/subscription MRR plus a separate usage line rather than blending them.