What breaks
Form error message accessibility: 5 checks
Error text that is small, pale or sitting far from its field reads as no error at all. Mimiq shows what a phone visitor sees, and where the message goes when the keyboard opens.
How do I make form error messages accessible?
Make each error message large enough to read, dark enough to pass a contrast check, placed directly under its field, and tied to that field in the markup so assistive tools announce it. Mark the field as invalid, and link the message to it with an id and aria-describedby. Do not rely on a red border alone, since a visitor who cannot see the color still needs the words. A simulated visitor on a phone shows the step and a screenshot of the message on screen, so you can check that it is readable.
What this looks like in a report
“The error was small gray text under the ZIP code box, and the keyboard covered it. I tapped the box, saw nothing wrong, and assumed the form was broken. I gave up and called a number instead.”
The fix. Set the error text in a color at least as dark as the body text, at least as large as the label, and directly under its field. Mark the input with aria-invalid, link the message to it with aria-describedby, and add an icon with the word Error so the state does not depend on red alone.
An illustration. Run a test to see your own.See a real sample report
Small, faint or detached text reads as no error
A visitor who misses the error does not see a failed form. They see a button that did nothing, and they assume the site is broken. Error text is often set in a light gray or pale red at a small size, which fails the contrast a reader needs in bright light or on a dim screen. Some toasts appear at the top and vanish after a few seconds. On a phone, the keyboard may cover the message under the field, so the visitor never sees it. Nothing in the page's own look tells the owner the text is hard to read.
- Check the error text color against its background in the developer tools color picker, which shows a contrast ratio.
- Compare the error text size with the label beside it. A smaller message is the first thing a visitor skips.
- Open the form on a phone with the keyboard up, and confirm the message under the field is still visible.
- In the Elements panel, check that the input has aria-invalid and an aria-describedby that points at the message.
- Look at the form in grayscale. The error should still show through its words and icon, not only its red border.
Four ways the error text fails to reach a visitor
The message can fail in four separate ways, and each needs its own check. Contrast fails when the text is too close in brightness to its background, so it blurs on a bright phone screen or a dim monitor. Size fails when the message is smaller than the label, so it reads as fine print and gets skipped. Placement fails when the message is far from its field or hidden behind the keyboard or a header. Association fails when the code never tells assistive tools which field the message belongs to. Check each one in order, because a bright, large message can still be out of reach.
Contrast and size, checked on the element itself
Open the developer tools, select the error text, and use the color picker, which reports the ratio between the text and the background it sits on. The usual minimum is a ratio of at least 4.5 to 1 for normal-size text, and 3 to 1 for large text. Size is checked the same way: read the computed font size of the message and of the label beside it. A message that looks clear on your own bright monitor can fall short on a phone outdoors, so test it on the device, not only on the screen you designed on.
Where the message lands with the keyboard open
On a phone the keyboard takes up a large part of the screen, and the browser usually scrolls the focused field above it. A message placed under the field can still sit behind the keyboard, or behind a sticky header, depending on the layout. A toast at the top or bottom is worse, because it times out. A visitor who reads slowly, switches apps or looks away can miss it, and a toast does not wait for them. Keep the message attached to its field and visible while the field is focused, and use a toast only as an extra announcement.
Wrong and right markup for one field
The wrong version is a red span in a toast, with nothing on the input to say it failed. The right version keeps the words beside the field and ties them together. For one ZIP code field, that means a label, then an input marked aria-invalid='true' with aria-describedby='zip-error', then a paragraph with id='zip-error' that says Enter a ZIP code as five digits. Test that version with the keyboard, and then with the keyboard open on a phone, because the message has to survive both.
What you get with Mimiq
- 01
Run it by hand, or on every pull request
Paste a link and a task in the app and watch the visitors work. Or run them on every preview deploy: the GitHub Action comments on the pull request, any other CI can call the MCP endpoint, and your coding agent can run it too.
- 02
Bugs and usability problems in one report
The browser records errors and failed or slow requests on the step they happened. The visitors say where the wording or the steps confused them, and where they left.
- 03
Visitors that behave like your audience
Each visitor is a different profile with a reason to be there, matched to who the page is for, described by you, or built from your own customers.
- 04
A prompt to fix each problem
Every problem comes with a fix to paste into Cursor, Claude Code, Lovable or any coding agent, and one prompt hands over the top problems at once. Then send the same visitors through again.
- 05
Follow every visitor
See each visitor's whole path, step by step with screenshots, and what it was thinking at every step. Ask any visitor a question.
The browser records relevant JavaScript errors and failed or slow app requests encountered during the run, attached to the step where they occurred. The visitors are simulated: they find problems, they do not predict how many real people will convert.
A restyled form or a new toast can bring the faint text back
A restyle, a new brand color or a new toast component can put the error back into small, pale text that a phone cannot read. Rerun the same visitor after each design change, on a phone, and recheck the contrast whenever the palette changes. With paid credits, visitors can reach a form behind a site password, so the same check can run on each preview deploy before release.
Starter
Try it on one launch
About 4 tests of 5 visitors
- Visitors on your landing page, signup and checkout
- Where they left and why, with a fix to copy for each problem
- Run it in the app or on every pull request
- Ask any visitor a question, included
- Test accounts and protected previews
Builder
Test every build
About 20 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Cancel anytime
Pro
Test every release, as a team
About 60 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Cancel anytime
Scale
Test at scale, every day
About 240 tests of 5 visitors
- Everything in Starter
- Credits refill each month, and what is left rolls over once
- Priority support
- Cancel anytime
Questions
What contrast ratio should error text have?
The usual minimum is a ratio of 4.5 to 1 for normal-size text, and 3 to 1 for large text. The color picker in the developer tools shows the ratio for the text against its background. A pale red on white can fall short, even when it looks clear on a bright monitor.
Do error messages need an icon?
An icon or the word Error helps, because a visitor who cannot make out the red border still sees a label. Put the icon next to the message, not only on the field, and keep the message as text so a screen reader can read it aloud.
Can a simulated visitor check accessibility?
It reads the screen, scrolls, taps and types, and shows the step, the message and a screenshot. It does not run a screen reader or read the accessibility tree the way assistive tools do, so check aria-invalid and aria-describedby in the Accessibility panel yourself. It does not predict how many visitors the message would stop.
Why does the message disappear before I read it?
Many toasts and banners set a timer, and a visitor who reads slowly, switches apps or looks away can miss them. Keep the message on the field until the field is corrected. A toast can announce a failed submit, but the field needs the same words to stay.
Does the summary at the top need the same words?
Not word for word, but it should link to each field and use the same wording as the field message. A summary with different words sends the visitor to a field that says something else, which reads as two separate errors.
Keep reading
Send visitors and see what breaks first.
Your first test is free: sign in with Google and it starts right away. Last checked 2026-11-02.