Empty isn't rare — it's a normal state
A brand-new client account with no projects yet. A staff member with a clean schedule this week. A search or filter combination that legitimately returns nothing. These aren't edge cases in enterprise software — they happen every single day, for real users, and they're too often left as an afterthought: a blank white rectangle where the data table used to be.
Treat "zero rows" as a real screen state with its own design pass, the same way you'd design the loading state or the error state — because it's not rarer than either of those in practice.
Three different empty states, three different jobs
First-run: teach, don't apologize
A brand-new list with nothing in it yet is an onboarding moment. Show what belongs here and a clear primary action to add the first one — not a generic "no data" message.
Filtered-to-zero: help them undo it
When filters or search produce zero results, state which filters are active and offer a one-click "clear filters." Never make the user hunt for what they set to cause this.
Genuinely nothing exists: say so plainly
Sometimes "zero" is correct and expected — a manager checking a fully staffed week. A calm, factual message beats a cheerful illustration that reads as tone-deaf in a work tool.
Match the visual weight to the context
A large illustration is right for a first-run dashboard, wrong for a filtered table row inside a dense workflow. Scale the empty state's presence to how central that view is to the task.
Never reuse the error state's copy
"Something went wrong" on a legitimately empty list erodes trust fast. Empty and broken are different states and need visually and textually distinct treatment.
Test it with real permission boundaries
A user without create permission shouldn't see a prominent "Add new" button on the empty state. Design the read-only variant explicitly rather than hiding the button as an afterthought.
The cost of skipping this design pass
Skipped empty states are one of the most common reasons new users misjudge a product as broken or incomplete during their first session — precisely the moment they're forming an opinion of the whole tool. A single well-designed empty state with a clear next action does more for perceived product quality, per hour invested, than most feature work.
It's also cheap to build once the three variants above are defined as reusable components — a title, a message, an optional action, and a slot for context-specific illustration or icon — reused across every list and table in the product.
The takeaway
First-run, filtered-to-zero and genuinely-empty are three distinct states that each need their own message and action — not one generic "no data" placeholder. Build them as a small reusable component set once, respect permission boundaries in what actions they show, and an empty screen becomes a moment of clarity instead of a moment of doubt.
Let's talk about your frontendRelated reading
UX · Content
Document Management UX: Keeping Files Attached to the Right Context
UX · Interaction
Micro-Interactions That Earn Their Keep (and the Ones That Don't)
UX · Enterprise
Onboarding UX: Getting a New User to First Value, Not Just Through a Tour
See empty-state design applied in production on the FarmGate case study.