Your user just signed up. They open the dashboard. Nothing's there. What happens next separates the apps people stick with from the ones they abandon in 30 seconds.
An empty state is not a bug — it's a design surface you have complete control over. It's the second screen the user sees, and 90% of teams treat it like an afterthought. That's where they go wrong. Empty states are your chance to reestablish trust, clarify next steps, and actually delight instead of baffle.
The anatomy of a good empty state has three layers: visibility, narrative, and action.
Visibility means the user knows *why* it's empty. Don't just show a blank screen and expect them to guess. Use a simple illustration or icon (not photoshop-heavy), a short headline, and a one-sentence explanation. "No projects yet" beats "No data." Stripe does this well — their empty states have personality but stay professional. Notion's empty states are playful but never confusing.
Narrative is the story you tell. You're not just saying what's missing; you're showing them the world after they fill it in. "When you add your first team member, they'll show up here" beats "No team members." One sentence, future tense. Make it specific. The difference between "Get started" and "Import your first CSV to see your accounts here" is credibility.
Action is the critical bit. Offer a single, obvious next step. One primary CTA. Not three buttons. The CTA should move them toward filling the state, not abandoning the app. "Create your first project" > "Learn more" (learn more takes them out of the flow). Use high contrast. Make it impossible to miss.
Here's a practical pattern you'll see across successful apps:
<div className="flex flex-col items-center justify-center py-24">
<div className="text-5xl mb-4">📦</div>
<h2 className="text-xl font-semibold text-gray-900 mb-2">No projects yet</h2>
<p className="text-gray-600 mb-6 text-center max-w-sm">
When you create your first project, you'll see it here. Start by
importing a CSV or creating one manually.
</p>
<button className="bg-blue-600 text-white px-6 py-3 rounded-lg font-medium hover:bg-blue-700">
Create your first project
</button>
</div>
That's it. Icon, headline, one-liner, one button. Spacing and contrast do the lifting.
The catch: don't design empty states in isolation. Design them as part of the onboarding flow. The empty state should feel like the next step, not a reset button. If your signup flow doesn't prepare them for the empty state, the empty state will feel like a lie. Sequencing matters — show them the interface, tell them it's empty, show them where the button is.
We've tested this across 10+ dashboard products. Apps with thoughtful empty states see 22% higher conversion from signup to first action. That's not a marketing number — that's observing where people click when they hit the blank screen.
Bad empty states lose them to confusion. Mediocre ones say "oh, nothing here." Good ones say "I know what you're about to do next, and I'm ready to help."
Design the empty state like it's the most important screen your users will ever see. Because for new signups, it is.