Verbosity Settings for Data Announcements

Permalink to "Verbosity Settings for Data Announcements"

Data apps talk a lot: result counts, sort changes, selection totals, live updates, background job progress. What one screen reader user finds helpful, another finds exhausting. Screen readers have their own verbosity settings, but they cannot tell your app’s messages apart. An app-level verbosity setting — for example “Essential”, “Standard” and “Detailed” — lets users decide which categories of message they hear, without losing anything critical.

This guide belongs to screen reader announcement strategies.

Spec reference

Permalink to "Spec reference"
  • SC 4.1.3 Status Messages (AA) — status messages must be programmatically available; verbosity settings must never suppress messages users need to complete tasks.
  • SC 2.2.4 Interruptions (AAA) — users can postpone or suppress interruptions except emergencies.
  • SC 2.2.2 Pause, Stop, Hide (A) — users can control auto-updating information.
  • SC 1.3.1 (A) — information suppressed from announcements must remain available on screen.
Message categories by verbosity level Layers: errors and results of the user's own actions are always announced; counts and confirmations at standard; progress and background updates at detailed. Message categories by verbosity levelAlwayserrors, blocked actions, results of own actionsStandardresult counts, sort and filter confirmationsDetailedprogress updates, background changes, hintsNever announcedpurely decorative changes
Higher levels add categories; essentials never drop.

When to use — and when not to

Permalink to "When to use — and when not to"

Add verbosity settings when your app announces more than a few message types, especially with live data. Default to “Standard”.

Do not let any level suppress errors or the outcome of the user’s own actions. The misapplication: a “quiet mode” that also silences “Save failed”, leaving users believing their work was saved.

Mute switch versus verbosity levels Comparison: a single mute switch hides errors along with noise; verbosity levels keep essentials while letting users drop optional categories. Mute switch versus verbosity levels✗ Mute all announcementsErrors silencedAll or nothingUsers turn it off entirely✓ Essential, Standard, DetailedErrors always spokenPer-category controlUsers tune it

Annotated code example

Permalink to "Annotated code example"
const LEVELS = { essential: 1, standard: 2, detailed: 3 };
const CATEGORY_LEVEL = { error: 1, outcome: 1, count: 2, confirm: 2, progress: 3, background: 3, hint: 3 };
let userLevel = LEVELS[loadPref('verbosity') ?? 'standard'];

export function announce(message, category, { assertive = false } = {}) {
  if (CATEGORY_LEVEL[category] > userLevel) return;                    // filtered by preference
  (assertive ? alertRegion : statusRegion).textContent = message;
}

// Usage
announce('Sorted by amount, descending', 'confirm');
announce('Export 40% complete', 'progress');
announce('Could not save INV-1042. Try again.', 'error', { assertive: true });
<fieldset>
  <legend>Announcement detail</legend>
  <label><input type="radio" name="verb" value="essential"> Essential — errors and results of your actions</label>
  <label><input type="radio" name="verb" value="standard" checked> Standard — also counts and confirmations</label>
  <label><input type="radio" name="verb" value="detailed"> Detailed — also progress and background updates</label>
</fieldset>

Keyboard & AT behaviour

Permalink to "Keyboard & AT behaviour"
Event Essential Standard Detailed
Save failed Announced (assertive) Announced Announced
Row deleted by user Announced Announced Announced
Filter applied, 84 results — Announced Announced
Export 40% complete — — Announced
Another user edited a row — — Announced
Announcements in a typical 10-minute session Bar chart of announcements in a ten-minute session by level: essential 6, standard 28, detailed 74. Announcements in a typical 10-minute sessionEssentialannouncementsStandardannouncementsDetailedannouncements
Users can choose roughly a tenfold range.

Step-by-step implementation

