Skip to content
FoundationsLesson 8 of 9Intermediate10 min

Usability heuristics

A short checklist of interface common sense — status, control, consistency, error recovery — you can audit any screen against in minutes.

Kept on this device only.

In one line: usability heuristics are a small set of interface common-sense rules — does the screen show its status, let you back out, stay consistent, and help you recover — that you can hold up against any design and spot what's broken in minutes.

What it is

A heuristic is a rule of thumb: not a law, but a question worth asking every time. Usability heuristics are a compact list of those questions, distilled from decades of watching people stumble through interfaces. They cover the recurring ways screens fail — hiding what's happening, trapping you in a flow, surprising you with inconsistency, scolding you with errors you can't act on.

Running a screen against the list is called a heuristic evaluation. You walk the interface as a user would, and at each step you ask: can I see the system's status here? Can I undo or back out? Does this match how the rest of the app behaves? When something is off, you name the heuristic it breaks. That name turns a vague "this feels clunky" into a specific, fixable defect.

Why it matters

Most usability problems are not exotic — they're the same handful of mistakes, made again and again. A checklist catches them cheaply, before you spend money watching real users hit the same wall. One or two evaluators with a good list will surface a large share of the issues in an afternoon, no lab required.

The value is shared language. "The Continue button is confusing" invites an argument about taste. "There's no visible system status on the payment step, and no way back except the browser button" points at two named heuristics, and the fixes write themselves. Heuristics turn opinion into a punch list — which is also their limit: they tell you a rule is broken, not whether real people actually trip on it. They're where evaluation starts, not where it ends.

See it

Live demo
Tweak it3
Toggle between a checkout that ignores the heuristics and one that respects them.

How it works

The demo shows one checkout step twice. Toggle Respect the heuristics and watch the same screen go from quietly broken to quietly correct. Four rules do most of the work:

  1. Visibility of status. The broken version never tells you where you are or what you'll pay — the total is "shown on the final step." The fixed version adds a step indicator (this is step 3 of 4) and a running total. The principle: keep people informed about what the system is doing, in reasonable time, so nothing is a surprise.
  2. User control and freedom. The broken version offers no in-page Back; your only escape is the browser button, which may abandon the whole order. The fixed version adds a real Back control. People choose wrong functions by mistake — give them a clearly marked, low-cost way out.
  3. Error recovery. The broken field says only "Invalid input." The fixed field says exactly what's wrong, in plain language, tied to the field: the number is short, a Visa card has 16 digits, you entered 6. Good error messages name the problem and suggest the fix.
  4. Match to the real world. Phrasing like "a Visa card has 16 digits" speaks the user's language instead of system jargon. Words and concepts should be the ones people already carry in their heads.

The annotation pills under the screen name each heuristic so the mapping from fix to rule stays explicit — that naming is the whole skill.

Build it

The single most common heuristic failure is a vague, disconnected error. Here's the opposite: a specific inline error, programmatically tied to its field so a screen reader announces it when focus lands. The same markup carries a step indicator with aria-current for visibility of status.

A specific error, tied to its field — and a step indicator
<!-- aria-current marks the active step for assistive tech (Visibility of status). -->
<nav aria-label="Checkout progress" class="steps">
  <ol>
    <li>Cart</li>
    <li>Address</li>
    <li aria-current="step"><strong>Payment</strong></li>
    <li>Review</li>
  </ol>
</nav>
 
<div class="field">
  <label for="card">Card number</label>
  <!--
    aria-invalid flags the error state; aria-describedby ties the message to the
    field so it's announced on focus (Error recovery). The message is specific.
  -->
  <input
    id="card"
    type="text"
    inputmode="numeric"
    value="4001 22"
    aria-invalid="true"
    aria-describedby="card-error"
  />
  <p id="card-error" role="alert" class="field__error">
    <span aria-hidden="true">⚠</span>
    Card number looks short — a Visa card has 16 digits. You've entered 6.
  </p>
</div>

Make it yours

Use the controls beside the demo above to change respect the heuristics, show heuristic annotations, and focus on heuristic — each change updates the example live.

Experiment in the playground

Reproduce it with an LLM

Reproduce it with an LLM

You are a usability expert. Evaluate this flow against well-established usability heuristics (visibility of system status, match to the real world, user control and freedom, consistency, error prevention, recognition over recall, flexibility, minimalist design, help users recover from errors, help and documentation): 'a multi-step checkout where the only way back is the browser button, totals appear only on the final step, and errors say only “invalid input”'. For each issue, name the heuristic violated, rate severity 0–4 with a reason, and give a concrete fix. Return a markdown table sorted by severity.

Pitfalls & accessibility

Further reading

  • A canonical set of usability heuristics for interface design, in your own words — keep your team's copy phrased the way you actually talk.
  • A short guide to writing error messages that name the problem and the fix, rather than just flagging that something went wrong.