SaaS revenue dashboard
The screen a subscription business opens every morning. MRR and its movement, revenue trends, plan and customer mix, and the health of collections, readable in about ten seconds.

A working dashboard built in Flitch on Stripe billing data. It leads with the numbers, charts the trend behind each one, and separates growth from collections so a bad month and a bad payment run never look the same. Copy it and point it at your own Stripe account.
What the dashboard does
- MRR and ARR with their movement against last month, as the first thing on the page
- Gross against net revenue over the trailing period, so refunds are never hidden inside the top line
- Net new MRR split into new, expansion, contraction and churn, month by month
- Revenue by plan tier and by billing interval, in count and in value
- The customers carrying the most revenue, ranked
- Collections: failed charges by decline code, invoices past due, and how much a retry recovers
What data sits behind it
| Dataset | What it carries |
|---|---|
| customers | One row per account, with plan, seats and billing details. |
| subscriptions | The live book: plan, quantity, status and cancellation reason. |
| invoices | Every invoice with its status, period and amounts. |
| charges | Payment attempts, including decline codes and refunds. |
| products | The plan catalogue. |
| prices | Per-seat pricing by plan and interval. |
How it was built
Nobody laid this out by hand. It came from one prompt, against the datasets above, and was refined from there. This is the prompt, unedited.
Build "Revenue", the dashboard a subscription business opens every morning. This one is a dashboard and it should be an excellent one. Lead with the numbers, chart generously, and make the state of the business readable in about ten seconds from across a desk.
SaaS revenue dashboard FAQ
Is this real revenue data?
No. It runs on a synthetic subscription business: 420 customers, 377 subscriptions and around 1,900 invoices across 22 months, generated so that the growth, the churn and the failed payments all agree with each other. Replace the datasets with your own when you copy it.
Can I point it at my own Stripe account?
That is what it is built for. The datasets carry Stripe’s own field names and formats, including amounts in minor units and epoch timestamps, so the dashboard reads a real Stripe connection the same way it reads the sample.
Why is expansion and contraction separated out?
Because a flat MRR number hides the two things that matter most. An account adding seats and an account leaving can cancel each other out perfectly while the business underneath changes completely. The sample data has genuine seat changes and plan upgrades in it, so the split is not decorative.
What do I get when I copy it?
Your own dashboard in your own space, with its own copy of the six datasets. Nothing you do to your copy touches the original.
Start from this one
You get your own copy, with its own data, in your own space. Change anything you like.
Use this template