Read this first. These are automated findings. Automated checks catch roughly a third of accessibility problems — ours included. A site with zero automated findings can still be unusable with a screen reader, and a site with many findings is not necessarily worse to use. Nothing below says any of these shops broke the law, and nothing below says any of them is accessible.
The numbers
- 34/36shops with at least one violation
- 180pages scanned
- 3253elements flagged in total
- 4median issue types per shop
With 40 shops, a row-per-shop table stops being readable — you look at it and take nothing away. So the results are grouped. The counts below are the same 36 shops in both tables; four shops that returned only a bot-protection page are in neither, and are described further down.
| Issue types found | Shops | Share |
|---|---|---|
| None | 2 | 6% |
| 1 to 3 | 10 | 28% |
| 4 to 6 | 18 | 50% |
| 7 or more | 6 | 17% |
Half the shops sit in one band: four to six distinct problem types. That is the shape worth noticing. These are not sites that are catastrophically broken, and they are not sites that are clean — they are ordinary sites with a handful of ordinary problems, which is exactly the kind of thing that never gets noticed and never gets scheduled.
| Elements flagged | Shops | Share |
|---|---|---|
| None | 2 | 6% |
| 1 to 25 | 8 | 22% |
| 26 to 100 | 13 | 36% |
| 101 to 250 | 12 | 33% |
| 251 or more | 1 | 3% |
Issue types and elements measure different things and they do not move together. One shop returned nine distinct types across 93 elements; another returned seven types across 251. The second number is usually one bad component rendered hundreds of times, so it says more about templating than about how hard the site is to use. Neither number alone tells you that.
What broke, and how widely
The interesting result is not how much each shop had wrong. It is how much the shops had wrong in common. Six rules account for most of what we saw.
| Rule | What it means | Shops |
|---|---|---|
color-contrast | Text too close in colour to what is behind it | 30 |
link-name | A link with no readable text — often an icon | 25 |
button-name | A button with no readable name | 16 |
image-alt | An image with no alternative text | 12 |
list | List markup containing things that are not list items | 8 |
aria-required-children | An ARIA role missing the structure it requires | 7 |
Contrast was flagged on 30 of the 36 shops and missing link names on 25. Neither is exotic, and neither needs a specialist to understand. That is the part we did not expect: the common failures are not deep architectural problems, they are small things that nobody is watching.
A caution on color-contrast specifically: automated contrast checks
produce false positives on text over images and on some hover states. We are
reporting what the rule fired on, not asserting that all 30 shops have a real
contrast problem on every flagged element.
Two shops came back with nothing
Two of the 36 returned zero findings across all five pages. We did not assume that — we checked it, because a scanner that finds something everywhere is worthless. One of the two is the same shop that came back empty in our July run, six weeks earlier, on a different set of pages.
We publish that result because it is the uncomfortable one. If our tool could not come back empty, its findings would mean nothing.
This cuts both ways, and it should: zero automated findings is not proof that either shop is accessible. It means the checks a machine can run found nothing.
We scanned ten of them twice, six weeks apart
Ten of these shops are the same ten we scanned on 23 July 2026. We ran them again on 3 September, 42 days later, with the same tool and the same five-pages-per-site method.
Nine of the ten returned the same number of distinct issue types. Three returned numbers that were identical on both counts — same issue types, same element totals, six weeks apart. One shop moved, from ten types down to nine.
Nothing here says those shops ignored anything; nobody told them, and we never contacted them. What it says is narrower and, for our purposes, more useful: problems of this kind do not resolve themselves. They sit there.
What we cannot claim from this. The element counts moved in both directions on the other seven shops, sometimes a lot — one went from 62 to 18. We are not reporting those as improvements, because we cannot tell them apart from measurement drift: these shops have no scan history with us, so the crawler picked its own five pages each time and may not have picked the same five. We have started recording the exact page addresses so the next comparison can be exact. Until then, the type counts are the only part of this comparison we trust.
How we ran it
- The 40 shops were picked by hand. This is not a random sample and nothing here should be read as one. We chose EU-based consumer brands that sell direct to the public — 14 French, 8 German, 8 Swedish, 3 Dutch, 2 Belgian, 1 Danish — and deliberately excluded marketplaces, and shops based outside the EU. A UK and an Australian brand were checked and dropped for that reason.
- We did not measure company size. An earlier version of this study described its subjects as small shops. We have stopped saying that, because employee counts are not reliably public and we never verified them.
- We did not filter by whether sites let our scanner in. Three of the 40 refuse ordinary automated requests. We kept them in the list on purpose: screening them out first would have quietly removed the sites most likely to be large and well-resourced, and made the result look better than it is.
- Each domain was checked to be live before scanning rather than trusted from a list. One candidate returned 404 and was dropped before any scanning began.
- Each site was crawled from its homepage the way a visitor arrives, following internal links only, five pages per site.
- Every page was tested with axe-core, the same free open-source engine that sits underneath most accessibility tools, against WCAG 2.1 AA rules.
- No shop was contacted, before or after. Nothing was submitted to any form. We only requested public pages, with a pause between sites.
We are not claiming to find more than anyone else. axe-core is free and anyone can run it. The reason this study exists is that almost nobody runs it twice.
The number we calculated first was wrong
Our first summary of this run said 36 of 40, or 90%. Every figure in it was accurate and the sentence was still false.
Four of the 40 shops returned only one page — their homepage — with no internal
links our crawler could follow. Those were not shops. They were bot-protection
interstitials: on one of them the single finding our scanner reported was a
meta-refresh, which is the signature of a redirect page rather than a
storefront. Two of the four returned zero findings, and our summary counted them as
clean shops.
So the study was reporting less of a problem than it found, by treating pages we had never really reached as evidence of sites in good shape. We changed the calculation: the headline ratio now uses only sites where all five pages were scanned, which is 36, and the four incomplete ones are reported separately instead of being folded in. That is why this page says 34 of 36 rather than the friendlier-looking 36 of 40.
This is the second time the same shape of error has caught us. In July, our crawler stopped after one page on every site that redirects its bare domain, and reported zero problems for a shop that had 94 flagged elements. A scanner that fails silently is worse than one that crashes: it tells you your site is fine. Both times, what exposed it was the result looking implausible — not a passing test.
What this does not show
- It is not a legal finding. None of these shops has been assessed against the European Accessibility Act, and we are not qualified to do that. Automated findings are not a compliance verdict, and we will never present them as one.
- Forty hand-picked shops is not a sample of European retail. We chose them; nobody drew them from a register. Two thirds are French, German or Swedish. Treat this as a sighting with its method written down, not a statistic.
- Five pages is a thin slice. A checkout flow, a filter, or anything behind a login was never seen. Those are usually where the worst problems live.
- Four shops could not be scanned past the front page. Their bot protection served us an interstitial instead of the shop. They are excluded from every ratio on this page, and that is a real limit of this tool, not a footnote — some sites we simply cannot check.
- Six shops did not settle while we measured. Their pages were still changing when the scan ran, so their individual numbers could move between runs. They are included; we mention it because a number that moves is not a number you should lean on.
Why we do not name the shops
They did not ask to be scanned. Publishing a list of named shops with their problem counts would be pointing at someone else's house, and it would be the last thing we did before nobody trusted us with theirs. The aggregate is the finding; the names add nothing to it.
This applies to the two clean shops too. Naming them would be an endorsement we were not asked for, and it would quietly imply the others are bad.
If you want to know what your own site looks like
You can run axe-core yourself for free — a browser extension will give you a single page in about a minute, and we would rather you did that than nothing. What we do is narrower: we run it on the same pages every Monday and tell you what changed since last week.
See how the weekly report works · Read a real report we produced