Anatomy
There is no single empty state. There are four, and showing the wrong one is worse than showing none, because it asserts something untrue.
FIRST USE FILTERED TO NOTHING
┌───────────────────────────┐ ┌───────────────────────────┐
│ No invoices yet │ │ No invoices are overdue │
│ Invoices bill a client │ │ and owned by Dana. │
│ for completed jobs. │ │ 318 invoices exist. │
│ [ Create invoice ] │ │ [ Clear filters ] │
└───────────────────────────┘ └───────────────────────────┘
ALL DONE ERROR
┌───────────────────────────┐ ┌───────────────────────────┐
│ Queue clear ✓ │ │ Couldn't load invoices. │
│ Nothing is waiting on │ │ The billing service did │
│ you right now. │ │ not respond. │
│ [ Back to dashboard ]│ │ [ Try again ] │
└───────────────────────────┘ └───────────────────────────┘
Why it works
An empty screen is the only screen with no content to compete with the message, which makes it the most reliably read text in the product. First-use empty states are, in practice, the best onboarding surface anyone has: they appear exactly when the person is trying to understand the feature, and they cost nothing to build.
The other three kinds are about preventing a wrong conclusion. Emptiness is ambiguous by nature — the same blank area means "you have none", "your filter is narrow", "you are finished" and "we are broken". Naming which one it is removes the ambiguity, and that is the whole job.
The dangerous confusion
An error that looks like emptiness is the worst outcome in this pattern. A failed request rendering as "No invoices" tells a paying customer their data is gone. They will not report a loading bug; they will report data loss, or churn.
The same applies to a filtered list showing the first-use state — "No invoices yet. Create your first one" — when the person has three hundred invoices and a narrow filter.
Getting it wrong
- "No results." True, useless, and it is the default in almost every table component.
- The wrong kind. First-use copy on a filtered list; a create button on a finished queue.
- Blank. Indistinguishable from a rendering failure.
- An illustration and nothing else. A friendly drawing is not an explanation.
- A first-use state with no action, which explains the feature and then leaves the person with no way to start using it.
Exemplars
Slack's empty channel tells you what the channel is for and gives you the one action that makes it useful, which is why nobody has ever had to be taught what to do in a new channel.
Gmail's "You're all caught up" is the finished-queue state done as success, and it is a big part of why emptying an inbox feels like an accomplishment rather than an absence.
Stripe's filtered empty state names the filters back to you and offers to clear them — the small thing that stops people concluding the data is missing.
The extractable rule: empty is a question, and the screen has to answer it. Which of the four kinds this is, is the answer.