Home / Knowledge Base / Why Status Messages Must Be Programmatically Exposed

Why Status Messages Must Be Programmatically Exposed

Status messages communicate important updates to users without moving focus.
If these messages are only visible on screen and not exposed programmatically, screen reader users may never know the update occurred. This rule ensures that when status messages appear, they are marked up so assistive technologies can automatically announce them.

WCAG Success Criterion

4.1.3 — Status Messages (Level AA)

In content implemented using markup languages, status messages can be programmatically determined through role or properties, such that they can be presented to the user by assistive technologies without receiving focus.

Common doubts

What Does “Programmatically Determinable” Mean?

Programmatically determinable means: The browser exposes the message in a way that software (like screen readers) can detect and announce it automatically, without the user navigating to it.

Visually seeing text on a screen is not enough.
Assistive technologies rely on information exposed by the browser, not pixels.

What Is the Accessibility Tree?

Browsers do not give screen readers the raw DOM.

Instead, they build an accessibility tree, a structured representation of:

  • Roles (what something is)
  • Names (what it’s called)
  • States and properties (expanded, busy, invalid, etc.)

Only content that appears in this tree can be announced automatically.

Why Plain DOM Updates Are Silent

If you change text like this:

message.textContent = "Saved successfully";

Nothing is announced unless:

  • The element is marked as a live region, or
  • The change moves focus

Without that, the update exists visually but is invisible to assistive technologies.

What Is a Status Message?

A status message is brief text that informs the user about:

  • The result of an action
  • The progress or waiting state of a process
  • The presence of errors
  • A confirmation or system update

Examples:

  • “Item added to cart”
  • “Saving…”
  • “Upload complete”
  • “Invalid postal code”
  • “5 results returned”

What Makes a Status Message Special?

A status message:

  • Appears without taking focus
  • Does not change the user’s context
  • Is visible to sighted users
  • Must be announced automatically to screen reader users

If focus moves (for example, a modal dialog opens), it is not a status message under this criterion.

How Screen Readers Detect Status Messages

Status messages are announced through live regions.

A live region is an area of the page that tells screen readers:

“If the text here changes, announce it.”

Live regions are created using:

  • role="status"
  • role="alert"
  • or aria-live

role="status" vs role="alert"

  • role="status"
    • Polite announcement
    • Does not interrupt current speech
    • Used for confirmations, updates, and background information
    • Implies aria-live="polite"
  • role="alert"
    • Assertive announcement
    • Interrupts current speech
    • Used for errors or urgent information
    • Implies aria-live="assertive"

Choosing the wrong one can either silence important errors or make the interface overly disruptive.

What This Rule Checks

This rule verifies that:

  • Status messages are exposed via live regions
  • Appropriate roles or ARIA properties are used
  • Announcements occur without focus movement
  • Updates are available to assistive technologies when content changes

The rule does not require creating status messages, only exposing them correctly when they exist.

Correct Markup Examples

Confirmation message (polite)

<div role="status">
  Item added to cart
</div>

✔ Announced after the current speech
✔ Focus remains unchanged

Search result count

<div role="status">
  5 results returned
</div>

✔ Screen reader announces update automatically

Error message requiring attention

<div role="alert">
  Invalid postal code
</div>

✔ Announced immediately
✔ Does not require focus change

Background process feedback

<div role="status" aria-atomic="true">
  Uploading… 40% complete
</div>

✔ Entire message announced when updated
✔ Prevents partial announcements like “forty”

Progress Indicators

<div role="progressbar"
     aria-valuemin="0"
     aria-valuemax="100"
     aria-valuenow="40">
</div>

A progress bar does not automatically announce updates.

  • Screen readers announce progress when focused
  • Background changes may be silent

For non-focused progress updates, pair with a status message:

<div role="status">
  Upload 40% complete
</div>

Indeterminate progress must also include text like “Uploading…” or “Processing…”.

Incorrect Markup Examples (Failing)

Visual-only message

<div>
  Saved successfully
</div>

✖ Visible
✖ Not announced

DOM update without live region

<p id="message"></p>
<script>
  message.textContent = "Form submitted";
</script>

✖ Change is silent to screen readers

Focus-moving dialog used unnecessarily

<div role="dialog">
  Saved successfully
</div>

✖ Changes context
✖ Not a status message under SC 4.1.3

What Is Not a Status Message

Changes that move focus

  • Modal dialogs
  • Alert dialogs
  • Page navigation

Focus change already notifies assistive technologies.

UI state changes

  • Expanding menus
  • Accordions
  • Tabs
  • Tree items

These are covered under 4.1.2 Name, Role, Value, not status messages.

New content that is not feedback

  • Additional survey questions
  • Conditional form sections

These do not meet the definition of status messages.

Special Considerations

Updating Existing Status Text

When updating messages like:

“0 items” → “3 items”

Ensure the entire phrase is treated as the update.

<div role="status" aria-atomic="true">
  3 items in cart
</div>

Removing Status Text

If removal conveys meaning (e.g., “busy” disappears), provide a replacement:

<div role="status">
  System available
</div>

Avoid Overuse

Excessive live regions can:

  • Interrupt users constantly
  • Cause screen readers to queue announcements
  • Make applications frustrating or unusable

Status messages should be meaningful, brief, and intentional.

Why This Matters

Sighted users notice messages added to the screen without effort. Screen reader users do not know unless the message is exposed programmatically.

Without proper markup:

  • A form may fail silently
  • A cart update may go unnoticed
  • A process may appear stuck

Users lose confidence and control.

How This Is Tested

  • Automated tools can detect missing live region roles
  • They cannot determine whether a message should be a status message
  • Manual testing with a screen reader is required

Verify that:

  • Focus does not move
  • The message is announced
  • Polite vs assertive behaviour matches importance

How to Fix the Problem

  • Identify messages that appear without focus movement
  • Mark them as live regions using appropriate roles
  • Choose status vs alert intentionally
  • Ensure updates occur after the region exists in the DOM
  • Avoid unnecessary announcements

Wrapping Up

Status messages provide essential feedback without interrupting the user. When they are not programmatically exposed, screen reader users are left unaware of changes that sighted users can see instantly. If a message communicates status and does not take focus, it must be programmatically determinable.

Want to test against all WCAG success criteria?

Stay compliant. Avoid fines. WebYes reviews your entire website so you don't have to worry.

Sign Up for Free Now