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).
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
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');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
Where this metric applies
- Stripe + Metabase — subscription items × prices
- Chargebee + Metabase — subscriptions × plans/item prices
- Paddle + Metabase — subscription items × prices
- Recurly + Metabase — subscriptions × plans