Verified against ChatGPT · 2026-08-08
Design every empty state a dashboard can hit so 'no data yet' never reads like a bug
Produces copy, layout, and a next-action for each distinct empty state a product screen can show — first-use, filtered-to-zero, and error — so users never mistake an empty screen for a broken one.
The prompt
Ready to copy — highlighted parts are example details you can swap.
You are designing the empty-state system for one specific screen in a product, covering every distinct reason that screen can render with nothing in it, not just a single generic "no data" message. SCREEN The Reports tab in a project-management SaaS dashboard. DISTINCT EMPTY REASONS New account with no reports created yet; existing account with reports but the current filter/date-range matches none; the reports API call failed to load. FIRST-USE USER CONTEXT They've just signed up and have never created a report before; they don't yet know a report is built from saved views, not raw data. PRIMARY NEXT ACTION AVAILABLE Create report from template; for the filtered-zero case, clear filters; for the error case, retry the load. VISUAL SYSTEM CONSTRAINTS No custom illustrations available yet — use icon + text only, single column, matches the existing card component width. RULES Treat each entry in DISTINCT EMPTY REASONS as its own empty state with its own copy — a screen with zero rows because a brand-new account hasn't created anything yet is a different problem from the same screen showing zero rows because a filter matched nothing, and collapsing both into one "Nothing here" message is the single most common empty-state mistake, because the correct next action is different in each case (create the first thing vs. loosen the filter). For every state, write a headline that names what's actually true (not "No results" as a flat fact with no path forward) and a single sentence of supporting copy, then specify exactly one primary action button tied to that state's real next step — never stack two competing CTAs in an empty state, since a user who hit an empty screen is already uncertain and a choice between two vague buttons increases that uncertainty rather than resolving it. For the first-use state specifically, write copy that assumes zero prior context about the product's terminology, since this is often the very first thing a new account sees on that screen. For an error or failed-load state, the copy must never blame the user's input or connection speculatively — state only what's known (the load failed) and offer retry, never invent a diagnosis the system hasn't confirmed. Specify layout notes only where they change per state (e.g., whether an illustration is warranted or whether a filtered-to-zero state should stay minimal and inline rather than taking over the whole screen with a big illustration, which reads as overkill for a one-click filter fix). WHAT NOT TO DO Do not produce a single reusable empty-state template with a variable swapped in — that is exactly the failure mode of collapsing distinct problems into one message. Do not add humor or personality copy unless the product's existing voice already uses it elsewhere on this screen; empty states are a bad place to introduce a new tone the user hasn't seen before. OUTPUT FORMAT A table with one row per empty reason: State name | Headline | Supporting copy | Primary action label + destination | Layout note (illustration / inline / none). Close with one paragraph flagging any empty reason from the input that actually needs to be split further into two distinct states.
Customize
Optional — swap in your own details for the highlighted parts above.
Why this works
The prompt forces the model to treat empty-reason enumeration as the actual design problem rather than letting it default to writing one polished "empty state card" and calling the job done, which is what GPT-5.1 tends to produce when asked generically for "an empty state" — it reaches for a single tidy illustration-plus-message pattern because that's the most common training-data shape for the term, even though real products need at least three behaviorally distinct versions. Naming the first-use case separately matters because a new account's zero-state and an existing account's filtered-to-zero state look identical in the database (both are just an empty list) but require opposite framing: one needs to teach unfamiliar vocabulary and invite creation, the other needs to acknowledge an existing collection exists and help the user get back to it, and a model without this split reliably writes copy generic enough to technically fit both, which is the same as fitting neither well. The single-CTA constraint closes a specific failure mode where models asked for "an empty state with actions" list two or three buttons because more options feels more helpful, when in practice a user looking at nothing is in a low-confidence moment and a forced single next step reduces the decision instead of adding to it. The rule against inventing a diagnosis in the error state addresses a subtler drift: without an explicit constraint, models often write reassuring but false specifics like "check your connection," which is a guess dressed as information, and stating only the confirmed fact (the load failed) keeps the copy honest about what the system actually knows.
What you get back
First-use: Headline "No reports yet" / copy "Reports are built from saved views — create your first one from a template." / CTA "Create report from template" / layout: icon + text, no illustration. Filtered-to-zero: Headline "No reports match these filters" / copy "Try widening the date range or clearing a filter." / CTA "Clear filters" / layout: inline, no illustration. Load failed: Headline "Reports didn't load" / copy "Something went wrong on our end." / CTA "Retry" / layout: inline.
Verified against
ChatGPT GPT-5.1 · 2026-08-08
Changelog
- 2026-08-08 — Initial publish, verified against ChatGPT GPT-5.1.
Need this built into your business?
If a prompt isn't enough — branding & design, built and maintained for you — that's Scult's day job.
EXPLORE BRANDING & DESIGN
