To build a SaaS metrics dashboard, pull subscription data from your billing system, normalise every plan to a monthly value, then split the month's change into five movements: new, expansion, contraction, churn and reactivation. Add net revenue retention and logo churn on the opening cohort only, and reconcile the total against your billing provider's own MRR figure before anyone presents it.
A founder with one revenue number knows what the business made last month. A founder with two is never quite sure. That is Segal's law, and it is what happens the first week your own dashboard goes live: your app reports one MRR figure, the Stripe Billing overview reports another, and the board call is on Thursday.
The gap is almost never a bug in your query. It is a definitions problem. Stripe publishes a precise definition of monthly recurring revenue, and that definition excludes several things a hand-rolled dashboard happily includes. Until your dashboard either matches the definition or shows the bridge between the two numbers, nobody in the room will trust the chart, and the team quietly goes back to a spreadsheet.
This guide builds the version that survives that meeting. You get the five movement rules written out, the edge cases that break them, net revenue retention, gross revenue retention and logo churn worked by hand on a five-customer dataset you can check with a calculator, a reconciliation step that ties your number to Stripe's, and the plan gate that keeps a revenue dashboard off the public web. Every price, plan gate and definition below was opened in a browser on 7 October 2026 and is dated where it appears.
What a reconciling SaaS metrics dashboard actually is
A SaaS metrics dashboard turns a subscription ledger into four answers: how much recurring revenue exists right now, how it changed this month, which customers moved it, and what that implies for next month. Most published tutorials stop at the first answer, which is why most dashboards get abandoned.
Three things separate a dashboard a finance team signs off from a chart that photographs well.
- A grain. Build on one row per subscription item per month, not one row per invoice. Invoices mix recurring charges, one-off fees, proration and tax. Subscription items carry the recurring value you want.
- A definition. MRR is not what you billed. Stripe defines it as the sum of the monthly-normalised value of all active and past_due subscriptions, excluding taxes, subscribers on free plans and metered usage-based products. A subscription that is canceled or marked unpaid counts as churn and stops contributing.
- A bridge. Your dashboard and your billing provider will disagree in some months. A dashboard that shows the difference and names the cause is trusted. One that hides it is replaced.
The build is the easy part now. The hard part, and where this guide spends most of its words, is agreeing what each number means before you ask for a single chart.
Why your MRR never matches Stripe
Teams meet this problem in the same order every time. The dashboard ships, the numbers look plausible for two months, then someone opens the Stripe Billing overview in a second tab and the figures are a few percent apart. A few percent of MRR is the difference between a flat month and a growth month in a board deck.
Five causes account for almost all of the gap, and all five are documented rather than mysterious.
- Taxes. If your query sums invoice totals, you are counting tax. Stripe's MRR excludes any taxes applied to the subscription.
- Usage. Metered, usage-based products are excluded from Stripe's MRR entirely and reported separately as usage revenue. A dashboard that folds consumption revenue into MRR runs permanently high.
- Delinquency. Stripe keeps past_due subscriptions in MRR. Filter on an active status alone and every customer with a failed card silently leaves your MRR but not Stripe's.
- Discounts. Whether discounts reduce MRR is a setting in Stripe, not a fixed rule. There are separate switches for recurring and one-time discounts, and permanent recurring discounts are always subtracted. Hard-code the opposite assumption and you diverge on every discounted account.
- Currency. If you bill in more than one currency, the rate you revalue at is a choice. Stripe's MRR growth report carries an explicit foreign exchange adjustment line for exactly this reason.
24 to 48 hours is how long a change to your Stripe metric definitions takes to appear. A reconciliation run straight after you flip a discount switch will not tie, and nothing is broken.
How to build a SaaS metrics dashboard with Lovable
The order below matters more than the tooling. Steps one and two decide whether the numbers are right. Steps three to five decide whether anyone sees them.
Step 1: Fix the grain and the definitions before you prompt
Write a short definitions note and keep it in the project as context. It needs five decisions: the reporting currency and the rate convention, whether past_due counts as live revenue, whether discounts are subtracted, whether metered usage is reported inside or outside MRR, and the day of the month you snapshot. Every later argument about the dashboard traces back to one of those five.
Pick the same answers your billing provider uses wherever you can. Deliberate differences are fine as long as the reconciliation panel names them.
Step 2: Connect Stripe with a read-only restricted key
A metrics dashboard reads. It never writes. In the Stripe dashboard, create a restricted key under the developer API keys section with read access to customers, subscriptions, invoices and products and nothing that can charge, refund or modify anything. Lovable's Stripe integration accepts a restricted key or a secret key, in test or live mode, and publishable keys do not work. Submit it only in the Connect Stripe form in the project chat, never as a chat message, and Lovable stores it as a backend secret rather than in your app's code.
Setting up checkout and subscriptions is a different job with different risks, and it is covered separately in Stripe payments in a Lovable finance dashboard. This build touches none of it.
Step 3: Ask for the movement table, not the chart
The common failure is prompting for a dashboard and getting four summary cards with no audit trail. Ask for the movement table first. The charts are a view over it, and a number you cannot click into is a number you cannot defend.
Build an internal SaaS metrics dashboard. Read subscriptions from my Stripe account with a read-only restricted key. Show MRR split into new, expansion, contraction, churned and reactivation, plus net revenue retention, gross revenue retention and logo churn. Normalise annual plans to one twelfth, exclude tax and metered usage, and show a reconciliation line against Stripe's own MRR figure.
That prompt names the grain, the five movements, the normalisation rule, two exclusions and the reconciliation. It is deliberately boring, and boring prompts produce dashboards that tie.
Step 4: Add the reconciliation panel
Stripe exposes three downloadable reports from the Billing overview, and the third is the one almost nobody uses. MRR per subscriber per month gives each subscriber's MRR at each month end. The subscription metrics summary carries the MRR roll-forward. Customer MRR changes is a log of every MRR change for every customer, including new subscribers, upgrades, downgrades, reactivations and churn.
Join that third export to your own movement table on customer and month. Any row that appears in one and not the other is your bridge, and in practice it lands in one of the five buckets above. A reconciliation panel that prints your MRR, Stripe's MRR and the named difference is worth more than any chart on the page.
Step 5: Publish to the workspace, not the web
On the Free and Pro plans, anyone with the link can visit your published app and you cannot restrict website access at all. On Business and Enterprise, the publish dialog's audience picker adds Workspace, meaning only logged-in workspace members can open it, and Custom, which lets you grant access to specific people or to someone outside the workspace by email. For a page that shows your revenue, Workspace is the only sensible setting.
Two Business controls are worth turning on at the same time. Workspace admins can set a default website access policy for every published project, and can block publishing while critical security findings are unresolved. The quick scan that runs when the publish dialog opens takes about ten seconds and checks database access rules, dependencies and MCP exposure. The optional deep scan takes three to thirteen minutes. Publishing from the dialog itself is free and works even at a zero credit balance.
The five MRR movement rules, worked by hand
Here is a month small enough to check with a calculator and complete enough to show every rule. The business starts September with five customers and 550 USD of MRR. Customer B pays 600 USD a year, which normalises to 50 USD a month.
Closing MRR is opening plus new plus expansion plus reactivation, minus contraction and churn: 550 plus 90 plus 60 plus 70, minus 50 and minus 80, equals 640. Five movements that net to plus 90.
640 USD closing MRR from a 550 USD opening, a 16.4 percent month. Two of the five movements were negative, and a dashboard that shows only the closing figure hides both.
The rules that keep this clean are narrow. New is a customer with no prior paid history. Reactivation is a customer who churned in an earlier period and came back, and it never counts as new. Expansion and contraction are changes to an existing paying customer, never a new line. Churn is a customer falling to zero MRR, which Stripe also applies when a 100 percent coupon is attached and your settings subtract discounts.
NRR, GRR and logo churn from the same five customers
Retention is where most dashboards go wrong, and the error is always the same one: letting new customers into the calculation. Retention measures what happened to the customers you already had. F and G are excluded entirely, because a business can hide terrible retention behind good sales for about two quarters.
Net revenue retention is the cohort's closing MRR over its opening MRR, which is 480 divided by 550, or 87.3 percent. Gross revenue retention drops expansion and is capped at 100 percent: 550 minus 50 of contraction minus 80 of churn, over 550, which is 420 divided by 550, or 76.4 percent. Logo churn is customers lost over customers at the start, one of five, or 20.0 percent. Gross revenue churn is 80 over 550, or 14.5 percent.
87.3 percent NRR against 76.4 percent GRR. The eleven-point gap is expansion revenue, and it is the first thing an experienced investor asks you to separate.
Read the two churn figures together as well. Logo churn is 20.0 percent while revenue churn is 14.5 percent, which tells you the customer who left was smaller than average. The reverse pattern, revenue churn above logo churn, means you are losing your biggest accounts, and it is the single most useful early warning a dashboard like this can produce.
Edge cases that quietly break the numbers
Each row below is a real decision your query has to make. Getting one wrong shifts the total by a few percent, which is exactly the size of gap that destroys confidence without being obvious.
One more that catches teams out: Stripe lets you choose when a subscriber becomes active, either at the start of the subscription or when the first payment arrives. The two settings move your new MRR into different months. Usage MRR is still a preview feature you sign up for, so a usage-heavy business should expect to carry that line itself for now.
What this costs and which plan you need
Read in the browser on 7 October 2026: the Free plan is 0 USD a month with workspace-private projects and five lovable.app domains. Pro starts at 25 USD a month for 100 monthly credits. Business starts at 50 USD a month for the same 100 credits, and the credit ladder on both plans runs to 10,000 credits a month, which is 2,250 USD on Pro and 4,300 USD on Business.
Business costs twice as much per credit, and for this build the reason is a single line in the feature list. Internal publish, described on the pricing page as publishing websites only accessible to logged in workspace members, is a Business feature. So are role-based access, SSO and the security centre. If the dashboard is yours alone and lives behind nothing, Pro is enough. The moment a second person needs to open a page showing company revenue, the plan question answers itself.
The credit ladder and what a build actually consumes are broken down in Lovable pricing explained and what an MVP really costs in credits. If you are weighing this against selling the thing you build, the unit economics live in what it costs to sell an app built with Lovable.
Two September and October additions are worth knowing about before you design the data layer. The Lovable API arrived on 17 September 2026 and lets you read analytics and manage projects from your own scripts, with key creation requiring a Business or Enterprise plan, and workspace API keys can now be restricted to an IP allowlist. A Looker connector landed on 23 September 2026 specifically so the numbers in an app match the measures an analytics team has already defined, which is a cleaner answer than recomputing them if your company already runs Looker. The wider connector picture is mapped in the Lovable connectors finance stack.
Common mistakes
Summing invoice totals instead of subscription items
This is the single most common cause of an inflated dashboard. Invoice totals carry tax, one-off setup fees, proration and usage. None of those belong in MRR. Build from subscription items and the figure starts behaving.
Filtering on active subscriptions only
A customer whose card failed is still a customer. Stripe keeps past_due in MRR until the subscription is canceled or marked unpaid. Dropping them understates MRR and, worse, makes your churn look like it spikes and recovers on payment-retry cycles rather than on real cancellations.
Letting new customers into the retention calculation
Net revenue retention computed on everyone, rather than on the opening cohort, is not net revenue retention. It is a growth rate wearing a retention label. In the worked example above, including F and G would have turned 87.3 percent into something comfortably over 100 percent while five customers were losing value.
Treating a refund as negative MRR
A refund returns cash for something already billed. It does not change the forward-looking recurring value of the subscription. Subtract refunds from MRR and your chart will dip in months where nothing about the subscription base changed. Keep refunds in a cash view where they belong.
Publishing a revenue dashboard to the open web
On Free and Pro there is no website access control, so a published app is public to anyone holding the URL. People discover this after sharing a link in a group chat. Decide the audience before the first publish, not after, and on Business set the workspace default so the safe option is the one you get by accident.
Frequently asked questions
What is the MRR formula?
MRR is the sum of every active subscription's monthly-normalised recurring value, excluding tax, free plans and metered usage. Annual plans are divided by twelve, quarterly by three. Month on month, closing MRR equals opening MRR plus new, expansion and reactivation, minus contraction and churn.
How do you calculate churn for SaaS?
Calculate two separate figures and never average them. Logo churn is customers lost in the period over customers at the start of the period. Gross revenue churn is churned MRR over opening MRR. Stripe's own subscriber churn rate uses a slightly wider denominator, adding new subscribers in the period to the opening count, so quote whichever you use.
What does a 20 percent churn rate mean?
It depends entirely on which churn and over what period. Twenty percent monthly logo churn means you replace your whole customer base in about five months, which is usually fatal. Twenty percent annual logo churn on an enterprise book is ordinary. Always state the metric and the period in the same sentence.
What is the difference between net revenue retention and MRR?
MRR is a level: how much recurring revenue exists today. Net revenue retention is a rate measured on one cohort over time: what happened to the revenue from the customers you already had, counting upgrades and downgrades but never new customers. A business can grow MRR while NRR falls, which is exactly the pattern investors look for.
What does 120 percent net revenue retention mean?
It means the customers you had at the start of the period are now worth 20 percent more than they were, after every downgrade and cancellation. Expansion exceeded losses. Gross revenue retention cannot exceed 100 percent, so quoting GRR alongside NRR shows how much of the growth is expansion rather than retention.
Why does my dashboard disagree with Stripe's MRR figure?
Almost always tax, usage revenue, delinquent subscriptions, discount settings or currency conversion, in that order of frequency. Download the customer MRR changes report from the Stripe Billing overview, join it to your own movement table on customer and month, and the differing rows will name the cause themselves.
Key takeaways
- Build on one row per subscription item per month. Invoice totals carry tax, proration and one-off fees that do not belong in MRR.
- Closing MRR equals opening plus new, expansion and reactivation, minus contraction and churn. Show all five movements, not just the total.
- Compute retention on the opening cohort only. New and reactivated customers belong in growth, never in NRR or GRR.
- NRR above GRR is expansion. Revenue churn above logo churn means your larger accounts are the ones leaving.
- Stripe excludes tax, free plans and metered usage from MRR, counts past_due as live, and treats discount handling as a setting rather than a rule.
- Workspace-only publishing is a Business feature. On Free and Pro a published app is reachable by anyone with the link.
What to watch next
- Does your NRR hold above 100 percent for three consecutive months, or was one expansion deal carrying it?
- Does revenue churn stay below logo churn, or have you started losing the larger accounts?
- Does the reconciliation gap to Stripe stay inside one percent of MRR after you fix the five usual causes?
- Does Stripe's Usage MRR preview reach general availability, which would move usage-heavy businesses off a self-maintained line?
- Does your delinquent MRR figure fall after payment-retry changes, or is it quietly becoming permanent churn?
Segal's law has a resolution, and it is not throwing away one of the watches. It is knowing, to the dollar, why they differ. That is what the reconciliation panel is for, and it is the only part of this dashboard nobody else will build for you.
About the author
TJ Alam is a certified Lovable Expert (Website Builder track) and the founder of Digi Flock Enterprises. He built tjalam.com and cyberdance.in with Lovable. His Expert listing is in the Lovable partner directory.
Ready to build? Start on the Business plan if the dashboard is for a team, because publishing a site only workspace members can open is a Business feature, or work with a certified Expert if you would rather skip the definitions arguments.
Disclosure: MoneyFlock may earn a commission if you subscribe to a Lovable Business plan through links in this article, at no extra cost to you. TJ Alam is a certified Lovable Expert.