kimo

Metrics layers, explained with one MRR definition

Ask four teams for last month’s MRR and you will get four numbers, all defensible. A metrics layer does not pick a winner by decree — it makes each definition explicit, names it, and makes the default one impossible to misuse.

Inès Dupuis
Head of Data11 min read

Here is a scene from almost every Series B company. The CEO opens the board deck: MRR is €1.42M. The VP Sales shares the pipeline review: €1.51M. Finance closes the month at €1.37M. The product dashboard, built two years ago by an intern, says €1.46M. Everyone is right. Nobody is aligned.

This post walks through those four numbers, why each exists, and how to encode them in a metrics layer so that “MRR” on any chart means one documented thing.

01 —

The four MRRs

DefinitionOwnerIncludesExcludes
Billing MRRProductAll active + past-due subscriptionsNothing — it is raw Stripe
Contracted MRRSalesSigned contracts, incl. future start datesChurn notices not yet effective
Recognised MRRFinanceRevenue recognised in the periodPast-due > 30 days, credits, one-offs
Normalised MRRLeadershipAnnual plans ÷ 12, FX at budget rateDiscounts flagged as temporary
Simulated company. Every column is a legitimate business choice, not an error.
Four MRR definitions, same company, same months
  • Billing
  • Contracted
  • Recognised
  • Normalised
Figure. Simulated data, € thousands. The gap between contracted and recognised MRR peaks after a big signing with a delayed start date.
02 —

What a metrics layer actually is

Strip away the vendor vocabulary and a metrics layer is three things: a named measure with an owner, the SQL that computes it from modelled tables, and the dimensions it can legally be sliced by. Tools query the name, not the SQL. That indirection is the whole trick.

Without it, every dashboard embeds its own sum(amount) with its own filters. With it, dashboards say measure: mrr_recognised and the definition lives in one reviewable place.

03 —

Encoding one MRR — properly

We recommend picking one default and making the others explicit variants. For most companies the default should be the finance definition, because it is the one that reconciles with the books.

models/revenue.yml
yaml
measures:
  - name: mrr
    label: MRR
    description: Recognised MRR. Reconciles with the monthly close.
    sql: sum(recognised_amount_monthly)
    filters:
      - status in ('active', 'past_due')
      - days_past_due <= 30
      - line_type = 'recurring'
    owner: finance
    default: true

  - name: mrr_contracted
    label: MRR (contracted)
    description: Signed ARR / 12, including future-dated starts. Sales view.
    sql: sum(contract_value_annual) / 12
    owner: revops

Two details matter more than they look. The description is shown in every tooltip and every Ask Kimo answer, so people see what they are reading. And default: true means that when someone asks for “MRR” without qualification, they get the finance number — not whichever one was created first.

The underlying SQL

models/revenue_monthly.sql
sql
select
    date_trunc('month', p.period_start)          as month,
    s.customer_id,
    s.plan_interval,
    case
        when s.plan_interval = 'year' then p.amount / 12.0
        else p.amount
    end                                          as recognised_amount_monthly,
    s.status,
    greatest(0, current_date - i.due_date)       as days_past_due,
    p.line_type
from stripe.invoice_lines p
join stripe.subscriptions s on s.id = p.subscription_id
left join stripe.invoices i on i.id = p.invoice_id
where p.line_type = 'recurring';
04 —

Governance without a committee

The failure mode of metrics layers is not technical, it is social: definitions drift because nobody owns them, or they freeze because everyone must approve a change. A few lightweight rules keep it healthy:

  1. Every measure has one owner — a team, not a person — who approves changes.
  2. Changes are versioned and shown as a diff in the activity log, with the before/after value for the last closed month.
  3. Variants are cheap — creating mrr_contracted should take two minutes, so nobody is tempted to fork a dashboard instead.
  4. Deprecate, do not delete — old definitions stay queryable with a warning badge for a quarter.
05 —

What changes when it works

The meetings get shorter. The question moves from “whose number is right?” to “why did it move?”, which is the only question worth spending an hour on. And when someone asks Ask Kimo for MRR by region, the answer comes back with a footnote that says exactly which MRR it is.

If you want to see a working revenue model with these definitions, the revenue workspace in the live demo uses the exact structure above on simulated data.

  • #Semantic layer
  • #MRR
  • #Governance
Found this useful? Pass it on.
Written by
Inès Dupuis
Head of Data at Kimo · 5 articles

Writes about Fundraising, Board meetings, SaaS metrics, Semantic layer.

People, companies and figures in this article are illustrative; charts use simulated data.

Put it to work

Go deeper

Whitepaper

The Board Pack Playbook

Metrics, narrative and data discipline for every board meeting and funding round, from seed to Series B.

28 pages
Template

Board deck

A 14-slide board deck generated from live finance, CRM and product data.

4 min setup
Live demo

Build a board deck

Generate a board deck and investor update from live, governed metrics.

Simulated data · no sign-up

All resources
ArticlePlaybooks
BI

The metrics every Series A board will ask about

What investors expect to see at each stage, how to define each number, and how to keep them consistent from deck to data room.

Inès Dupuis
11 min read
ArticleData modeling
All

Why AI analytics needs a semantic layer

LLMs are good at SQL and bad at your business definitions. Here is how governed metrics fix that.

Inès Dupuis
9 min read

Numbers your board can trust.

Board decks, investor updates and data rooms generated from live, governed metrics — not last week’s spreadsheet.