← All posts
UX Writing12 min read · September 9, 2026

How to Write Microcopy in UI

A practical guide to writing UI microcopy: seven copy types, four tones each, and 70+ real generated examples with a character count on every line.

MicroKopy
Content design, MicroKopy
Cover illustration for “How to Write Microcopy in UI”

Most advice on how to write microcopy in UI hands you adjectives. Be clear. Be concise. Sound human. That is true and it is nearly useless the moment you are looking at an empty button with a 20 character ceiling and a checkout that has to feel trustworthy. This guide is the version with the strings in it: the seven copy types you actually write, four tones for each, and a character count on every line.

Microcopy is the small functional text inside a product. The button you press, the error you hit, the empty screen before there is any data to show, the one line under a form field. It is not the headline on the marketing site. It is the words that do a job while someone is trying to finish a task, which is why a UX writer and a copywriter approach it differently. If that split matters to you, we pull it apart in UX writing vs copywriting.

Here is the part a normal guide cannot give you. Every example below was generated with MicroKopy's own prompt builders, the same ones behind MicroKopy's generator, then parsed and counted. Nobody wrote them by hand and they did not come from another product's screenshots. Read them as a fast first draft you would edit rather than a finished answer, and read them for the shape: real output, real length, four tones you can hold up next to each other.

The seven types, four tones, every character counted

MicroKopy generates seven copy types. Each block below is one type at four tone presets: professional, friendly, playful, and minimal. The number after each line is its character count, spaces included. Watch how little the meaning moves while the wording swings, and how the count moves with it.

Buttons and CTAs

A button label has the least room and the most weight. It is the last thing read before an action, so it should name the action or the outcome, never the mechanism. For the longer argument and more contexts, see the CTA button copy guide.

ToneCopyCharacters
ProfessionalComplete Purchase17
ProfessionalPay & Confirm Order19
ProfessionalPlace Your Order16
FriendlyComplete Your Order19
FriendlyPlace Order11
FriendlyConfirm & Pay13
PlayfulComplete My Order17
PlayfulPay & Ship It13
PlayfulLock In My Cart15
MinimalPay now7
MinimalComplete order14
MinimalConfirm and pay15

Error messages

An error arrives when someone is already annoyed. Say what happened, say it without blame, and give the next step. The same card decline reads very differently across tones, and the playful register is the one to handle with care here. There is a full framework in writing better error messages.

ToneCopyCharacters
ProfessionalYour bank declined this card. Try another card or contact your bank to authorize the charge.92
ProfessionalThis card was declined. Please use a different payment method or check with your bank.86
FriendlyYour bank declined this card. Try another card or contact your bank to sort it out.83
FriendlyThat card didn't go through. Double-check the details or use a different card to continue.90
FriendlyPayment didn't work this time. Please try a different card or check with your bank.83
PlayfulYour bank said no to this card. Try a different one, or give them a ring.73
MinimalCard declined. Try another card or contact your bank.53
MinimalYour bank declined this payment. Use a different card to continue.66
MinimalPayment failed. Check your card details or try another card.60

Empty states

An empty state is the first screen a new user sees before they have done anything. It is prime space to explain what will appear and to offer one clear action. Below, the three parts (a heading, a line of body, a button) are separated by slashes and the count is for the whole string. More on the design side in empty state copy.

ToneCopyCharacters
ProfessionalNo projects yet / Your projects will show up here once you create one. / [Create your first project]96
ProfessionalNothing here yet / Create a project to start designing. / [New project]67
ProfessionalStart your first project / This is where all your projects will live. Add one to get going. / [Start a project]107
FriendlyNo projects yet / Create your first project to start designing, prototyping, and sharing your work. / [Create a project]116
FriendlyYour projects will show up here / Once you create one, you'll be able to organize files, invite teammates, and track progress. / [New project]138
PlayfulNothing here but potential. Start a project and watch this space fill up. New project85
MinimalNo projects yet. Create one to get started. / [New project]58
MinimalYour projects will show up here. / [Create project]50
MinimalNothing here yet. Start your first project. / [Start project]60

Tooltips

