Photo via Unsplash
Every product I have worked on had a beautiful happy path in Figma. The dashboard was full of data, the cart had three products in it, and every form was submitted successfully on the first try.
Then the product went live, and real people started meeting the screens we never designed.
The first time a new user opens an app, the dashboard is empty. When the connection drops, something has to appear. When a payment fails, a message has to explain what happened.
These moments are not edge cases. For a lot of users, they are the first impression.
Empty
An empty screen with “No data yet” tells people nothing. It feels like a dead end, and dead ends make people close the app.
I like to treat every empty state as a small onboarding moment. It should tell people what will appear here, why it matters, and the one action that fills it up.
Dead end
No orders yet
Tells people nothing. No reason to stay, no next step.
Invitation
Your orders will show up here.
Start with your first restock and track it in one place.
Start a restockSame space, but it explains what comes and gives one clear action.
Error
Most error messages are written by whoever builds the feature, usually at the very end, usually in a hurry. That is how we end up with messages like “Error 402: Transaction failed.” The user does not need the code. They need to know what went wrong and what to do next.
A good error message answers three things in plain language. What happened, whether their money or data is safe, and how to fix it.
Checkout
Written by
Waiting for payment
Loading
Waiting feels longer when nothing tells you what is happening. Skeleton screens, progress steps and small bits of copy like “Pulling your latest orders” make the same three seconds feel shorter.
People are surprisingly patient when they understand what they are waiting for.
Same wait, two ways
0.0sSpinner only
Nothing tells you what is happening.
Skeleton and copy
Pulling your latest orders
You can see the shape of what is coming.
Handoff
These days I add a simple checklist to every screen before handoff. For each one I ask what it looks like empty, what it looks like when it fails, what it looks like while loading, and what it looks like with way too much content.
It adds maybe an hour to the design process and saves weeks of awkward fixes after launch.
Your orders will show up here.
Start a restockWe couldn’t load your orders. Your data is safe, check your connection and try again.
Pulling your latest orders
Previewing: Happy path
Before handoff
0 / 4The screens nobody designs are the screens users remember.
They show up exactly when something feels off. Designing them with care is one of the cheapest ways to make a product feel trustworthy.
Keep Reading