Arron Bennett, Founder of Bennett Financials
Most small SaaS teams I meet have a financial dashboard. Few of them read it. It has a chart for every metric the tool could compute, it moves every day, and nobody can say what it's telling them to do.
Most of a dashboard is expensive noise. It makes you feel busy while the business does whatever it was already going to do. A short list of numbers actually decides whether a company scales or just gets bigger and poorer.
This post builds that short list in plain Python, using a hypothetical bootstrapped online-booking SaaS for escape rooms at $46,000 of MRR, five people, and a dashboard with 23 charts nobody reads.
Key takeaways
- Five company-level numbers cover most of what a small SaaS needs to steer by: growth, gross margin, sales and marketing as a share of revenue, pre-tax operating margin and months of cash.
- Compare three-month windows, not single months. Quarterly trends are signal; monthly moves are mostly noise.
- Set a target for each number before you look, and flag only what misses.
- In this example, five numbers show what 23 charts hid: marketing spend rose sharply and growth barely moved.
What should a financial dashboard for a small SaaS show?
A handful of financial metrics that each lead to a decision. For a small SaaS, I'd start with five: monthly revenue growth, gross margin, sales and marketing as a share of revenue, pre-tax operating margin, and months of costs in the bank. If a number can't change what you do next month, leave it off.
Everything else, such as traffic, sign-ups, feature usage and support tickets, belongs to the team that runs it. It can live in their tools. The financial dashboard is for the few key performance indicators that tell you whether the business is getting healthier.
Notice what's not on the list: anything per customer. You don't need customer-level economics to see whether the company is on track. Company totals from your books are enough, and they're numbers your accountant already produces.
Why are 23 charts worse than five numbers?
Because more charts means more noise, and noise hides signal. Daily and monthly numbers jump around for reasons that don't matter: a big annual renewal, a holiday month, a vendor bill paid early. With 23 charts, something is always up or down, so nothing stands out, and the one real trend gets lost.
The fix is two habits. First, prune to the numbers that drive decisions. Second, compare windows, not points. Three months against the three months before is long enough to smooth out monthly noise and short enough to catch a trend while you can still act on it. That's signal vs noise in one rule.
In this short I rank the numbers I'd actually steer a business by, starting with gross margin, the one most owners get wrong by a mile.
What does the Python look like?
One CSV export with a row per month and six columns: month, revenue, cost of revenue, sales and marketing, other operating costs and ending cash. Most accounting tools can export a monthly P&L, and the bank balance comes from your statements. The script computes the five numbers for two three-month windows and flags any that miss your targets.
Mapping your accounts into those four cost buckets is the only fiddly part. Cost of revenue is hosting, payment processing and support. Sales and marketing includes salaries and tools, not just ads. Everything else goes in other operating costs. If your chart of accounts makes that hard, that's worth fixing on its own, and it's one of the more common SaaS accounting problems I see.
The script uses only the standard library. The sample data is inline so you can paste it and run it.
import csv, io CSV = """month,revenue,cost_of_revenue,sales_marketing,other_opex,ending_cash 2026-05,40800,8900,4900,23800,234200 2026-06,41900,9100,5300,23800,237900 2026-07,42700,9500,6400,24100,240600 2026-08,43900,9800,7100,24100,243500 2026-09,45100,10200,7600,24400,246400 2026-10,46000,10600,8200,24700,248900 """ TARGETS = { # your own lines: (target, "min" or "max") "MRR growth per month": (0.020, "min"), "gross margin": (0.75, "min"), "sales & marketing % of revenue": (0.15, "max"), "pre-tax operating margin": (0.10, "min"), "months of costs in the bank": (6.0, "min"), } rows = list(csv.DictReader(io.StringIO(CSV))) # or: csv.DictReader(open("export.csv")) for r in rows: for k in r: if k != "month": r[k] = float(r[k]) def five_numbers(rs): rev = sum(r["revenue"] for r in rs) cor = sum(r["cost_of_revenue"] for r in rs) sm = sum(r["sales_marketing"] for r in rs) costs = cor + sm + sum(r["other_opex"] for r in rs) growth = (rs[-1]["revenue"] / rs[0]["revenue"]) ** (1 / (len(rs) - 1)) - 1 return { "MRR growth per month": growth, "gross margin": (rev - cor) / rev, "sales & marketing % of revenue": sm / rev, "pre-tax operating margin": (rev - costs) / rev, "months of costs in the bank": rs[-1]["ending_cash"] / (costs / len(rs)), } before, now = five_numbers(rows[:3]), five_numbers(rows[3:]) print(f"{'number':<32}{'May-Jul':>9}{'Aug-Oct':>9}{'target':>9} flag") for name, (target, kind) in TARGETS.items(): b, n = before[name], now[name] ok = n >= target if kind == "min" else n <= target fmt = (lambda x: f"{x:.1f}") if "months" in name else (lambda x: f"{x:.1%}") sign = ">=" if kind == "min" else "<=" print(f"{name:<32}{fmt(b):>9}{fmt(n):>9}{sign + fmt(target):>9} {'ok' if ok else 'CHECK'}") Output:
number May-Jul Aug-Oct target flag MRR growth per month 2.3% 2.4% >=2.0% ok gross margin 78.1% 77.3% >=75.0% ok sales & marketing % of revenue 13.2% 17.0% <=15.0% CHECK pre-tax operating margin 7.7% 6.1% >=10.0% CHECK months of costs in the bank 6.2 5.9 >=6.0 CHECK Growth is the compound monthly growth across each window. Months of costs in the bank is ending cash divided by average monthly total costs in that window. Everything is pre-tax.
What do the five numbers say about this business?
Marketing spend jumped and growth didn't follow. Sales and marketing went from 13.2% of revenue to 17.0%, past a 15% line. Monthly growth barely moved, from 2.3% to 2.4%. Pre-tax operating margin fell from 7.7% to 6.1%, and months of costs in the bank slipped under six.
In dollars, the team spent $6,300 more on sales and marketing in August to October than in May to July, about $2,100 a month. That spend bought almost no extra growth. Gross margin slipped a little, from 78.1% to 77.3%, which is worth watching but still clears the target.
Each of those numbers was somewhere in the 23 charts. Nobody saw them together, because they were spread across tabs and each one moved a bit every day. Five lines with a target and a flag make the story obvious in ten seconds.
The decision follows from it. Find out which channel took the extra $2,100 a month, give it one more month with a clear test, and cut it if growth doesn't move. That's the job of a dashboard: to start the right conversation, quickly.
How do you stop the dashboard growing back to 23 charts?
Make every number earn its place. Before adding a metric, write down the decision it would change and the target that would trigger it. If you can't, don't add it. Review the list once a quarter and drop anything nobody has acted on. Five numbers read monthly beat fifty glanced at daily.
A few practical rules I'd add:
- Keep the targets in the code, next to the numbers, so they're reviewed together.
- Run it once a month after the books close, not daily. Daily runs bring the noise back.
- Add a sixth number only when the business changes, for example net cash flow once you start borrowing, or close rate once you hire salespeople.
If you want a longer list to choose from, here are ten financial KPIs worth knowing. Pick the ones that match decisions you actually make.
What should you do on Monday?
Export six months of P&L by month, add the ending bank balance for each, and map your accounts into the four cost buckets. Paste the script, swap in your CSV, and set your own targets. Then read the five lines with your co-founder or team and agree on one action for any number that misses.
FAQ
What is the most important number on a SaaS financial dashboard?
Gross margin. It decides how much of every revenue dollar is left to fund growth and overhead. If it's weak, every other number has less room to work.
How often should a small SaaS review its financial dashboard?
Monthly, after the books close. Compare the last three months with the three before, so a single unusual month doesn't drive a decision.
Should operating cash flow be on the dashboard?
For most small SaaS companies, months of costs in the bank and pre-tax operating margin cover it. Add operating cash flow when timing gaps grow, such as annual prepayments or slow-paying customers.