A tooltip only shows when asked, so it should answer one question and stop. Even playful products keep tooltips functional, because the reader is in "what does this do?" mode, not "entertain me" mode. There is a longer piece on tooltip UX writing.

ToneCopyCharacters
ProfessionalBlocks exports and syncs until every design error is fixed.59
ProfessionalFlags spacing, color, and naming issues that don't match your design system.76
ProfessionalEnforces your design system rules and stops inconsistent styles from being used.80
FriendlyBlocks anything that doesn't match your design rules exactly.61
FriendlyWhen on, small inconsistencies get flagged instead of ignored.62
FriendlyTurns on stricter checks, so nothing off-spec slips through.60
PlayfulEnforces every design rule to the letter, so nothing slips through by accident.79
MinimalBlocks actions that break your design rules.44
MinimalFlags errors instead of letting them pass.42
MinimalStops exports until all issues are fixed.41

Form labels

Labels are where tone almost disappears. Look at the professional, friendly, and minimal rows: for a work email field they land on the same handful of words. Only the playful preset reaches for personality, and it pays for that with characters. Worth knowing before you brief a writer to make your forms sound warmer.

ToneCopyCharacters
ProfessionalWork email10
ProfessionalWork email address18
ProfessionalYour work email15
FriendlyWork email10
FriendlyYour work email15
FriendlyWork email address18
PlayfulWork email10
PlayfulYour work email15
PlayfulWork email (the one you actually check)39
MinimalWork email10
MinimalWork email address18
MinimalEmail (work)12

Confirmations

A confirmation reports what just happened, above all when it cannot be undone. Naming the blast radius ("all 40 files") is the difference between reassurance and a shrug.

ToneCopyCharacters
ProfessionalProject deleted. All 40 files were removed with it. You can start a new project anytime.88
ProfessionalProject removed, including all 40 files. This can't be undone.62
FriendlyDone! Your project and its 40 files have been removed for good.63
PlayfulPoof! Project and all 40 files are gone for good.49
PlayfulDeleted. That's 40 files back into the void.44
PlayfulAll clear! Project and its 40 files are history.48
MinimalProject deleted. All 40 files are gone.39
MinimalDeleted. Your project and its 40 files are gone for good.57
MinimalProject and 40 files deleted.29

Notifications

A push notification has two fields with two jobs. The title identifies and signals, the body gives the reason to tap. Both have their own ceiling, so both get a count. If you write these often, there is a whole guide to push notification copy.

ToneTitleTitle charsBodyBody chars
ProfessionalTrial ends in [days_left] days30Upgrade now to keep your projects, files, and exports fully accessible.71
ProfessionalYour export is ready20[file_name] has finished exporting. Tap to download it now.59
ProfessionalNew comment from [sender_name]30[sender_name] commented on your design. Tap to view and respond.64
FriendlyYour trial ends in [days_left] days35Upgrade now to keep your projects, exports, and comments moving without a break.80
Friendly[sender_name] left a comment28Tap to see what [sender_name] said and reply right in your file.64
PlayfulTick tock ⏰11Only [days_left] days left on your trial. Lock in a plan so nothing gets left behind.85
PlayfulFresh export! 📦16[file_name] is packed and ready. Tap to download and show it off.65
PlayfulNew comment 💬14[sender_name] just chimed in on your design. See what they think.65
MinimalTrial ends in [days_left] days30[days_left] days left. Upgrade to keep your work.49
MinimalExport ready12[file_name] is ready to download. Tap to view or share.55
Minimal[sender_name] commented23New feedback from [sender_name]. Tap to reply.46

What changes across tones, and what does not

Read down the tone columns and a pattern shows up. On a button or a form label, tone barely registers, because the space is too small to carry it. On an error, an empty state, or a notification, tone has room to change the feel of the whole message. That is the practical rule: spend your tone budget where there are characters to spend it, and keep the tightest slots plain.

One more thing the raw output taught us. The generator occasionally reached for a long dash to join two clauses, which is one of the clearest signals that a machine wrote a line. Those were edited out here by hand, which is exactly the kind of pass generated copy still needs. For a wider set of patterns pulled from shipping products, see our microcopy examples.

Why the character count is on every line

