Microcopy That Works: Button Labels, Error Messages, and Empty States
Tiny bits of text make or break an interface. These examples show the difference between helpful and harmful copy.
Small Strings, Large Consequences
Microcopy is the text users actually read. Not your homepage headline, which they skim, but the three words on the button they have to press, the sentence that appears when their upload fails, and the line that shows up when their dashboard is empty. These are the moments where a user either succeeds or gives up.
The pattern in bad microcopy is always the same. The copy describes the system's state, not the user's problem. "Error 500" tells you the server is unhappy. "We could not save your work. Try again in a moment" tells you what happened and what to do. One leaves the user stranded, the other keeps them moving.
What follows are the three places microcopy fails most often, with side-by-side examples you can apply directly. The fixes are not creative writing exercises. They are a consistent way of thinking about who the reader is and what they need in the moment.
Button Labels: Vague vs. Specific
| Context | Weak label | Strong label |
|---|---|---|
| End of a signup form | Submit | Create my account |
| Next to a billing field | Continue | Review payment |
| On a file the user did not save | Cancel | Discard changes |
| In a free trial banner | Learn more | Start 14-day trial |
| Next to a risky delete action | OK | Delete project |
Read a button label and ask, if I pressed this, what would happen? If you cannot answer in one short sentence, the label is too vague. "Submit" fails the test because you have no idea what you are submitting. "Send invoice" passes because the outcome is obvious.
Error Messages That Actually Help
An error message is the worst moment in a user's session, and most interfaces make it worse by sounding like a robot reporting its own failure. The job of an error message is simple: tell the user what went wrong in plain language, and tell them how to fix it. Anything else is noise.
Bad error copy blames the user or hides behind code. "Invalid input" puts the burden entirely on the person who is already frustrated. Good copy names the actual problem and the path forward. "That email is missing an @ sign. Try entering it again." The user knows exactly what to correct.
Tone matters here too. A panicked error message, "Something went terribly wrong!", makes a small glitch feel like a crisis. A calm, factual one keeps the user's confidence intact. Save the personality for the success states, where it belongs.
Error Messages: Before and After
| Trigger | Unhelpful copy | Helpful copy |
|---|---|---|
| Password too short | Invalid password | Use at least 8 characters |
| Wrong login | Authentication failed | That email and password do not match |
| Upload too large | File exceeds limit | Keep files under 10MB |
| Missing required field | Error | Please add a delivery address |
| Payment declined | Transaction error | Your card was declined. Try another card. |
Write an Error Message in Four Moves
- 1Name what went wrong
Lead with the specific problem, not the word "Error." "Your upload stopped" is better than "Upload error." The user needs to know the nature of the failure before they can fix it.
- 2Say it in plain language
Drop the technical terms. Users do not know what a 403 is, and they should not have to. Describe the problem the way you would explain it to a friend who is not technical.
- 3Offer the next step
Every error message should point to an action. "Try again," "Check your connection," or "Contact support" all give the user somewhere to go. An error with no path forward is a dead end.
- 4Keep the tone even
Do not joke, do not panic, do not over-apologize. A single, calm sentence that states the problem and the fix reads as competent, which is exactly what a frustrated user wants from you.
Empty States Are First Impressions
An empty state is what a user sees the first time they open a feature, before they have created anything. Most teams treat it as an afterthought, leaving a blank screen or the words "No data." That is a wasted opportunity, because the empty state is where you teach the user what the feature is for.
A good empty state does three things. It explains what will go here once the user starts. It shows a clear button to take the first step. And it removes the feeling of staring at a void, which makes users assume the product is broken or that they are in the wrong place.
Think of the empty state as a guided onboarding screen. "You have no saved reports yet. Create your first report in two minutes." is more useful than a blank dashboard with a loading spinner that never resolves.
The Numbers Behind Better Copy
Microcopy is the interface talking back. Make sure it sounds like a helpful colleague, not a printer manual.
Make your writing sound human
Humanize AI-generated text in one click with AI Humanizer Lab.
Try for free