A SaaS company stopped reconciling MRR before every board meeting

Stripe, the finance model and the CRM each showed a different MRR. We agreed one set of definitions with finance, sales and product, built the data model, and replaced a hand-built board pack with Power BI dashboards that refresh daily.

5 min readPublished with the client's approvalUpdated September 2026

Stripe$412k
Finance model$398k
Sales CRM$455k
MRR, one definition$412,300
MRR$412k+6.1%
Net revenue retention108%+3 pts
Logo churn1.9%−0.4 pts
Expansion share34%+5 pts
MRR by month
Headline result
[n] days

of manual reporting removed every month.

Sample data
Client
B2B SaaS company, [stage]
Industry
SaaS & startups
Region
[Region]
Timeline
[n] weeks
Services
KPI frameworks, BI dashboards
Engagement
Project, [n] weeks
[n] daysof manual reporting removed each month
1MRR definition across Stripe, CRM and finance
[n]dashboards used every week
[x]%of leadership opening dashboards weekly
In one minute

The short version

Problem

Three versions of MRR, and a board pack rebuilt by hand every month.

What we did

Agreed metric definitions, built one SQL data model and three Power BI dashboards.

Result

[n] days of reporting removed each month, and one number in every meeting.

The challenge

Every board meeting started with a reconciliation

Stripe counted annual plans as revenue on the day they were paid. Finance spread them over twelve months. Sales reported bookings from the CRM. All three were defensible, so the first twenty minutes of every board and leadership meeting went on explaining the gap.

Board confidenceInvestors kept asking why the numbers moved between decks.
Slow decisionsPricing and hiring waited for a reconciled number.
Analyst time[n] days a month went on copying exports into slides.
Starting point

What we had to work with

The data was all there, spread across billing, CRM and the product database, with no shared account ID between two of them.

BillingStripe subscriptions, invoices, upgrades and refunds.
CRMHubSpot deals, account owners and contract dates.
Product dataUsage events from the application database.
ConstraintMid-month upgrades and annual prepaid plans broke the simple monthly totals.
What we did

Four steps, one decision that mattered

  1. Agreed the definitionsWorkshops with finance, sales and product on MRR, net revenue retention and churn.
    Week 1 Led to finding 1
  2. Built the data modelJoined Stripe, HubSpot and product data in SQL with one account ID.
    Weeks 2 to 3 Led to finding 2
  3. Designed the dashboardsBoard, sales and product views, each built around the questions that team asks.
    Weeks 3 to 5
  4. Handed overTraining, documentation and a daily refresh with failure alerts.
    Week 6
The key decision

We normalised annual and prepaid plans into monthly revenue and counted upgrades from the day they took effect, so MRR matched how finance reports revenue.

Results

What changed

Before

  • Three MRR numbers in three tools
  • A board pack rebuilt by hand monthly
  • Expansion revenue invisible

After

  • One MRR definition, documented
  • Dashboards that refresh every morning
  • Expansion tracked by account
Finding 1 from step 1

[x]% of the MRR gap came from annual plans counted up front

Most of the disagreement was a definition problem, not a data problem.

Annual plansUpgradesRefundsFX
Sample data shape. Replace with the anonymised chart from the project.
So what: one definition closed most of the gap before any dashboard was built.
Finding 2 from step 2

Expansion from existing accounts drove [x]% of growth

Growth was coming from customers upgrading, not only from new logos.

Month 1Month 6Expansion from existing accounts
Sample data shape. Replace with the anonymised chart from the project.
So what: the company moved a customer success hire ahead of a new sales hire.

"[One or two sentences from the client about the result, in their own words. The most specific number wins.]"

[Name][Role], [B2B SaaS company]
Approved for publishing
Facing a similar problem?Tell us what's going on. We'll say honestly whether we can help, and how.
What they received

Everything stayed with the client

Metric dictionaryDefinitions for MRR, NRR, churn and expansion, signed off by finance.
SQL data modelStripe, HubSpot and product data joined by account.
Power BI dashboardsBoard, sales and product views, refreshed daily.
HandoverTraining sessions and written documentation.
What it took

The engagement, and what it would take for you

EngagementProjectQuoted from a written scope
Timeline[n] weeksFrom first call to handover
Client time~1 hr / weekOne owner answering questions
Price rangefrom $6,000Estimate your project

Services used

Recommendations and impact

What the client did next

RecommendationExpected effectConfidence
Review expansion accounts monthly with customer successEarlier upgrade conversationsHigh
Set a net revenue retention target for the boardA growth goal everyone can trackMedium
Add product activation data nextEarlier churn signalsMedium
Honest limits

What this project can't tell you

  • Data before [year] was incomplete, so trends start from [year].
  • Revenue in other currencies was converted at month-end rates.
  • Figures are rounded and anonymised with the client's approval.
Technical appendix

For the analysts in the room

Buyers can skip this. Technical reviewers usually want to see it.

DefinitionsMRR, NRR, expansion
MRR: recurring revenue normalised to one month; annual plans divided by 12. Net revenue retention: revenue this month from customers who existed 12 months ago, divided by their revenue then.
Methodwhy this approach, not another
Definitions came first because most of the gap was definitional. Building dashboards on the old numbers would have automated the argument, not settled it.
Data and toolssources, volumes, stack
Stripe and HubSpot loaded into PostgreSQL, modelled in SQL, reported in Power BI with a daily refresh.
Check the workcode sample
The key step: turning every plan, monthly or annual, into monthly recurring revenue.
-- Normalise every active subscription to monthly recurring revenue
SELECT date_trunc('month', m.month) AS month,
       SUM(CASE s.interval
             WHEN 'year'  THEN s.amount / 12.0
             WHEN 'month' THEN s.amount
           END) AS mrr
FROM months m
JOIN subscriptions s
  ON m.month BETWEEN s.start_date AND COALESCE(s.end_date, m.month)
GROUP BY 1 ORDER BY 1;
View the sample repository
Questions

Questions readers ask about this project

Is Stripe data enough to do this?
For revenue metrics, usually yes. Adding the CRM and product data makes expansion and churn signals much stronger.
Will investors trust numbers from a dashboard?
Yes, when the definitions are written down and match finance. That is why definitions come before dashboards.
Can our team change the dashboards later?
Yes. Everything is built in your Power BI tenant and documented for whoever takes it over.
What would a similar project cost us?
Projects start at $6,000 and are fixed from a written scope. The pricing page has an estimator.

Reconciling MRR before every board meeting?

Most SaaS teams we talk to have the same three-way argument between billing, finance and sales. In 30 minutes we can tell you how much of it is definitions and what fixing it would take.

  • Stripe and finance show different MRR
  • The board pack is built by hand every month
  • Nobody can say how much growth is expansion

On the call we will

  • Compare how each team defines MRR
  • Check which data sources you already have
  • Outline a first step and its cost
Book a free 30-minute call Or start with a $1,800 Health CheckOr read about BI dashboards & reporting automation
Similar problem? 30-minute call, freeBook a call