Length is not a style preference, it is a constraint the layout imposes. A primary button holds a few words before it wraps or clips. A push notification title is cut by the operating system somewhere around thirty characters, and the reader never sees the rest. A tooltip that runs three sentences means the interface failed to explain itself and copy is covering for it.

Writing to a known ceiling changes the work. Instead of writing a line and hoping it fits, you set the number first and choose among options that already respect it. That is why every example here carries its count, and why the counts are the detail practitioners actually ask for.

The three things most guides skip

Screen readers

A screen reader announces the text, not the picture. An icon-only button with no label is a silent button. The fix is an aria-label that reads like the microcopy would if it were visible: "Delete project", not "trash icon". Error messages need to be announced the moment they appear, through an assertive live region or role="alert", or a blind user keeps fixing a form they cannot tell is broken. A label that lives only as placeholder text vanishes the instant someone types, and it was never read aloud to begin with. The accessibility notes in form validation copy go deeper on the field-level version of this.

Localisation

English is one of the shorter languages you will ship in. The same string is often noticeably longer in German or Finnish, so a button that fits at home can wrap or truncate once translated. A character ceiling set in English gives your translators a target instead of a surprise. Two habits matter most. Leave room, so a snug English line has somewhere to grow. And never build a sentence out of concatenated fragments, because word order is not universal and the pieces will reassemble into nonsense. The generated notifications above use whole strings with placeholders like [file_name] and [days_left] for exactly this reason: the variable slots in, the sentence stays intact.

Testing your copy

You can catch most copy problems before a build. Read the line aloud; if you stumble, the user will too. Render it at the real width with the longest realistic value, so [sender_name] becomes a genuinely long name and not "Sam". Run one screen-reader pass over the flow. Where you have the traffic for it, an A/B test settles arguments that taste cannot, though it carries a real cost: version B ships to real people, so never test something that could cost a user money or data. Most of the time the character count catches the overflow long before any of that.

A pre-ship checklist

  • Name the action or the outcome, not the mechanism behind it.
  • Know the ceiling before you write, then write to it.
  • Say what happens next, above all after an error or a delete.
  • Make the label mean something on its own, so a screen reader can use it.
  • Check the longest realistic value, then translate and check the width again.

Where to start

Pick the one screen where users hesitate most and rewrite its copy against this list. You will usually find a button that hides its outcome, an error that blames the reader, or an empty state that says nothing. If you would rather start from options than a blank field, MicroKopy will generate all seven types to a character ceiling you set, and the demo runs without an account. Either way the goal is the same: words that do their job and get out of the way.

Frequently asked questions

What is microcopy in UI?
Microcopy is the small functional text inside a product: button labels, error messages, empty states, tooltips, form labels, confirmations, and notifications. It guides someone through a task, rather than selling to them the way marketing copy does.
What are the main types of microcopy?
This guide covers seven that MicroKopy generates: button and CTA copy, error messages, empty states, tooltips, form labels, confirmations, and push notifications. Each has its own length limits and its own job on the screen.
How long should microcopy be?
It depends on the slot, which is why every example here carries a character count. Primary buttons run best at two to five words, push notification titles get cut around thirty characters, and a tooltip that needs three sentences usually means the interface, not the copy, has a problem.
How do I choose a tone for UI copy?
Spend tone where there is room for it. On tight slots like buttons and form labels the tone barely registers, so keep them plain. On errors, empty states, and notifications there is space for a professional, friendly, playful, or minimal voice to change how the message lands.
How do I make microcopy accessible?
Give every icon-only control an aria-label that reads like visible microcopy, announce errors through an assertive live region or role="alert", and never rely on placeholder text as a label, because it disappears once someone types. See form validation copy for the field-level detail.
Should AI write my microcopy?
Treat generated copy as a fast first draft, not a final answer. It is good at producing options to a character ceiling and holding a consistent tone, but it still needs a human pass. The examples in this post were generated with the MicroKopy prompt builders and then edited, and that edit is the point.
MicroKopy

We build the copy layer for product screens: tone presets, character ceilings and a review trail that travels with every string.

Keep reading

All posts →

Write the words before the review

Free for one project and 200 strings a month. Google sign-in, nothing else to fill in.