Designing Empty States That Teach the Product
Empty screens are not placeholders—they are onboarding. How to write, layout, and sequence first-run UI so people know what to do next.
Designing Empty States That Teach the Product
An empty list is not a failure of content. It is the first conversation your product has with someone who has not yet succeeded. Treat that screen like onboarding compressed into one panel.
Empty is a mode, not a missing design
Most products ship three related states and only polish one of them: the populated happy path. The other two—empty and error—get a dashed box and a shrug. Users spend disproportionate time in those states early on, which means your weakest UI is what forms first impressions.
Name the modes explicitly in your component API or design notes:
- Blank — never used; no data expected yet
- Filtered empty — data exists, current filters hide it
- Error empty — load failed; retry is possible
- Success empty — action completed and cleared the list (rarer, but real)
Each mode needs different copy and actions. “No posts yet” is wrong when the user applied a tag filter that matches nothing. “Couldn’t load posts” is wrong when the API succeeded with []. Collapsing those into one generic empty component is how people bounce.
Wire the modes in code early. A single EmptyState with variant props beats three one-off markup blocks that drift apart. Shared structure, different message and primary action—that is the pattern.
Write copy that points at the next click
Empty-state copy fails when it describes the void instead of the path out of it. “Nothing here” is accurate and useless. Prefer verbs tied to the primary control on the screen.
Strong patterns:
- Name the outcome — “Create your first paste” beats “No pastes”
- Name the constraint — “Upload an Instagram export ZIP to compare followers”
- Name the fix for filters — “No posts match ‘css’. Clear filters or try another tag.”
Keep secondary text short. One supporting sentence for context, then the button. Walls of explanation belong in docs, not in the middle of a list region. If you need a longer “how to export your data” guide, link it—do not paste the whole guide into the empty panel.
Tone should match stakes. A fun side project can be warm; a privacy tool should be calm and precise. Humor that jokes about “your sad empty inbox” can feel dismissive when someone is anxious about data. Clarity first, personality second.
Also watch for blame. “You haven’t added anything” reads colder than “Add a post to get started.” The user did not fail; the product is waiting. The same rule applies to errors: “We couldn’t read that file—try a ZIP export from Settings → Your activity” teaches recovery without implying the person did something foolish.
When localization enters the picture later, keep strings complete sentences rather than glued fragments. Empty states are oddly sensitive to awkward grammar because they sit alone on a quiet screen.
Layout the empty state like a real screen
Visually, empty states often float as tiny centered blobs in a huge white region. That wastes hierarchy. Give the empty state the same structural weight as a populated list: consistent padding, a clear title level, and a primary button that matches other CTAs in the app.
Practical layout tips:
- Place the empty state inside the content column, not as a global modal
- Use the same heading size you would for a section title
- Put the primary action where the eye already looks for “create” elsewhere
- If illustrations help, keep them quiet; they should not outrank the text
For filtered empty, keep the filter controls visible and focused. The fix is usually adjusting filters, not navigating away. For error empty, put retry next to a short reason—and avoid burying the only recovery action under “Learn more.”
Keyboard and screen-reader users need the same clarity: the empty region should announce the state, and the primary action should be reachable without hunting. Do not rely on color alone to distinguish error from blank.
Sequence first-run so empty becomes rare quickly
The best empty state is temporary. Design the first session so people cross into “has data” without friction.
Tactics that work on small sites and tools:
- Offer a sample dataset or demo mode with a clear “using sample data” badge
- Prefill with one template the user can edit instead of starting from zero
- After first success, celebrate briefly, then get out of the way
- Remember dismissals: do not re-show a “welcome empty” after they have content
Be careful with fake content that looks real. Sample posts labeled as samples teach the UI; placeholder Latin that looks like a bug teaches distrust. If you seed examples, mark them and make removal obvious. A “Load demo file” button next to “Choose file” often converts curiosity into a completed flow without requiring personal data on the first visit.
Also plan the return visit. Someone who succeeded once and comes back to a true empty list (they deleted everything, or storage cleared) should still see helpful copy—not a dead end that assumes they “already know.” Persistence of onboarding tips can be soft: show a compact hint once, then stay quiet unless the list is empty again.
Measure qualitatively if you lack analytics: watch one friend use the blank screen. Where they hesitate is where copy or layout failed. Fix that before adding another feature to the populated view. One observed hesitation is worth more than a week of guessing in Figma alone.
Wrap-up
Empty states teach the product when you treat them as first-class modes with honest copy, solid layout, and a path to the first success. Design blank, filtered, and error separately, point every sentence at the next click, and shorten the time people spend staring at nothing. The list will fill—your job is making sure they stay long enough to fill it.