Turning 500+ error messages into one system

A copy cleanup, or a systems problem wearing copy's clothes?

Role

UX Designer & Writer, reviewing copy across other designers' features. Content design, design systems.

Context

Whatfix, 2024. B2B SaaS, digital adoption.

Outcome

500+ messages standardized into a framework, style guide, Figma library, and engineering automation

Before: four inconsistent one-off delete errors, Failed to delete, Unable to delete selected content, Failed to delete content, Can not delete content. After: one structured message, We couldn't delete your {type}. Try again later.
Four one-off delete errors collapse into one message that names what happened and what to do next.

The product

Whatfix is a B2B digital adoption platform: in-app guidance and self-help that live on top of other companies' software. Because that guidance surfaces inside someone else's product, the words carry most of the load, never more so than when something fails. For more information, see www.whatfix.com

The chair

I came into product design through writing, and my job then was reviewing copy across other designers' features. That review seat is a vantage: you see the whole product's surface at once, not one screen at a time. It's how I caught the same failure speaking in a different voice on every feature, invisible to any single team, obvious from where I sat. From that chair it wasn't a copy problem. It was a systems problem wearing copy's clothes.

Context

At Whatfix, a B2B SaaS platform for digital adoption, I was a UX writer reviewing copy across features owned by different designers and teams. Errors were written feature by feature, so the product carried hundreds of one-off messages with no shared logic, and most never told users what happened, why, or what to do next. For a platform whose whole promise is reducing user confusion, that was the core value working against itself.

No one had scoped it, because users rarely complain about error copy. They just quietly fail. Reviewing across all that work is what made the inconsistency visible to me when it was invisible to any single feature team. It wasn't assigned. I pitched the fix to the Head of Design with screenshots, framed as product quality, not cleanup. Greenlit on the spot.

How I checked it was real, not cosmetic

Engineering handed me a markdown export of every error string. It was dirty, full of stale messages that no longer shipped. Instead of editing the export, I walked the entire product by hand, verifying each message in context: where it appears, whether it still fires, whether its guidance is even true. That walk is the decision that turned a copy audit into a product audit. I wasn't cleaning up wording, I was auditing which failures the product actually surfaced and whether each one told the user anything useful.

The messy middle: finding the real axis

Verifying the messages told me which were real. It didn't tell me how they related. The export came organized feature by feature, so that's how I first laid them out in the sheet, and sorted that way, hundreds of messages just looked like hundreds of unrelated one-offs. There was nothing to design against. So I stopped organizing by where each message lived and started reading for why it fired.

Working sheet regrouping every message by error type and subtype: user has not provided input, empty space, failure on the product's part, each with a formula and real examples
Regrouped by cause · error type, subtype, formula, examples

Sorting by hand, the real pattern surfaced: the messages weren't about features at all, they were about kinds of failure. The user got something wrong; the user left something out; the system failed; something broke on the product's end. Regrouping around cause is what turned hundreds of one-offs into a handful of repeating situations, and once a message was defined by what had actually gone wrong, what happened / why / what to do next wasn't a template I imposed. It was the shape the data already had.

The model · every message, three moves

What happened

Name the failure in plain language, from the user's point of view.

Why

Give the cause only when it changes what the user should do.

What to do next

Hand back a way forward, the one action that resolves it.

What I changed: one framework, engineered to spread

A model is only useful if every message actually follows it, so the real work was making it scale instead of sitting in a doc.

  • 1I worked with engineering to run an automated find-and-replace across the codebase (legacy message to standardized version), plus a formula-driven sheet so future messages generate to spec.
  • 2I engineered adoption where it actually happens: I componentized the messages in Figma, where designers already worked. Some adopted the components and came to me only for final review; for the ones who didn't, I turned my own workflow into a gate, use the component first, then come to me, and demoed them hands-on so designers became capable, not just compliant.
Four inconsistent delete errors, Failed to delete, Unable to delete selected content, Failed to delete content, Can not delete content, collapsed into one message: We couldn't delete your {type}. Try again later.
Delete · four one-off variants reduced to a single templated message.
Before: Oops! Looks like we cannot proceed with your integration request, with no clear reason and the unclear word consent. After: We need OneDrive account access. Ask your admin to grant access to set up integration, which names the exact cause and a concrete action.
Integration · annotated rewrite that names the real cause and the action the user can take.
Figma assets panel showing the error-message template library: reusable components for each scenario, each with multiple variants and structured properties.
Figma · the framework componentized where designers already work, so the standard is the default.

Outcome, and an honest word on measurement

500+

messages standardized into one framework, style guide, Figma library, and engineering automation

35%

fewer L1 support tickets on Diagnostics, the one feature where I owned messaging end to end, measured by its PM after launch

That 35% belongs to Diagnostics, not the whole project. The standardization work itself has no single headline metric, because users don't file tickets thanking you for a clear error. They just succeed. I'd rather show you exactly where the impact is measurable than stretch one number over work that shows up as an absence of friction.

Published as "From Chaos to Clarity" on the Whatfix design blog

What I carry forward

You don't drive adoption of a system by telling people to use it. You meet them in the tool they already live in, make the standard the path of least resistance, and gate the ungated route. Adoption is behavioral engineering, not documentation quality.

Realizing that content problems are usually distribution problems is the thread that pulled me from writing into design. The same instinct as asking "what is this copy for?", scaled to "how does this system travel?"

"Content problems are usually distribution problems."