Guidelines for writing copy across Customer.io interfaces.
Copy is direct, calm, helpful, and human. It is not chatty, apologetic, self-promotional, or passive.
| Characteristic | Do | Don't |
|---|---|---|
| Direct | "Save changes" | "Go ahead and click Save to save your work" |
| Calm | "Connection lost. Check your network connection." | "Oops! Something went wrong." |
| Helpful | "No segments found. Adjust your search filters." | "No segments found." |
| Human | "This message will send to 4,200 people." | "This message will be delivered to 4,200 recipients." |
| Neutral | "The Agent is ready." | "You've unlocked a powerful new feature!" |
Use the specific term, never "user":
"user" may remain only as a raw data-model field name in code — never in UI copy.
Use "you" and "your" to address the person directly. Don't mix "my" and "your" on the same screen. Pick one and use it consistently throughout a flow. Remove possessives when they add no meaning.
Don't start a sentence with "this" or "that" unless the noun immediately follows. It's ambiguous in context and harder to parse.
Tone adjusts to what the person is experiencing. A person completing their first setup flow needs reassurance. A person facing a destructive action needs precision.
| Context | Tone | Example |
|---|---|---|
| Task flow | Functional, invisible | "Save changes" |
| Onboarding / first use | Warm, clear | "You're all set. Your first message is ready to send." |
| Empty state | Helpful, inviting | "No segments yet. Create one to start targeting your audience." |
| Success | Brief, positive | "Campaign sent." |
| Warning | Clear, non-alarmist | "Deleting this attribute will remove it from 4,200 people." |
| Error | Direct, actionable | "Your changes couldn't be saved. Check your connection and try again." |
| Destructive / irreversible | Serious, precise | "Deleting this campaign is permanent and cannot be undone." |
| AI output | Outcome-first, hedged | "Based on recent behavior, these people are more likely to re-engage." |
Use sentence case everywhere (capitalize the first word and proper nouns only). That includes: headings, labels, buttons, tooltips, placeholder text, empty states, error messages, nav items, column headers.
When in doubt, use sentence case. Title case in labels creates inconsistency and adds visual noise: it's harder to scan, harder to localize, and creates a second capitalization system that readers have to learn.
Always capitalize proper nouns: Customer.io, Liquid (the templating language), and established
product, feature, plan, and program names. Keep their capitalization everywhere, including
mid-sentence. Examples:
Common nouns are not proper nouns and stay lowercase mid-sentence: segment, campaign,
broadcast, message, profile, member, automations. Field and preposition words are lowercase
too — from address, reply to address, to, from — capitalized only when they start a label
(e.g. "From address" as a field label, but "Add a from address" mid-sentence). When a term names a
specific product surface, it's a proper noun; when it's a generic concept, it's lowercase.
Sentence case is the default. Beyond Customer.io, product-area and feature names are proper nouns:
capitalize them when you're naming the feature or area; use lowercase for the common
adjective/noun form. The same word can go either way depending on how it's used — the rule is
contextual, not a fixed always-capitalize list.
Rule of thumb: naming the feature or area → capitalize; describing the thing generically → lowercase.
Special cases: the branded phrases with no common-noun form are always fully capitalized —
Data Pipelines and Design Studio — as is Customer.io. Every other multi-word area is sentence
case (Data index, Email layouts, Inbox preview, Message library, Custom objects).
Product areas that follow this contextual rule (capitalize when naming the feature/area, lowercase as a common noun):
Assets · Broadcasts · Campaigns · Collections · Custom objects · Data index · Data Pipelines (always) · Deliveries · Design Studio (always) · Destinations · Email layouts · Exports · Geofences · Goals · Imports · In-App · Inbox preview · Integrations · Journeys · Message library · Newsletters · Reports · Segments · Snippets · Sources · Transactional · Workspaces
Use periods for full, complete sentences. Do not use periods for standalone labels, button text, short and incomplete phrases, nav items, column headers, modal titles, etc. Periods for labels signal that something requires comprehension rather than a quick scan.
Question marks are used to seek confirmation from the user for an action that will be performed. They typically denote destructive actions where informing the user helps prevent errors but may be used in other cases such as when asking for feedback.
Reserve exclamation points for genuine milestones and warm moments — a welcome, a thank-you, a standout positive result — to preserve impact. Don't use them for routine confirmations (like a save) or in errors and warnings. Use at most one per screen.
Ellipses indicate that something is in progress or that more input is needed. There are two valid uses:
Use an ellipsis after present participles in loading and progress messages.
Use an ellipsis (…) when a button opens a dialog or requires additional input before the action completes. It signals "there's more to do before this happens" and removes hesitation from people who aren't sure what will be affected.
Do not use a trailing ellipsis anywhere else in UI text. Placeholders in particular never take one — the field itself is the input, so write "Search", not "Search…".
Always use the single ellipsis character (…), never three periods (...). Three periods look like AI-generated filler and don't render as a true ellipsis.
Do not use em dashes (—). Em dashes have become strongly associated with AI-generated text and add visual noise in dense interfaces. Restructure the sentence or use a comma instead.
Use an en dash (–) for ranges.
Use colons to introduce a list or label-value pair. Do not add a space before the colon. Omit the colon when the label and value are visually separated by layout.
Use ampersands (&) in established product names ("Data & Integrations") and in space-constrained UI — labels, tabs, panel titles, nav items, table headers, and tags ("Preview & testing", "Tips & resources"). Write and in prose and full sentences.
Use parentheses to define an acronym or term on first use, and for short qualifiers or scoping ("Forced dark (Outlook)", "(No subject)"). Do not use them for asides or extra thoughts — restructure the sentence instead.
Always use an oxford comma in lists of three or more.
4,200 people not Four thousand two hundred people1,200 not 12001.2K, 4.8M10:30 am, 4:00 pm10:30 am ET9:00 am–5:00 pmJuly 28, 2025MM/DD/YYYYUse relative time for timestamps and activity feeds. Use the appropriate unit once it reaches its threshold. Use 1 hour ago instead of 60 minutes ago.
Elapsed time:
Just now1 minute agoX minutes ago1 hour agoX hours ago1 day agoX days ago1 month agoX months ago1 year agoRemaining time:
X hours remainingX minutes remainingX seconds remainingAbout X minutes remaining (use "about" for estimates)Generic verbs like "Submit", "Confirm", and "OK" require people to hold surrounding context to understand what will happen. Specific verbs like "Delete campaign" and "Send newsletter" let people act with confidence. This matters most for destructive actions, where a vague label can have significant consequences.
When using the word "Yes" within a label, pair it with the action that will take place to improve clarity.
| Type | Pattern | Examples |
|---|---|---|
| Primary action | Verb + object | Create campaign, Add people, Send broadcast |
| Destructive | Delete + object | Delete segment |
| Confirmation | Verb restating the action | Delete campaign, Send now |
| Cancel / dismiss | Cancel, or a specific dismiss verb | Cancel; "Keep my account" or "Go back" when it clarifies the choice |
| Save | Save / Save changes / Save and close | Match to interaction model |
| Progressive | Forward-motion verb | Next, Continue, Set up object |
| Dialog-triggering | Verb… | Export… |
| Loading state | Present participle… | Saving…, Sending… |
Error states are high-anxiety moments. Vague errors ("Something went wrong") make people feel helpless. Blame-framed errors ("You entered an invalid value") create frustration. A good error message turns a moment of friction into a moment of guidance. It is often the difference between a person recovering independently and submitting a support ticket.
Answer as many of these as possible:
Frame validation errors as instructions, not accusations.
Use passive voice in payment, security, and account errors where active voice would imply blame or cause alarm.
State the consequence. If the action is reversible within a time window, say so. It's more informative and less alarming than stating only that something will be deleted.
Confirm what happened. Keep it brief. No editorializing. Reserve positive, warm tone and exclamation points for genuine milestones and warm moments (a welcome, a thank-you) — not routine confirmations.
"You entered an invalid email" → "Enter a valid email address.""Something went wrong" is never acceptable.Language can exclude people in ways that are both immediately obvious to the affected person and invisible to everyone else. For example, "easy" and "simple" invalidate the experience of people who find things hard.
| Don't use | Use instead |
|---|---|
| Whitelist | Allowlist |
| Blacklist | Blocklist |
| Master / slave | Primary / replica, leader / follower |
| Sanity check | Check, verify, review |
| Dummy data | Sample data, placeholder data |
| Kill / abort | Stop, cancel, end |
| Click | Select |
| See (as in "see all results") | View |
| Watch (video) | Play |
| Hit (a button) | Select |
| Easy / simple | Remove or rephrase |
| User / end-user | Profile (a workspace's end customers) or member (people who use the Customer.io product) |
| Solution (as a noun) | Reframe as active verb phrase |
| Recalled / revoked / rescinded | Not available, not supported |
| He / she | They |
| He or she | They |
Use the most specific term available over generic abstractions.
Alt text makes images accessible to people who use screen readers and provides context when images don't load. Every informative image needs alt text. Decorative images should use alt="" to hide them from screen readers.
alt="" for decorative images.alt=""."Open rates peaked at 42% in March, driven by the re-engagement campaign." For complex charts, note the general pattern and link to the underlying data.AI features carry a specific set of trust risks that standard copy rules don't cover. Overclaiming ("optimal", "best") sets expectations the system can't always meet. Describing the technology instead of the outcome makes copy feel like a press release. Presenting AI output as final removes agency. Calling the Agent "a bot" or "a tool" undersells a capability that is core to the platform's value.