All articles Engineering

Designing a refusal message

Most systems tell the user what happened. Good ones tell them what to do.

Photo: Shixart1985 (CC BY 2.0) / Wikimedia Commons

"Access denied." "An error occurred." "Invalid request."

Each of these is technically accurate and each one wastes the reader's time completely. They describe a state without giving anyone a next action.

The three things a refusal owes the reader

  1. What happened, specifically enough to distinguish it from adjacent problems.
  2. Why, if the why is not obvious from the what.
  3. What to do now.

Most messages manage the first and stop. Some manage the first two and consider themselves helpful.

An example we got wrong

Our crypto admin page used to say: *Crypto checkout is on, but no coin has a receiving address.*

Accurate — that condition fires whenever nothing is payable. But it also fires when a coin *has* an address and simply is not switched on. So an operator who had just pasted an address was told, in red, that no address existed.

They reasonably concluded the save had failed. Then they pasted it again. Then they wrote to us.

The fix was to separate the two states and name the coin: *USDT has a receiving address but is not switched on. Tick "Offer USDT at checkout" and save.*

Same underlying condition. One of them costs a support ticket and a customer's confidence in whether your product saves things.

The pattern behind it

That bug has a shape, and once you see it you find it everywhere: a message written from the system's state rather than the user's.

The system's state was "nothing is payable". True, and useless. The user's state was "I just pasted an address and it is telling me there is no address". Two different conditions produced one message because the code checked one boolean.

When a message serves two situations, it is usually serving neither.

Say what it will do, not just what it is

The same applies to confirmations. "Are you sure?" asks the reader to supply the consequence from memory.

Compare:

End your subscription now?
You move to the Free plan immediately and lose the rest of the period you have paid for. There is no refund. If you only want it to stop renewing, use Cancel subscription instead.

That is longer, and it is the difference between somebody making a decision and somebody making a guess. It also names the *other* action they might have wanted, which is where half of destructive mistakes come from — the right button being adjacent to the one they needed.

The test

Read your error message as though you are the person seeing it: you do not know how the system works, you are in the middle of something else, and it is the end of a long day.

If your next thought is "...and?", the message is not finished.

Start building

Lock a key to your domain in about five minutes.

Get started