Since 28 June 2025, most online shops selling to consumers in Germany fall under the Barrierefreiheitsstärkungsgesetz (BFSG), Germany's implementation of the European Accessibility Act. In practice that means WCAG 2.1 Level AA (via the harmonised standard EN 301 549), plus a published accessibility statement.
Four months later we wanted to know how shops were actually doing. So in October 2026 we looked at 144 German company websites that sell to consumers or take bookings online, and ran the home pages through axe-core.
Short version: the law is in force, most shops are not there yet, and the most common problems are boring and quick to fix.
The numbers
| Result | |
|---|---|
| Websites checked for an accessibility statement | 144 |
| No accessibility statement found | 78 (54%) |
| Home pages we could scan | 119 |
| At least one critical or serious axe-core violation | 103 (87%) |
| At least one critical violation | 60 (50%) |
| Median number of violations per home page | 23 |
| Sites with an accessibility overlay widget | 9 (6%) |
"Critical" and "serious" are axe-core's own impact levels, not a legal judgement.
What breaks most often
Share of the 119 home pages where the rule fired at least once (WCAG-mapped rules only, best-practice rules left out):
| axe rule | What it means | Home pages |
|---|---|---|
color-contrast |
Text contrast below 4.5:1 (3:1 for large text) | 66% |
link-name |
Links with no discernible name | 50% |
image-alt |
Images without alternative text | 31% |
button-name |
Buttons with no accessible name | 21% |
meta-viewport |
Zooming disabled on mobile | 10% |
None of this is exotic. It matches what the WebAIM Million finds every year: contrast, link text and alt text are the classics.
1. Contrast (66%)
The usual suspects in shops: grey placeholder text, light-grey "was" prices, white text on a pastel sale badge.
/* Fails: #9aa0a6 on #ffffff is about 2.6:1 */
.price-old { color: #9aa0a6; }
/* Passes AA: #5f6368 on #ffffff is about 6.0:1 */
.price-old { color: #5f6368; }
Fix it at the source: theme colour tokens, not one element at a time.
2. Links without a name (50%)
Almost always an icon link in the header (cart, account, wishlist) or a linked logo image with an empty alt.
<!-- Fails: a screen reader announces "link" -->
<a href="/cart"><svg aria-hidden="true">…</svg></a>
<!-- Passes -->
<a href="/cart"><svg aria-hidden="true">…</svg><span class="visually-hidden">Cart</span></a>
3. Images without alt text (31%)
Product images imported in bulk are the main source. Decorative images get alt=""; product images get a short description of what is actually shown (colour, variant), not the file name.
4. Buttons without a name (21%)
Hamburger menus, search toggles, quantity steppers, carousel arrows:
<!-- Fails -->
<button class="menu-toggle"><svg aria-hidden="true">…</svg></button>
<!-- Passes -->
<button class="menu-toggle" aria-label="Open menu" aria-expanded="false">
<svg aria-hidden="true">…</svg>
</button>
Those four rules alone account for most of the failures we saw, and none of them needs a redesign.
Shopify vs. Shopware
21 of 27 Shopify shops (78%) had no findable accessibility statement, against 10 of 26 Shopware shops (38%). The groups are small, so treat it as a hint, not proof. One untested guess: Shopware shops are more often run by agencies that already have the BFSG on their radar.
Overlays do not change the code
9 sites embedded an overlay widget (the floating button that changes font size or contrast). The violations above were found with the widget active, because a widget does not change the underlying markup. 3 of those 9 sites also had no accessibility statement, so the widget did not even cover the paperwork. In January 2025 the US FTC fined one overlay vendor $1 million for claiming its AI could make any site WCAG-compliant.
Run the same check yourself
All of this is axe-core, which is open source. The quickest way to try it on a page:
npx @axe-core/cli https://your-shop.example --tags wcag2a,wcag2aa,wcag21a,wcag21aa,wcag22aa
Or inside an existing Playwright test suite:
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('home page has no WCAG A/AA violations', async ({ page }) => {
await page.goto('https://your-shop.example/');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
.analyze();
expect(results.violations).toEqual([]);
});
Putting that in CI catches regressions before a theme update or a new app ships them.
What these numbers do not say
Honest limits, because accessibility tooling is full of overclaiming:
- Automated tests only catch part of the problem. Depending on the study, roughly 30–57% of WCAG issues are detectable automatically. Whether alt text is meaningful, whether focus order makes sense, whether error messages are understandable: that needs a person with a keyboard and a screen reader. So the real number of issues is higher, and a page with zero axe findings is not automatically accessible.
- Home pages only, rendered in a real browser, scanned with axe-core 4.12.1 against WCAG 2.1/2.2 AA. Checkout flows, which matter most, were not scanned.
- Not a representative sample: German companies with roughly 10–249 employees selling to consumers (travel and tickets, home and garden, fashion, electronics and hobby, food and cosmetics), found through public directories and trade press. Micro-enterprises and large corporations were excluded.
- Accessibility statements were searched via links on the home page and imprint and the usual URLs; one in an unusual place may have been missed (2 unclear cases were not counted as missing). We did not judge whether existing statements are complete.
The full study
The full write-up (in German), with methodology and charts: BFSG-Studie 2026: 144 Online-Shops automatisch geprüft. The numbers are CC BY 4.0, so feel free to reuse them with a link.
Disclosure: I build Klar Barrierefrei, an automated WCAG/BFSG checker for German shops that runs the same axe-core scan and is upfront about the 30–57% limit. The open-source commands above get you most of the way for a single page.
Top comments (0)