A Minimum-Viable SaaS Metrics Dashboard in Google Sheets

By Swiftools Team · Published June 18, 2025 · 8 min read

A laptop showcasing an analytics dashboard with charts and graphs

The arc of SaaS metrics goes like this. Year one: you don't track anything because you have nine customers and a Stripe dashboard. Year two: you sign up for ChartMogul or Baremetrics, get overwhelmed by the 40 metrics they show, and look at MRR once a week. Year three: you finally hire someone who knows what they're doing and they rebuild your dashboard from scratch.

You can skip most of that pain by starting with the smallest dashboard that captures what actually matters, owning every formula, and graduating only when you've outgrown it. This post is the smallest dashboard - the version we ran for ourselves at Swiftools through year two, built entirely in Google Sheets.

The four metrics that matter, and the ones to ignore

If you measure these four, you have 80% of the signal:

  1. MRR (and the components: new, expansion, contraction, churned)
  2. Net revenue retention (or its simpler cousin, gross logo churn)
  3. CAC payback period
  4. Cohort retention curves

Things you can ignore until you have a reason: ARPU broken down by 12 segments, daily active users (if you're a B2B SaaS this is mostly noise), funnel-stage conversion rates beyond the top of the funnel, NPS as a number (qualitative feedback is more useful than the score), feature-level engagement metrics. All can be valuable later. None earn their place in a starter dashboard.

The data sheet

The dashboard sits on top of a single raw-data tab. The schema is:

date | customer_id | plan | mrr_change | event_type
2025-01-03 | cust_001 | Pro | 49 | new
2025-01-15 | cust_002 | Starter | 19 | new
2025-02-10 | cust_001 | Business | 50 | expansion
2025-02-22 | cust_003 | Pro | -49 | churn

One row per MRR-affecting event. event_type is one of: new, expansion, contraction, churn, reactivation. mrr_change is the monthly recurring revenue change in dollars (positive or negative). That's everything you need.

Most teams' first instinct is to make the data tab much more complex - currency, billing period, discount, signup source, etc. Resist this for the dashboard. Those fields can live on a separate "customers" tab; the metrics tab only needs MRR events.

For data ingestion: at Swiftools, we wrote a small monthly export from Stripe via the API and pasted the rows in. Once you have more than ~50 events a month, automate it (see our sync post for the inverse pattern) or pull directly from Stripe with Apps Script's UrlFetchApp.

The MRR formulas

On a new tab called "Dashboard," set up a column for each month:

          | 2025-01 | 2025-02 | 2025-03 | ...
New MRR   | =SUMIFS(events!D:D, events!E:E, "new", events!A:A, ">="&DATE(2025,1,1), events!A:A, "<"&DATE(2025,2,1))
Expansion | =SUMIFS(events!D:D, events!E:E, "expansion", ...)
Contract. | =SUMIFS(events!D:D, events!E:E, "contraction", ...)
Churned   | =SUMIFS(events!D:D, events!E:E, "churn", ...)
Net New   | =SUM(above 4 rows)
Total MRR | =previous_month_total + Net_New

Six rows. That's MRR with full attribution to its components. The little stack of numbers - new+expansion contributing positively, contraction+churn pulling down, net change rolling forward - is the single most valuable view we ever built. We look at it every month and the patterns are immediately readable.

The retention/churn formulas

Gross logo churn for a month:

=COUNTIFS(events!E:E, "churn", events!A:A, ">="&DATE(2025,1,1), events!A:A, "<"&DATE(2025,2,1))
  / [active customers at start of month]

For active customers at start of month, the cleanest pattern is a separate column that maintains a running count (each new event +1, each churn -1). Net revenue retention is more involved - the standard formula is (Starting MRR + Expansion - Contraction - Churn) / Starting MRR for the cohort of customers that existed at the start.

The honest version of NRR in a starter dashboard is "did the existing customer base grow or shrink in dollar terms this month, ignoring new customers." If that's above 100%, you have negative net churn, which is the holy grail. If it's below 100% but above 90%, you're fine. Below 90% and your product probably has a retention problem worth investigating before you spend more on acquisition.

CAC payback period

The simplest version, on a separate small block:

Sales+Marketing spend (last 3 mo avg) | =AVERAGE(monthly_spend!B:B)
New customers (last 3 mo avg)         | =AVERAGE(monthly_new_customers!B:B)
CAC                                    | =B1 / B2
Average revenue per customer per month | =AVERAGE(arpu!B:B)
Gross margin                           | 0.85
CAC payback (months)                   | =B3 / (B4 * B5)

The output is "how many months of subscription does it take for a new customer's gross profit to cover the cost of acquiring them." Healthy benchmarks vary hugely by segment - OpenView's annual SaaS benchmarks report is the most cited source - but under 12 months for SMB SaaS and under 24 for enterprise is a common rule of thumb.

Cohort retention curves

This is the most "real-feeling" part of the dashboard. Build a table where rows are signup-month cohorts and columns are months-since-signup:

                | M0  | M1  | M2  | M3  | M4
Jan 2025 cohort | 100%| 92% | 88% | 84% | 82%
Feb 2025 cohort | 100%| 90% | 86% | 83% |
Mar 2025 cohort | 100%| 91% | 87% |     |
Apr 2025 cohort | 100%| 89% |     |     |
May 2025 cohort | 100%|     |     |     |

For each cell, the formula counts customers from that signup month who are still active N months later, divided by the cohort's starting size. COUNTIFS with date conditions does this fine, though it gets a bit unwieldy - it's the one place in the dashboard where QUERY is genuinely more readable.

The shape of the curves tells you what's going on. Steep early drop with a flat tail: your activation is bad but your stuck customers stay forever. Gradual erosion across all months: classic engagement problem. Different cohorts converging at very different levels: your customer mix is changing, often because you've started or stopped a particular marketing channel.

The "magic number" in cohort analysis is the flat-tail percentage - what proportion of a cohort is still around at month 12. For SMB SaaS, 60% is healthy; for prosumer/B2C, 30-40%. Anything below 20% means you have a retention problem masquerading as a growth problem.

Charting

Three charts are enough. MRR with stacked bars showing new/expansion/contraction/churn contributions. Cohort retention as a line chart with each cohort as a line. Net MRR change as a column chart over time, so you can see negative months stand out clearly.

That's it. Resist the urge to chart everything. The four numbers are the dashboard; the charts are just to make them readable.

When to graduate

Signs you've outgrown the Sheets dashboard:

  • The events tab is over ~3,000 rows and the formulas are slow.
  • You need to slice by 3+ dimensions (plan, segment, country, signup channel) at once.
  • More than one person is editing the dashboard structure and you've started colliding.
  • Pulling data from Stripe weekly is taking real time and the Apps Script glue is brittle.
  • An investor is asking for views you're recalculating by hand each time.

At that point, move to ChartMogul, Baremetrics, or a real BI tool fed by your data warehouse. The Sheets dashboard you built will translate cleanly because you understand every metric in it, which is the part that most teams who skip straight to a hosted tool never quite learn.

Why this works

The premise of starting simple isn't that the simple version is good. It's that the simple version is yours. You wrote every formula, you know every assumption, you can defend every number. When the board asks "why did churn spike in April," you can trace it through the rows and answer in five minutes instead of trying to remember which dashboard widget shows what.

Owning your numbers is worth more than seeing pretty versions of them. The Sheets dashboard is the simplest way to own them. Build it now, before you need it, and you'll never have the embarrassing month where the team realizes nobody understands what the hosted dashboard is showing.

Sources & Further Reading