Skip to content
Design/writing-for-ui

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."

Authored by:Ali AhmedAli Ahmed

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

1

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.

2

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.'

3

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.'

4

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.

5

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.

6

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.