How do you write an error message that helps instead of blames?

On this page

A helpful error message names what went wrong in plain language and tells the user how to fix it, treating the moment as a recovery instruction rather than an accusation. That is the method in one line: state the cause, then state the fix, both in words the user already understands. An error is a place where someone is stuck, and the job of the message is to get them unstuck, not to record fault or display a code. The shift from blame to help is mostly a shift in what the message is for. It exists to move the user forward, and everything in the wording should serve that.

The reasoning is that a person hits an error already frustrated, and the message arrives at the exact moment their patience is thinnest. A generic “something went wrong” tells them nothing, so they are left frustrated and stuck. A technical code or stack-trace fragment tells them something they cannot act on, which reads as the system shrugging. And a message phrased around what the user did wrong, “invalid input,” “you failed to,” adds a sting of accusation on top of the dead end. None of those move the person forward. The plain-cause-plus-fix method does, because it answers the two questions the stuck user actually has: what happened, and what do I do now. The “show a generic error or a technical code” default sidesteps both, which is why it feels like a wall, and dressing that same wall up with a friendly tone does not help, since a cheerful “oops” with no cause and no fix is still a dead end wearing a smile.

Picture a sign-up form that rejects a password. The blaming version says “Error: invalid password,” which names a fault, gives no reason, and leaves the user guessing what rule they broke. The helpful version says “Your password needs at least 8 characters and one number, add a few more characters to continue.” It names the cause in plain terms, it states the fix concretely, and it never once implies the user did something wrong, it just tells them what the password needs and how to get there. The user reads it, fixes it, and moves on, which is the entire point of the message existing.

The catch is that this is about wording, not about the error-handling logic underneath, and good wording cannot rescue a system that should not have failed in the first place. If an error is preventable, the right fix is to prevent it, not to write a kinder message about it, and a message that says “the fix” should point to something the user can actually do, not paper over a problem only the system can solve. There is also a line where plain language must not become vague: “guide, not blame” never means hiding the real cause behind reassurance, because a fix the user cannot connect to a cause is no fix at all. The method is plain cause and a usable fix, and both halves have to be true.

When you write an error, draft it as two plain sentences: what happened, and what to do about it. Strip the jargon, strip the codes, and strip any phrasing that points a finger at the user, then check that the fix is a step they can actually take from where they are standing. Read it back as if you were the stuck person reading it, and if it leaves you knowing the cause and the next move, it is doing its job. Write errors as recovery instructions, and they will move people forward instead of scolding them.

Leave a comment

Your email address will not be published. Required fields are marked *