Empty states are onboarding: designing the blank dashboard

Every dashboard has a moment when it shows its true face, and it isn't the polished screenshot on your marketing site. It's day one: a new account, no data, no history, no habits. The user arrives carrying the hope that this thing will be worth the migration cost, and the product answers with... an empty grid and a grey line that says "No data yet."

That screen is where activation is decided. Not the pricing page, not the onboarding tour — the first run of the thing itself. We treat the blank dashboard as the highest-leverage surface in any SaaS product we design, budget it accordingly, and measure it like a funnel step. Because it is one.

We've written about empty states as product marketing across whole products. This piece goes deeper on one specific case — the dashboard — because dashboards have a unique problem: their entire value proposition is "look at your data," and on day one there isn't any. Here's how we design the zero-data moment so it earns the first return visit.

Why the blank dashboard decides activation

Session analytics across our dashboard builds tell a consistent story. Users who see a meaningless first screen behave predictably: they poke at two or three navigation items, fail to find anything that acknowledges them, and leave — median session under ninety seconds. A large share never come back. Meanwhile, users whose first screen did something — connected a source, loaded a sample, or completed one setup step — behave like a different cohort entirely. Multi-week retention roughly doubles.

The mechanism isn't mysterious. A blank dashboard doesn't just fail to inform; it quietly asks the user to do unrequested work (figure out what to do) in exchange for unproven value (this might be useful later). Humans defer that trade indefinitely. The job of the empty state is to invert it: the product does the work, the user collects an immediate, small win.

This is why we now scope empty states in the first sprint of any product engagement, not the last. When the Northwind Ledger dashboard rebuild kicked off, the blank state was designed in week one alongside the populated states — and the activation numbers below are why we'll never do it any other way.

Three archetypes, three different jobs

"Empty dashboard" sounds like one state. It's at least three, and designing them identically is the most common mistake we inherit.

1. First-run: nothing has ever happened. The account is new. This state is a fast-forward surface. Its job is to get the user to their first real data as quickly as possible — connect a bank feed, import a CSV, invite the teammate who has the data, or load sample data (below). Everything on this screen should point at that single event. Not a tour of features. One door, clearly lit.

2. Cleared: something happened, but not here. The account has data; this view doesn't. Filters are too narrow, the date range covers a quiet period, or the user is on a dashboard they haven't configured. This state is a repair surface. Its job is to explain the specific reason for the emptiness and offer the one-click fix: "No transactions between 1–7 March. Widen the range ↗" with a button that does it. Never show a first-run empty state to an account that has data somewhere — "Get started!" addressed to a user with six months of history reads as the product not knowing who it's talking to. Because it doesn't.

3. Lapsed: the pipe broke. An integration token expired, an import failed silently, a sync has been retrying for three days. The dashboard is empty not because of anything the user did but because the connection died. This state is an alarm surface, and it's the one teams most often forget to design at all — the default rendering is an empty grid with no explanation, which users read as "my data is gone." The correct design is loud: a banner in the product's warning register, the name of the broken connection, when it last succeeded, and a single re-connect action. If you have email, escalate there too after 24 hours.

The diagnostic rule we give squads: before designing any empty dashboard state, write down which of the three it is, in the code, as an explicit branch. If your frontend can't distinguish "never had data" from "integration lapsed," that's an API gap, not a design problem.

Sample data: teach, don't fake

The strongest first-run pattern for data products is a sample workspace — a pre-loaded slice of realistic data the user can explore before connecting their own. Done well, it converts the dashboard from a promise into a demonstration. Done badly, it's worse than nothing. The rules we've settled on:

  • It must be obviously a sample. Label it persistently ("Sample workspace — connect your data ↗"), in chrome, not just a dismissible banner. Nothing erodes trust like a user realising the impressive numbers they just studied were theatre.
  • It must be shaped like reality. Real data is spiky, boring in places, and slightly wrong. Sample datasets built from round numbers and smooth curves teach the user the wrong instincts about what their dashboard will look like. We write generators that include weekends, seasonal dips, and one ugly outlier month.
  • Every insight must survive the swap. The point of a sample is rehearsing the real workflow: filter, drill, annotate, export. If a feature only works in sample mode — or works differently — users learn a product that doesn't exist. The sample runs on the exact same code path as real data, full stop.
  • The swap must be reversible. Let users flip back to the sample after connecting real data. People use it to train colleagues, to test hypotheses ("is this spike my business or the tool?"), and to demo the product to their boss. Killing the sample at connection time throws away the best sales asset in the product.

The alternative pattern — an empty state with a video or a "see a demo" link — underperforms the sample every time we've tested it. Watching someone else use software is not the activation event. Touching it is.

Copy that moves one muscle

