Default copy sounds like a form letter: "Confirm your email address", "An error occurred", "No items found". Every string a user reads is the product talking. Establish whose voice it is and who is reading it, then write in that voice all the way down — including the transactional strings nobody thinks about.
When to use
- Writing UI copy, email subjects and bodies, notifications, toasts, errors, empty states, onboarding, receipts, tooltips, CTA labels
- Shipping any feature that adds a user-visible string, including the auth, billing, and error paths a framework scaffolded for you
- Reviewing copy that reads as generic, or as off-key for the product it lives in
Rules
- Find the voice before writing. Read the landing page, the strings on adjacent screens, and any brand doc; match what exists rather than inventing better.
- The vibe never costs the meaning. The reader still learns what happened, what it affects, and what to do next.
- Dial personality down as the stakes go up — lost money, deleted data, security, outages, legal, health. Keep the warmth, drop the jokes, and never be sarcastic about work the reader just lost.
- Personality is word choice and rhythm, not decoration. Rewrite the sentence; an emoji bolted onto corporate phrasing reads as a costume.
- Labels name what will happen, in the reader's words — "Send invite", "Delete forever", not "Submit" or "OK".
- Keep every specific. Amounts, deadlines, limits, causes, file names, and next steps survive rewriting into any tone.
- Write subjects and notification titles for a crowded inbox — read alone and truncated. Front-load the identifying word; never a punchline the body has to complete.
- Sweep the siblings. One witty toast among nine framework defaults is worse than nine defaults.
- Skip what ages or travels badly. Memes, slang, and puns date fast and don't localize — a translator gets the words, not the joke.
- Keep accessible names literal.
aria-labels and alt text are read out of context; let the visible copy carry the voice.
Establish the voice before writing a word
- Read the product's own surfaces — landing page headline, hero copy, the app name, the strings already shipping next to the one you are writing.
- Look for a stated voice: brand guidelines, a tone section in the design docs, the marketing site's about page.
- Search the codebase for siblings and read them:
grep -rn "Welcome\|Sign in\|Something went wrong" src/ - Name the audience explicitly: who they are, what they came to do, and what mood they are in at this exact screen — a signup screen and a failed-payment screen share a brand but not a reader.
If the product already has a voice, match it. If it genuinely has none, propose one in a sentence and say that you did, rather than silently picking.
Name the vibe on four axes
- Formality — legal notice ↔ group chat
- Energy — calm and spare ↔ exclamation points and emoji
- Warmth — neutral machine ↔ enthusiastic friend
- Density — terse labels ↔ full conversational sentences
Set all four once, then write every string on that setting. One string drifting off the setting is what makes a product feel machine-assembled.
One message, four products
| Product vibe | Email subject | Empty state | Failed upload |
|---|---|---|---|
| Playful consumer | "One tap and you're in 🎉" | "Nothing here yet — let's fix that." | "That file didn't make it. Try again?" |
| Serious B2B / fintech | "Verify your email to activate your account" | "No transactions in this period." | "Upload failed: file exceeds the 25 MB limit." |
| Developer tool | "Verify your email" | "No projects yet — run foo init to create one." |
"Upload failed (413). Max size 25 MB." |
| Warm wellness / care | "Welcome — let's confirm it's you" | "Your journal is empty. Start whenever you're ready." | "We couldn't save that. Your entry is still here." |
Every cell carries the same information. Only the voice changes.
Examples
Good: "One tap and you're in 🎉" — playful habit tracker; the action is still obvious.
Bad: "Confirm your email address" — same app; correct, and sounds like a bank.
Good: "Verify your email to activate your account" — payroll tool; plain on purpose.
Bad: "You're almost part of the fam! 🥳" — same tool; undercuts the trust it needs.
Good: "Your payment didn't go through, so your plan is paused. Update your card to
pick up where you left off." — bad news, warm but straight.
Bad: "Uh oh! Our hamsters dropped your credit card 🐹 Give it another whirl!"
— jokes about the reader's money and never says the plan is paused.
Good: "3 uploads finished — 1 needs a new name." — front-loaded for a lock screen.
Bad: "Guess what happened while you were away!" — unreadable without opening the app.