The button label is an instruction, not a decoration.
"Write clear UI copy for labels, errors, empty states, and tooltips so every word earns its place."
Why this exists
Bad UI copy is invisible until a user hits a wall. 'An error occurred' is not an error message; it is an admission of failure dressed as information. Every label, tooltip, placeholder, and error string is a tiny piece of the interface's promise to the user. When that copy is generic, vague, or passive, the interface feels broken even when the code works perfectly. Good copy is a design decision, not a writing task.
Operational Flow
Lead with the action, not the object: Buttons say 'Save changes' instead of 'Submit'. Destructive actions say 'Delete project' instead of 'OK'. The label must make sense on its own.
Write errors in plain English with a path forward: Every error message must answer what happened, why it happened, and what the user should do next. For example, use: 'Upload failed. The file is larger than 10 MB. Try compressing it first.'
Empty states explain and prompt: An empty state is not a blank screen with 'No results'. It explains why it is empty and gives one clear action. For example: 'No invoices yet. Send your first one to a client.'
Avoid passive voice in critical moments: 'We suspended your account. Here is why' is easier to act on than 'Your account was suspended'. Passive voice is fine in tooltips, but not in errors.
Review copy during design, not after: Copy is not a fill-in step at handoff. Every Figma frame must have real copy in the first review. If a frame has 'Lorem ipsum' or 'Button Text', it is not ready.
Maintain a project-level UI copy document: Keep a single document with all confirmed strings, including labels, errors, toasts, and modals. This stops copy from drifting between Figma, the code, and the client.
What good looks like
- A user hits a validation error and immediately knows what they typed wrong and what format is expected, without leaving the page.
- A tooltip on an icon button explains exactly what that button does in under five words.
- An empty state on a dashboard reads like a genuine prompt to get started, not an apology.
What NOT to do
- Don't write 'Please try again later' as a standalone error. That is just a support ticket disguised as copy.
- Don't use title case for buttons and labels. Sentence case is correct except for proper nouns and navigation items.
- Don't leave copy decisions to engineers working in isolation. Copy is a design responsibility.
The most common UI copy failure is vagueness, not misspelling. We have all shipped ‘Something went wrong’ under a tight deadline. It is always the wrong call. A user who sees ‘Something went wrong’ learns nothing. A user who sees ‘Your session expired. Sign in again to continue’ knows exactly what to do next.
Every string in the interface is a sentence someone reads at a moment of friction. Write for the person who is confused, in a hurry, or skipped the onboarding. Clear copy is not a nice-to-have. It is the cheapest form of user support you will ever ship.