Empty-state copy fails in a predictable way: it describes the future instead of commanding the present. "Your cash-flow forecast will appear here!" is a weather report. The empty state has one job: move one muscle, once.

Our copy frame for first-run dashboard states has four lines, in order:

  1. Name the value in past tense. What the user will have, stated as if done: "This is where your weekly cash position lands." Past/completed framing outperforms future framing in every activation test we've run — it reads as a fact about the product, not a promise from marketing.
  2. One instruction, one verb. "Connect your bank to see it." Not a paragraph of options. If there are genuinely two equally valid paths (connect a feed or import a CSV), present one as the button and one as a quiet text link beneath it. Hierarchy is the designer's opinion about which path most users should take; have one.
  3. Answer the cost. The click is scary for known reasons — bank credentials, file formats, IT approval. Answer the real objection in one short line under the button: "Read-only. Revocable any time." We learn which objection to answer from sales calls and support tickets, never from imagination.
  4. A sample-data escape hatch. "Or explore with sample data" — the no-commitment path that still counts as activation. Some percentage of users will always take it. Treat them as activated the moment they interact, not as failures of the connect flow.

Everything else — feature tours, video thumbnails, testimonials, confetti — is noise on this screen. The discipline is the same one we apply to onboarding patterns generally: sequence by value, ban the tour, celebrate quietly.

Measure it like the funnel step it is

If the empty state is onboarding, it gets funnel instrumentation. The events we ship on every dashboard build:

  • dashboard_empty_viewed with a reason property (first_run | cleared | lapsed)
  • one event per offered action (connect_started, sample_loaded, range_widened, reconnect_clicked)
  • first_meaningful_data — the moment the dashboard renders real, user-owned data

From these, two metrics matter. Escape rate: of users who saw a first-run empty state, what share reached first_meaningful_data within the session? And time-to-data: median minutes from empty view to first real data. Both are honest activation metrics — they're tied to value received, not clicks performed.

On Northwind Ledger (figures illustrative, but the direction is what we see across rebuilds): pre-redesign, 31% of new accounts reached first-meaningful-data within a week; the median took two days, which usually meant "never." Post-redesign — explicit three-archetype branching, a labelled sample workspace, one-verb copy with objection handling — first-week escape rose to 58%, and median time-to-data fell to eleven minutes. The honest caveat: we changed the onboarding checklist in the same release, so we claim the bundle, not the empty state alone. Measure your own bundle; just make sure the empty state is in it.

One more measurement habit: screenshot the empty states in every quarterly review alongside the populated ones. Populated dashboards get iterated constantly; empty states fossilise at launch-day quality unless someone is responsible for looking at them.

Key takeaways

  • The blank dashboard is a funnel step. Instrument it, design it in sprint one, and review it quarterly like any revenue surface.
  • There are three empty states, not one: first-run (fast-forward), cleared (repair), lapsed (alarm). Branch them explicitly in code or you'll show newcomers' copy to grieving users.
  • Sample data works when it's labelled, realistically shaped, fully functional, and reversible. Fake-looking samples teach wrong instincts; fake-acting ones betray trust.
  • Empty-state copy moves one muscle: name the value in past tense, one verb, answer the real objection, offer the sample escape hatch.
  • Track escape rate and time-to-data. "Users saw a dashboard" is not an activation metric; "users saw their dashboard" is.

FAQ

Isn't sample data dishonest? Only if it hides. A clearly labelled sample is a demo, and demos are the oldest honest sales tool there is. The dishonest version is unlabelled dummy data presented as a live product — or a sample so polished it misrepresents what real usage looks like. Reality-shaped, persistently labelled, runs on the real code path: that's the standard.

Should every dashboard offer sample data? No. It earns its complexity cost when the product's value is genuinely hard to see without volume — analytics, forecasting, reporting. If the dashboard's value is obvious from structure alone (a kanban board, an inbox), skip the generator and spend the effort on a faster path to the first real item.

What if connecting data genuinely takes days — payroll, ERPs, bank approvals? Then the empty state has a different job: make the wait legible. Show exactly where the connection stands, what's blocking it, whose action is needed, and what will appear when it lands. "Waiting" is a fourth state in disguise, and it's the one where enterprise churn quietly happens.

Do celebration moments (confetti, badges) help activation from empty states? We've never measured a durable lift from them, and we've removed more than we've shipped. What moves numbers: reaching real data faster, and the product being visibly useful the second time it's opened. Celebrate with a working dashboard, not a modal.

When in the project should empty states be designed? Same week as the populated states, from the same data contract. Scheduling them for "polish later" guarantees they ship as afterthoughts — and the empty state is the one screen every new user is guaranteed to see.


Keep reading