Permalink to "Step-by-step implementation"
  1. Inventory messages. Search the codebase for every live region update and list the message, trigger and purpose.
  2. Classify them. Assign each a category: error, outcome, count, confirm, progress, background, hint.
  3. Centralise announcing. Replace direct live region writes with a single announce() service that checks the level.
  4. Add the preference. A radio group with descriptions of each level, in settings and perhaps a quick toggle near data views.
  5. Confirm changes. When the level changes, announce a sample: “Announcement detail set to Essential”.

Integration context

Permalink to "Integration context"

Queuing messages is covered in announcement queues for competing messages, and bulk debouncing in debouncing status messages for bulk operations. Numeric updates are in announcing numeric changes with direction and magnitude, and live data controls in pause, stop, hide controls for auto-updating data.

Gotchas

Permalink to "Gotchas"

Visible equivalents. Messages suppressed at low verbosity must still be visible somewhere (a status bar, a count), so users can check them on demand.

Testing at every level. Automated tests should assert that errors are announced at Essential.

Screen reader verbosity is separate. Users may also lower NVDA or JAWS verbosity; your setting controls content, theirs controls how it is spoken.

Edge cases

Permalink to "Edge cases"
  • Multiple tabs. Apply the preference across tabs via storage events.
  • New message types. Require a category for every new announce call; reject uncategorised messages in code review or lint.
  • Shared workstations. Store preferences per user account, not per browser.

Worked example

Permalink to "Worked example"

A logistics app announced every shipment status update to dispatchers. Some screen reader users loved it; others switched off their screen readers’ speech for the app entirely. The team classified twenty message types, centralised announcements and added three verbosity levels with descriptions. Dispatchers who wanted silence chose Essential and still heard failed bookings; others chose Detailed. Complaints about noise stopped without anyone losing critical messages.

Common mistakes

Permalink to "Common mistakes"
  • A mute switch that silences errors.
  • Direct live region writes bypassing the setting.
  • No visible equivalents for suppressed messages.
  • No description of what each level includes.

Testing checklist

Permalink to "Testing checklist"

Testing it with a screen reader

Permalink to "Testing it with a screen reader"

With NVDA, set the level to Essential and perform a filter, a sort, an export and a failed save. Only the failed save and direct outcomes should speak. Switch to Detailed and repeat; you should hear counts, confirmations and progress. Check that the switch itself is announced. Use NVDA’s speech viewer to count messages per level and compare with your inventory.

Explaining the setting to users

Permalink to "Explaining the setting to users"

Describe each level by what users will hear, not by abstract names. “Essential — errors and the results of your own actions” tells users exactly what they keep. Place the setting where users meet the noise: a small “Announcement detail” link near busy data views, as well as in global settings. Mention it in onboarding for screen reader users, and in any help page about keyboard and screen reader use. A setting nobody can find does not reduce noise.

Choosing categories

Permalink to "Choosing categories"

Categories should describe why a message exists, not where it comes from. “Outcome” covers the result of anything the user just did, whichever component did it; “background” covers anything that happened without the user’s action. That split matters more than any other, because users almost always want to hear about their own actions and are much more selective about everything else. Keep the list short — six to eight categories — so that new messages are easy to classify consistently, and write one example message for each category in your contributor guidelines.

Key points

Permalink to "Key points"
  • Route every message through one service that knows its category.
  • Errors and outcomes of the user’s own actions are never filtered.
  • Describe each level by what users will hear, and confirm changes.

Design system notes

Permalink to "Design system notes"

Provide the announce service with categories in the design system, and include the verbosity preference in the standard settings page template.

FAQ

Permalink to "FAQ"
Does this replace screen reader verbosity?

No. It complements it by filtering what the app sends.

What should the default be?

Standard, with counts and confirmations.

Can users choose categories individually?

Advanced settings can expose per-category toggles; levels are simpler for most.

Are errors ever suppressible?

No. Errors and outcomes of user actions are always announced.

Does this help non-screen-reader users?

Visible toast frequency can follow the same setting.

Where should the setting live?

In user preferences, with a shortcut near busy data views.

Permalink to "Related"

← Back to Screen Reader Announcement Strategies for Data Interfaces