How to build a Stripe revenue dashboard: data model, metrics, and tools
Max Musing
Max MusingFounder and CEO of Basedash · May 26, 2026

Max Musing
Max MusingFounder and CEO of Basedash · May 26, 2026

A Stripe revenue dashboard is a recurring view of MRR, churn, expansion, and net new ARR built directly from Stripe’s data. The hard parts are not the charts. They are choosing what counts as recurring revenue, dealing with refunds and proration, and deciding whether to query Stripe directly, sync it to a warehouse, or pay a metrics tool to do it for you.
This guide is for founders, finance leads, RevOps, and analytics engineers building a Stripe-driven revenue dashboard for the first time, or rebuilding one that nobody trusts. It covers the Stripe data model you actually need to understand, the metrics that matter, the calculation pitfalls that quietly break dashboards, and the tools that fit different team sizes.
Before building anything, it is worth understanding what Stripe already provides.
The Stripe Dashboard ships with a set of pre-built reports under “Revenue” and “Billing”: MRR, MRR growth, churn, customer count, and a few cohort views. For a small SaaS company on Stripe Billing with simple subscriptions, this is often enough for the first year.
Where it stops being enough:
Once any of those become a real constraint, you outgrow the built-in reports and need a dashboard built on top of Stripe data.
Stripe’s API is well documented, but a small set of objects do most of the work for revenue analytics. Knowing what each one represents and how they connect is the difference between a dashboard you trust and one you do not.
The objects you cannot avoid:
active, trialing, past_due, canceled, incomplete, etc.) and one or more subscription_items.price. Quantity matters here for seat-based plans.unit_amount, currency, interval, and whether it is metered or licensed.amount_due, amount_paid, period_start, period_end, and line items that link back to subscription items, prices, and proration events.succeeded, failed, refunded) and amount_refunded.For a revenue dashboard, the most useful “shape” of this data is one row per subscription period and one row per invoice line item. Almost every meaningful metric can be derived from those two grains.
A few less obvious things to know:
amount will double-count if you are not careful.status and canceled_at, not by deletion.The first real architectural decision is where Stripe data lives when your dashboard reads it.
There are four common options.
Stripe Sigma provides SQL access to your Stripe data inside the Stripe Dashboard, billed per query. It is the fastest way to start because there is no sync to set up, and it is fine for ad hoc analysis and small dashboards.
Limits: you cannot join Stripe to product or CRM data. You cannot embed Sigma queries in your own BI tool. Usage-based pricing gets expensive once a dashboard is refreshed often.
ChartMogul, Baremetrics, ProfitWell (Paddle), and Maxio all sync from Stripe and give you pre-built MRR, churn, and cohort dashboards.
Strengths: opinionated metric definitions, fast to set up, support multi-currency. Weaknesses: rigid metric definitions you cannot easily change, limited blending with non-Stripe data, per-seat pricing that scales with revenue.
These tools are a good fit for early-stage SaaS companies that need credible board-quality metrics without a data team. They become a constraint once finance wants to define metrics differently or RevOps wants to blend with HubSpot or Salesforce.
Use Fivetran, Airbyte, Stitch, or Stripe’s own data pipeline to land Stripe data in Snowflake, BigQuery, Redshift, or Postgres. Then model it with dbt or SQL views and read from a BI tool.
This is the dominant pattern at any company with a data team. It gives you full control of metric definitions, joins to product and CRM data, and a single source of truth for finance. It also has the highest setup cost.
Fivetran’s Stripe connector and the stripe dbt package cover most of the modeling work. The package ships with stripe__customer_overview, stripe__balance_transactions, and stripe__subscription_line_items models that handle proration, currency, and refunds.
For teams that want flexibility without standing up a metrics platform, a BI tool reading from a warehouse (or directly from Stripe via the API) is often the right balance. Tools like Basedash, Metabase, Hex, and Mode can sit on top of either pattern.
Basedash specifically can connect to a warehouse that holds Stripe data, or to a Postgres database where Stripe data has been replicated. Its AI features let non-technical operators ask follow-up questions in plain English without writing SQL, which matters more for a revenue dashboard than for most other dashboards because finance, sales, and support all want to slice it differently.
A reasonable rule of thumb:
A revenue dashboard built on Stripe should cover four layers. Anything else is a different dashboard.
MRR and ARR. The non-trivial part is the definition.
A clean MRR definition includes only normalized recurring subscription revenue from active paying customers, and excludes:
Pick the definition once, write it down, and keep it consistent across the dashboard. The most common reason a Stripe dashboard loses trust is that two views of MRR do not reconcile because someone counted a setup fee in one place but not another.
The single most useful number on a SaaS revenue dashboard is net new ARR per period, broken into four buckets:
Net new ARR = New + Expansion − Contraction − Churned. As a stacked bar chart over time, this is usually the most-referenced visual on the dashboard because it explains why ARR is moving.
In Stripe data, this requires comparing each customer’s MRR snapshot at the start and end of the period, then attributing the delta to one of the four buckets. The dbt Stripe package handles most of this; rolling your own takes a bit of care with proration and trial conversions.
There are two churn numbers worth tracking, and they answer different questions.
For a B2B SaaS company, NRR above 100% is the headline benchmark for “good.” For consumer or SMB SaaS, logo churn matters more.
Both should be shown on a rolling monthly basis. Single-period churn numbers swing too much to be useful.
Once the headline numbers are in place, finance and operators almost always want to slice them:
Composition charts belong below the headline section. Putting them on top makes the dashboard noisy.
A handful of issues quietly break most Stripe dashboards. They are worth checking explicitly.
Stripe records refunds against the original charge. If you calculate revenue as sum(invoice.amount_paid), you will overstate it. Subtract sum(refund.amount) and sum(dispute.amount) for fully resolved disputes. For partial refunds, use the line-item-level amount_refunded.
When a customer upgrades mid-cycle, Stripe issues a credit for the unused portion of the old plan and a new charge for the new plan. Both appear as line items on the next invoice. Aggregating raw amounts double-counts the upgrade. The fix is to look at the subscription’s MRR before and after the change date, not the invoice line items.
Trialing customers produce invoices for zero. Including them in MRR overstates revenue; excluding them from customer counts understates active customers. Most teams settle on “active paying customers” for revenue metrics and “active including trials” for usage metrics.
Stripe stores amount in the local currency’s smallest unit (cents, pence, etc.). To get a single MRR number, normalize to one reporting currency using a daily FX table. The Stripe API does not do this for you. If you sell in five or more currencies, do not skip this.
A 50% off forever coupon is part of MRR forever. A 50% off for three months coupon affects MRR only for three months. Get the duration right or expansion ARR will look fake when those discounts roll off.
If you have separate Stripe accounts for different products or geographies, the data needs to be unified before metrics are computed. A single customer or company may exist as different customer.id values in each account.
Annual subscriptions need to be normalized to monthly for MRR (amount / 12), but the cash hits Stripe upfront. Without a clear convention, monthly MRR and cash collected will not agree, and finance will lose trust in the dashboard.
A useful Stripe revenue dashboard is short. Aim for one page that loads quickly and answers the three questions a CEO actually asks: how big is recurring revenue, how fast is it growing, and where is the change coming from.
A layout that works well:
Avoid splitting this across multiple pages. A revenue dashboard is most useful when it can be read in under a minute.
It is common to start on Baremetrics or ChartMogul and outgrow it. The signals are fairly consistent:
When two or more of those are true, the move is usually to a warehouse-backed dashboard. The Stripe-native tool can stay around for a while as a reference, but the source of truth shifts to the warehouse.
A good Stripe revenue dashboard is small and stable. Most of the work is upstream of the charts: defining what counts, modeling the data correctly, and choosing the right place for it to live. Get those right and the dashboard mostly takes care of itself.
If you are choosing tools for the BI layer, our guides on the best AI-native BI tools compared and how to build a SaaS revenue dashboard cover related decisions in more depth.
Written by
Founder and CEO of Basedash
Max Musing is the founder and CEO of Basedash, an AI-native business intelligence platform designed to help teams explore analytics and build dashboards without writing SQL. His work focuses on applying large language models to structured data systems, improving query reliability, and building governed analytics workflows for production environments.
Basedash lets you build charts, dashboards, and reports in seconds using all your data.