UX Copy
Write clear, concise, and human interface text. Every word in a UI earns its place — guide users, reduce friction, and reflect the product's voice.
UX Writing Principles
- Clear over clever: Users scan, not read. Say exactly what happens.
- Concise: Every word must earn its place. Cut filler ruthlessly.
- Actionable: Tell users what to do, not just what happened.
- Human: Write like a helpful colleague, not a robot or a lawyer.
- Consistent: Same action = same label everywhere.
- Accessible: Write for a global audience — avoid idioms, jargon, and cultural assumptions.
Copy by Component Type
Headings & Titles
- Use sentence case ("Create new project" not "Create New Project").
- Be specific: "Choose a payment method" not "Payment".
- Match the user's mental model of the task.
| Instead of |
Write |
| Settings |
Account settings |
| Error |
Something went wrong |
| Success |
Payment confirmed |
| Dashboard |
Your projects |
Buttons & CTAs
- Start with a verb: "Save changes", "Create account", "Send invite".
- Be specific about the outcome: "Delete project" not just "Delete".
- Primary CTA: 2-4 words max.
- Match the button to the heading/context:
- Heading: "Delete this project?" -> Buttons: "Delete project" / "Keep project"
- NOT: "Yes" / "No"
| Context |
Weak |
Strong |
| Sign-up form |
Submit |
Create account |
| File upload |
OK |
Upload file |
| Destructive action |
Yes |
Delete permanently |
| Save form |
Done |
Save changes |
| Newsletter |
Submit |
Subscribe |
Error Messages
Structure: What happened + Why (if not obvious) + What to do next.
{What happened}. {What to do}.
| Instead of |
Write |
| Invalid input |
Enter an email address like name@example.com |
| Error 403 |
You don't have access to this page. Ask your admin for permission. |
| Something went wrong |
We couldn't save your changes. Check your connection and try again. |
| Required field |
Enter your name to continue |
| Password error |
Password must be at least 8 characters with one number |
Rules:
- Never blame the user ("You entered an invalid email" -> "Enter a valid email address")
- Be specific about what's wrong and how to fix it
- Use inline validation where possible — don't wait for form submission
- Avoid error codes unless users need them for support
Empty States
Structure: What this space is for + How to fill it (with a CTA).
## {Feature name}
{Explain what goes here in 1 sentence}.
{How to get started — with a clear CTA}.
[CTA Button]
Examples:
- "No projects yet. Create your first project to get started." [Create project]
- "Your inbox is empty. Messages from your team will appear here."
- "No results found for '{query}'. Try different keywords or check your filters."
Loading & Progress States
- Keep it short: "Loading projects..." not "Please wait while we load your projects"
- For long operations, set expectations: "This usually takes 1-2 minutes"
- Use skeleton states over spinners where possible (show structure, not blankness)
| Duration |
Pattern |
| < 1s |
No indicator needed |
| 1-3s |
Skeleton / spinner |
| 3-10s |
Spinner + "Loading..." |
| 10s+ |
Progress bar + time estimate |
Confirmation & Success
- Be specific about what succeeded: "Project created" not "Success!"
- Include next steps if relevant: "Invite sent. They'll receive it within a few minutes."
- Keep celebrations proportional — don't confetti for saving a form.
Tooltips & Help Text
- Tooltips: 1-2 sentences max. Answer "what does this do?"
- Help text below inputs: explain format or constraints before the user makes an error.
- Progressive disclosure: show basic labels, reveal detail on hover/focus.
| Field |
Help text |
| Username |
Letters, numbers, and hyphens. 3-20 characters. |
| API key |
Find this in Settings > API. Starts with "sk_". |
| Date range |
Select up to 90 days. Longer ranges are available in exports. |
Onboarding & First-Run
- Welcome without wasting time: 1 sentence max before the first action.
- Use the user's name if available.
- Show progress: "Step 2 of 4"
- Let users skip: "Skip for now" (not "Maybe later" which is vague).
- End with value: show them what they just set up, not just "You're all done!"
Voice & Tone Matrix
Adapt tone to context while keeping voice consistent:
| Context |
Tone |
Example |
| Onboarding |
Warm, encouraging |
"Welcome! Let's set up your workspace." |
| Success |
Confident, brief |
"Changes saved." |
| Error |
Calm, helpful |
"That email is already in use. Try another or sign in." |
| Destructive action |
Serious, clear |
"This will permanently delete all project data. This can't be undone." |
| Empty state |
Friendly, guiding |
"No reports yet. Create one to start tracking your metrics." |
| Loading/waiting |
Reassuring |
"Importing your data. This usually takes about a minute." |
Delivery Format
When writing copy, output a structured spec:
## UX Copy — {screen/flow name}
### Screen: {name}
| Element | Copy | Notes |
|---|---|---|
| Page title | {text} | Sentence case |
| Subtitle | {text} | Optional — only if title needs context |
| Primary CTA | {text} | Verb-first, 2-4 words |
| Secondary CTA | {text} | |
| Field: Email | Label: "Email address" / Placeholder: "name@company.com" / Error: "Enter a valid email address" | |
| Field: Password | Label: "Password" / Help: "At least 8 characters" / Error: "Password is too short" | |
| Empty state | {text + CTA} | |
| Success toast | {text} | Auto-dismiss after 5s |
| Error banner | {text} | Persistent until resolved |
### Content Guidelines for This Screen
- Max heading length: {N} characters
- Max body text: {N} lines
- Truncation behavior: {ellipsis at N chars / expand on click}
Quality Checklist
Before delivering copy:
Edge Cases
- If input data is incomplete, state assumptions explicitly and flag gaps
- For time-sensitive situations, prioritize speed over comprehensiveness
- If multiple stakeholders have conflicting needs, document the tradeoffs
- For first-time use, start with a simplified version and iterate
- Adapt the depth and detail to the audience's expertise level
1---2name: ux-copy3description: Write UX copy for screens, flows, components, and micro-interactions. TRIGGER when: user says "UX copy", "microcopy", "write copy for", "button text", "error message", "empty state", "onboarding copy", or needs interface text.4---56# UX Copy78Write clear, concise, and human interface text. Every word in a UI earns its place — guide users, reduce friction, and reflect the product's voice.910## UX Writing Principles11121. **Clear over clever**: Users scan, not read. Say exactly what happens.132. **Concise**: Every word must earn its place. Cut filler ruthlessly.143. **Actionable**: Tell users what to do, not just what happened.154. **Human**: Write like a helpful colleague, not a robot or a lawyer.165. **Consistent**: Same action = same label everywhere.176. **Accessible**: Write for a global audience — avoid idioms, jargon, and cultural assumptions.1819## Copy by Component Type2021### Headings & Titles2223- Use sentence case ("Create new project" not "Create New Project").24- Be specific: "Choose a payment method" not "Payment".25- Match the user's mental model of the task.2627| Instead of | Write |28|---|---|29| Settings | Account settings |30| Error | Something went wrong |31| Success | Payment confirmed |32| Dashboard | Your projects |3334### Buttons & CTAs3536- Start with a verb: "Save changes", "Create account", "Send invite".37- Be specific about the outcome: "Delete project" not just "Delete".38- Primary CTA: 2-4 words max.39- Match the button to the heading/context:40 - Heading: "Delete this project?" -> Buttons: "Delete project" / "Keep project"41 - NOT: "Yes" / "No"4243| Context | Weak | Strong |44|---|---|---|45| Sign-up form | Submit | Create account |46| File upload | OK | Upload file |47| Destructive action | Yes | Delete permanently |48| Save form | Done | Save changes |49| Newsletter | Submit | Subscribe |5051### Error Messages5253Structure: **What happened** + **Why** (if not obvious) + **What to do next**.5455```56{What happened}. {What to do}.57```5859| Instead of | Write |60|---|---|61| Invalid input | Enter an email address like name@example.com |62| Error 403 | You don't have access to this page. Ask your admin for permission. |63| Something went wrong | We couldn't save your changes. Check your connection and try again. |64| Required field | Enter your name to continue |65| Password error | Password must be at least 8 characters with one number |6667Rules:68- Never blame the user ("You entered an invalid email" -> "Enter a valid email address")69- Be specific about what's wrong and how to fix it70- Use inline validation where possible — don't wait for form submission71- Avoid error codes unless users need them for support7273### Empty States7475Structure: **What this space is for** + **How to fill it** (with a CTA).7677```78## {Feature name}7980{Explain what goes here in 1 sentence}.81{How to get started — with a clear CTA}.8283[CTA Button]84```8586Examples:87- "No projects yet. Create your first project to get started." [Create project]88- "Your inbox is empty. Messages from your team will appear here."89- "No results found for '{query}'. Try different keywords or check your filters."9091### Loading & Progress States9293- Keep it short: "Loading projects..." not "Please wait while we load your projects"94- For long operations, set expectations: "This usually takes 1-2 minutes"95- Use skeleton states over spinners where possible (show structure, not blankness)9697| Duration | Pattern |98|---|---|99| < 1s | No indicator needed |100| 1-3s | Skeleton / spinner |101| 3-10s | Spinner + "Loading..." |102| 10s+ | Progress bar + time estimate |103104### Confirmation & Success105106- Be specific about what succeeded: "Project created" not "Success!"107- Include next steps if relevant: "Invite sent. They'll receive it within a few minutes."108- Keep celebrations proportional — don't confetti for saving a form.109110### Tooltips & Help Text111112- Tooltips: 1-2 sentences max. Answer "what does this do?"113- Help text below inputs: explain format or constraints *before* the user makes an error.114- Progressive disclosure: show basic labels, reveal detail on hover/focus.115116| Field | Help text |117|---|---|118| Username | Letters, numbers, and hyphens. 3-20 characters. |119| API key | Find this in Settings > API. Starts with "sk_". |120| Date range | Select up to 90 days. Longer ranges are available in exports. |121122### Onboarding & First-Run123124- Welcome without wasting time: 1 sentence max before the first action.125- Use the user's name if available.126- Show progress: "Step 2 of 4"127- Let users skip: "Skip for now" (not "Maybe later" which is vague).128- End with value: show them what they just set up, not just "You're all done!"129130## Voice & Tone Matrix131132Adapt tone to context while keeping voice consistent:133134| Context | Tone | Example |135|---|---|---|136| Onboarding | Warm, encouraging | "Welcome! Let's set up your workspace." |137| Success | Confident, brief | "Changes saved." |138| Error | Calm, helpful | "That email is already in use. Try another or sign in." |139| Destructive action | Serious, clear | "This will permanently delete all project data. This can't be undone." |140| Empty state | Friendly, guiding | "No reports yet. Create one to start tracking your metrics." |141| Loading/waiting | Reassuring | "Importing your data. This usually takes about a minute." |142143## Delivery Format144145When writing copy, output a structured spec:146147```148## UX Copy — {screen/flow name}149150### Screen: {name}151152| Element | Copy | Notes |153|---|---|---|154| Page title | {text} | Sentence case |155| Subtitle | {text} | Optional — only if title needs context |156| Primary CTA | {text} | Verb-first, 2-4 words |157| Secondary CTA | {text} | |158| Field: Email | Label: "Email address" / Placeholder: "name@company.com" / Error: "Enter a valid email address" | |159| Field: Password | Label: "Password" / Help: "At least 8 characters" / Error: "Password is too short" | |160| Empty state | {text + CTA} | |161| Success toast | {text} | Auto-dismiss after 5s |162| Error banner | {text} | Persistent until resolved |163164### Content Guidelines for This Screen165- Max heading length: {N} characters166- Max body text: {N} lines167- Truncation behavior: {ellipsis at N chars / expand on click}168```169170## Quality Checklist171172Before delivering copy:173174- [ ] Is every label/button specific enough to stand alone without surrounding context?175- [ ] Is the copy free of jargon, acronyms, and technical terms?176- [ ] Are error messages actionable (not just "invalid")?177- [ ] Does the copy work for the shortest and longest possible content?178- [ ] Is sentence case used consistently (not Title Case)?179- [ ] Are destructive actions clearly described with consequences?180- [ ] Would this make sense translated to another language?181- [ ] Are instructions positive ("Enter your name") not negative ("Don't leave this blank")?182183## Edge Cases184185- If input data is incomplete, state assumptions explicitly and flag gaps186- For time-sensitive situations, prioritize speed over comprehensiveness187- If multiple stakeholders have conflicting needs, document the tradeoffs188- For first-time use, start with a simplified version and iterate189- Adapt the depth and detail to the audience's expertise level