Toast Messages Screen Readers Never Hear: Fixing Status Messages (4.1.3)
A shopper submits a form and a green toast says your request was sent. A screen reader user submits the same form and hears nothing. The page did not move, focus did not change, and no announcement arrived. As far as they can tell, the button did nothing, so they press it again.
The rule, in one sentence
Success Criterion 4.1.3, Status Messages, is Level AA: status messages must be programmatically determinable so assistive technology can present them without the message receiving focus. The mechanism is a live region, and there are two flavors. role="status" announces politely, waiting for the screen reader to finish. role="alert" interrupts. A success toast is polite. A payment error is assertive. Getting that assignment backwards is a smaller failure than having no region at all, but it is still a failure, because an error that waits its turn is an error the user acts on too late.
The region has to exist before the message does. A live region announces changes to content inside it, and if the region and the message are created in the same instant, most screen readers never register the region. Create one empty region per page area at load, then write text into it when events fire. This is the single most common cause of silent toasts, and it is a thirty-minute fix.
The four toast defects that ship together
First, the silent toast: no live region at all, so the message exists only visually. Second, the late region: created with the message, so the announcement never fires. Third, the focus thief: the toast moves focus to itself, yanking the user out of the form they were completing, which is worse than silence because it disorients as well as interrupts. Fourth, the vanishing message: a toast that auto-dismisses after three or four seconds, which a slow reader or a user who tabbed away never sees, and which collides with 2.2.1 on timing.
The cost of these four defects is not abstract. A user who hears nothing after pressing submit presses it again, and the double-submit becomes a duplicate order, a duplicate charge, and a support call. The toast was supposed to prevent that call, and the silent toast causes it. The same logic applies to the vanishing message: a shopper who misses a confirmation about a delivery date or a payment retry has to call to ask, and the call costs more than the fix. Status messages are customer service infrastructure, not decoration, and the test for them is whether the user knows what happened without seeing the screen.
Test for all four at once with a screen reader and a keyboard. Submit a form, listen for the confirmation, then submit it with an error and listen for the interruption. If the confirmation waits and the error interrupts, the regions are right. If focus jumps to the toast, the component is stealing focus. If the message disappears before you finish reading it, the timer is too short. The form-label side of this problem is Form Labels: Placeholder Text Is Not a Label.
What to do instead, concretely
Keep one polite region and one assertive region on the page, both empty at load. Write success, progress, and confirmation messages into the polite one. Write errors and time-sensitive warnings into the assertive one. Give every toast a close button and a generous display window, and never move focus to it. If several messages can fire at once, queue them or clear the region between writes, because three messages in two seconds become one garbled announcement.
The reason to fix this before the next audit is not the criterion number. It is the double-submit. A user who hears nothing after pressing submit presses it again, and again, and then calls support about the duplicate charge. The toast was supposed to prevent that call. A silent toast causes it. For the link-text half of the same checkout flow, see Link Text Should Say Where It Goes: WCAG 2.4.4.
Frequently asked questions
What is the difference between role=status and role=alert?
role="status" announces politely, waiting for the screen reader to finish. role="alert" interrupts immediately. Use status for confirmations and alert only for errors or time-sensitive warnings.
Why is my toast visible but never announced?
The live region was likely created at the same moment as the message. Screen readers only announce changes inside a region that already exists, so the region must be in the page, empty, before the event fires.
Should a toast move keyboard focus to itself?
No. A status message must be announced without receiving focus. Moving focus yanks the user out of their task, and it is worse than a silent toast because it disorients as well as interrupts.
How long should a toast stay on screen?
Long enough to be read and announced, with a close button. A toast that vanishes after three or four seconds can disappear before a slow reader finishes it, and short timers collide with WCAG 2.2.1 on timing.