Startup Metrics Dashboard: The Numbers Worth Putting on a Wall
An early-stage startup metrics dashboard needs five things: weekly growth of the one number that defines traction, active users, activation rate, revenue if you have it, and runway. That's it. Before product-market fit, most of the metrics on a template are noise, and a dashboard with fifteen tiles teaches a team to ignore all fifteen.
This page covers which numbers to pick at each stage, the widget each one deserves, the exact JSON your endpoints return, and why a runway countdown belongs where everyone can see it.
Pick the one number first
Every startup has one metric that, if it grows week over week, means the thing is working. It depends on the business:
- B2B SaaS: paying accounts, or weekly active teams.
- Consumer app: weekly active users who did the core action.
- Marketplace: completed transactions.
- Developer tool: weekly active API keys, or projects with a successful call.
Put it top left, as a KPI with its week-over-week change. Everything else on the dashboard exists to explain why that number moved.
The five tiles
| Tile | Widget | What it answers |
|---|---|---|
| The one number, week over week | KPI | Is it working? |
| Active users | Line chart, 8–12 weeks | Is usage compounding or flat? |
| Activation rate | KPI | Do new signups reach the moment that matters? |
| Revenue (MRR) | KPI with goal bar | Are people paying, and how close is the next milestone? |
| Runway | Countdown | How long do we have? |
Add a deploys heatmap if you're a technical team. Shipping cadence is a leading indicator founders feel but rarely see.
What to leave off, for now
- Total signups ever. It only goes up. Show signups this week, or activation.
- Page views and followers. Unless they're the product, they're not traction.
- CAC and LTV. With a few months of data and founder-led sales, both are guesses. Add them when you have repeatable acquisition.
- Burn multiple, NRR, magic number. Real metrics, for later. A seed-stage team watching them daily is watching weather.
The JSON, tile by tile
dashboardbase renders whatever your endpoints return in its widget contract, so each tile is a small endpoint in your own backend. These are real responses.
The one number, as a KPI:
{
"title": "Daily active users",
"actions": [
{
"title": "View Details",
"type": "link",
"url": "https://example.com/dau-details"
}
],
"data": {
"header": {
"title": "2,543",
"subtitle": "vs last month",
"badge": {
"text": "+12%",
"icon": "ArrowUp",
"color": "Success"
}
}
}
}Revenue against the next milestone:
{
"title": "MRR",
"actions": [
{
"title": "View Details",
"type": "link",
"url": "https://example.com/mrr-details"
}
],
"data": {
"header": {
"title": "$8,200",
"subtitle": "toward $10k goal",
"badge": {
"text": "+$820",
"icon": "ArrowUp",
"color": "Success"
}
},
"progress": {
"value": 8200,
"max": 10000,
"label": "Goal 10.000 $"
}
}
}Runway, as a countdown to the date the money runs out:
{
"title": "Runway",
"actions": [
{
"title": "View Model",
"type": "link",
"url": "https://example.com/finance"
}
],
"data": {
"target": "2027-11-30T00:00:00+00:00",
"label": "until cash out"
}
}The target is the date your runway model gives. The widget ticks live in the browser, and on a TV it's the most honest tile in the room.
Shipping cadence, as a contributions grid:
{
"title": "Deploys",
"actions": [
{
"title": "View Pipeline",
"type": "link",
"url": "https://example.com/pipeline"
}
],
"data": {
"header": {
"title": "142",
"subtitle": "Last 14 days"
},
"cells": [
{
"date": "2026-01-01",
"value": 2
},
{
"date": "2026-01-02",
"value": 0
},
{
"date": "2026-01-03",
"value": 5
}
]
}
}The runway endpoint
Runway is simple arithmetic, and it's better in code than in a spreadsheet nobody updates. Keep the inputs wherever you already track them; this example reads them from your own database:
const SECRET = process.env.DASHBOARDBASE_ENDPOINT_SECRET
// Fail at boot rather than serving finance data unprotected.
if (!SECRET) throw new Error('DASHBOARDBASE_ENDPOINT_SECRET is not set')
app.get('/dashboard/runway', async (req, res) => {
if (req.get('x-dashboardbase-secret') !== SECRET) {
return res.status(401).json({ error: 'unauthorized' })
}
// Cash in the bank and average net burn over the last three months.
const { rows } = await db.query(
`SELECT cash_balance, avg_monthly_net_burn FROM finance_snapshot ORDER BY taken_at DESC LIMIT 1`
)
const { cash_balance, avg_monthly_net_burn } = rows[0]
const months = avg_monthly_net_burn > 0 ? cash_balance / avg_monthly_net_burn : 120
const cashOut = new Date()
cashOut.setDate(cashOut.getDate() + Math.round(months * 30.44))
res.json({
title: 'Runway',
actions: [{ title: 'View Model', type: 'link', url: 'https://example.com/finance' }],
data: {
target: cashOut.toISOString(),
label: 'until cash out',
},
})
})Use net burn (spend minus revenue), averaged over a few months, so one big invoice doesn't add a quarter of runway overnight. If you're profitable, the cap of 120 months keeps the countdown sensible.
The x-dashboardbase-secret header is sent by dashboardbase on every request; anything without it gets a 401. When you test the datasource, dashboardbase makes one extra request with every credential stripped and tells you whether the endpoint actually refused it.
Building the endpoints quickly
Five endpoints is an afternoon by hand. It's less with help: the free Skill teaches Claude Code or Cursor the widget contract, and the editor can generate a copy-pasteable prompt for whatever AI tool you already use. Paste each response into the public endpoint validator to check it renders before wiring it up.
Where the dashboard should live
- On the office wall. Pair a TV by opening
www.dashboardbase.com/tvand approving the code from your phone; nothing logs in on the screen. A shared number on a wall changes how a small team talks about the week. How TV pairing works. - On your phone. Native iOS and Android apps, with a push notification when an endpoint raises an alert.
- In the investor update. A public share link, optionally password-protected, beats screenshots in a monthly email.
As you grow
Past product-market fit, the dashboard splits: a SaaS metrics board (MRR, churn, NRR; see our SaaS metrics dashboard and revenue dashboard guides), a product board (activation, retention cohorts, feature adoption) and a team board for each function. The five tiles above stay on the founders' screen.
Tools, honestly
Templates from Databox, Klipfolio and SimpleKPI rank for this search, and they're fine if your numbers live in SaaS tools. Databox has a free plan with 3 data sources and one dashboard; SimpleKPI is $79/month, or $63/month billed annually, with unlimited users.* Our KPI dashboard software comparison covers the field.
dashboardbase fits when the numbers come from your own product. Plans are flat, from $9.99/month for 3 seats, with a 14-day free trial, and you don't pay per dashboard. Whether to buy at all is a fair question at this stage; our build vs buy framework gives an honest answer.
FAQ
What metrics should a startup track? Weekly growth of your one traction metric, active users, activation rate, revenue, and runway. Add more only when someone would act on them.
How do I show runway on a dashboard? As a countdown to the cash-out date, computed from cash balance and average net burn.
Should a seed-stage startup track CAC and LTV? Usually not yet. Without repeatable acquisition and some retention history, both are guesses.
About the competitor details *
Competitor pricing changes, and we don't control it. Everything marked with an asterisk reflects the vendors' public pricing pages as of 6 October 2026.
Sources
- Databox pricing, checked 6 October 2026
- SimpleKPI pricing, checked 6 October 2026