Shopware is a German open-source commerce platform that is widely used across Europe, which puts it squarely in the path of the European Accessibility Act - and that matters, because the merchants most likely to be audited under the EAA are exactly the mid-market European brands Shopware targets. Shopware 6's storefront is built on the Bootstrap front end and a Twig templating layer, so it starts from a reasonably semantic, responsive base with real buttons and form controls. The accessibility risk lives in the layers merchants build on top. The biggest is Shopping Experiences, Shopware's drag-and-drop CMS for product, category, and landing pages: it lets a merchant assemble pages from blocks and elements with full control over heading text, image alt, and order, which means it equally lets them ship pages with no real headings, images with empty alt, and a focus order that does not match the visual layout. The product detail page adds a configurator (variant property selectors), an image slider/gallery, and an off-canvas cart that slides in when an item is added - each a common failure point for labelling, focus management, and status announcements. Shopware's off-canvas navigation and cart are overlays that must trap focus and respond to Escape but often do not in customised themes. The newsletter and registration forms inherit the theme's field markup, which is decent by default but easily broken by custom blocks. And Flow Builder, which fires confirmations and notifications, controls on-page messaging that needs to reach assistive technology through live regions rather than silent toasts. Shopware ships no built-in accessibility checker, so every fix below is verified with axe, WAVE, or Lighthouse plus a manual keyboard and screen reader pass on the storefront. This checklist follows a shopper from a Shopping Experiences landing page through the configurator to a confirmed order.

Common Accessibility Issues

serious

Shopping Experiences Blocks With No Real Heading Structure

WCAG 1.3.1

In the Shopping Experiences editor, text and 'image + text' blocks let merchants style large headline text without marking it as a heading, and category/landing pages are often assembled with no H1 or with heading levels chosen for size rather than hierarchy. Screen reader users who navigate by headings find no outline, or one that jumps levels, and cannot scan the page.

How to fix:

In each text element, use the rich-text editor's paragraph/heading format to mark the page's main title as H1 and section titles as H2/H3 in logical order, rather than only enlarging the font. Keep exactly one H1 per page, do not skip levels, and verify the rendered outline with a headings tool on the published page.

Before
<div class="cms-element-text">
  <p style="font-size:2.5rem;font-weight:700">Summer Collection</p>
</div>
After
<div class="cms-element-text">
  <h1 style="font-size:2.5rem;font-weight:700">Summer Collection</h1>
</div>
critical

Product Configurator Variant Options Without Group Labels

WCAG 1.3.1

The Shopware product configurator renders variant properties (size, colour, material) as selectable swatches or buttons. When these are styled <div>/<span> or buttons whose only label is a colour swatch, screen reader users cannot tell what property they are setting or read the selected value - 'button' with no name, repeated across a row.

How to fix:

Group each property with a programmatic label: use a <fieldset>/<legend> or an element with role="radiogroup" and aria-label carrying the property name, and give each option an accessible name (the colour or size text, not just a swatch). Mark the chosen option with aria-checked/aria-pressed, and ensure options are reachable and operable by keyboard.

Before
<div class="product-detail-configurator-options">
  <span class="swatch" style="background:#c00"></span>
  <span class="swatch" style="background:#00c"></span>
</div>
After
<div role="radiogroup" aria-label="Colour">
  <button role="radio" aria-checked="true" aria-label="Red">
    <span class="swatch" style="background:#c00"></span></button>
  <button role="radio" aria-checked="false" aria-label="Blue">
    <span class="swatch" style="background:#00c"></span></button>
</div>
critical

Off-Canvas Cart and Menu Do Not Trap or Return Focus

WCAG 2.1.2

Adding a product slides in Shopware's off-canvas cart, and the mobile menu opens the same off-canvas pattern. In customised themes these overlays frequently open without moving focus into themselves, leave focus on the page behind them, cannot be closed with Escape, and do not return focus to the trigger on close - trapping keyboard and screen reader users behind the panel.

How to fix:

Treat the off-canvas cart and menu as modal dialogs: on open, move focus to the panel (or its close button); trap Tab order within it while open; support Escape to close; and return focus to the element that opened it. Mark the panel with role="dialog" and aria-modal="true" and give it an accessible name.

Before
<div class="offcanvas">
  <!-- slides in; focus stays on the page behind -->
  <div class="cart-items">...</div>
</div>
After
<div class="offcanvas" role="dialog" aria-modal="true"
     aria-label="Shopping cart">
  <button class="offcanvas-close" aria-label="Close cart">x</button>
  <div class="cart-items">...</div>
</div>
<!-- JS: focus the panel on open, Escape closes, focus returns -->
serious

Add-to-Cart and Flow Builder Notifications Not Announced

WCAG 4.1.3

Shopware shows toast-style notifications for actions like adding to cart, applying a voucher, or newsletter sign-up, and Flow Builder can trigger on-page messages. When these are rendered as visually-styled toasts without an ARIA live region, screen reader users get no confirmation that the action succeeded or failed.

How to fix:

Render status and error notifications into an ARIA live region. Provide a container with role="status" / aria-live="polite" (use role="alert" / aria-live="assertive" for errors) that is present on load, and write the message text into it when the action completes. Keep messages specific and text-based, not colour-only.

Before
<div class="alert alert-success show">
  Product has been added to the shopping cart.
</div>
After
<div class="flashbags" role="status" aria-live="polite"></div>
<script>
  document.querySelector('.flashbags').textContent =
    'Product has been added to the shopping cart.';
</script>
serious

Image Slider/Gallery Without Accessible Controls or Alt Text

WCAG 1.1.1

The product gallery slider (and Shopping Experiences image-slider element) often ships next/previous controls that are icon-only buttons with no accessible name, autoplay that cannot be paused, and slide images with empty or duplicated alt text. Screen reader users hear 'button' with no function and miss the product views entirely.

How to fix:

Give every slider control a text accessible name ('Previous image', 'Next image'), provide a visible pause control if the slider autoplays (and prefer not to autoplay), and give each slide image meaningful, distinct alt text describing that view. Ensure the controls and slides are keyboard operable and have visible focus.

Before
<button class="gallery-prev"><i class="icon-arrow-left"></i></button>
<img src="v2.jpg" alt="">
After
<button class="gallery-prev" aria-label="Previous image">
  <i class="icon-arrow-left" aria-hidden="true"></i>
</button>
<img src="v2.jpg" alt="Leather bag, interior pocket detail">
serious

Brand and Theme Colours Failing Contrast on Buttons and Sale Prices

WCAG 1.4.3

Shopware's theme manager makes it easy to set a brand primary colour for buttons, links, and badges, and merchants frequently choose a light or low-contrast brand colour that fails the 4.5:1 ratio for button text and sale/special prices. Low-vision shoppers then struggle to read the 'Add to cart' and 'Checkout' actions.

How to fix:

Check the theme's primary/secondary/buy-button colours and the sale-price and badge colours against WCAG: text needs at least 4.5:1 (3:1 for large text). Adjust the theme variables until the pairs pass, and never use colour as the only signal of a sale - keep a text label too.

Before
$sw-color-buy-button: #7fb3ff; /* white text fails */
.product-price--special { color:#ff7a7a; } /* fails on white */
After
$sw-color-buy-button: #1f5fc2; /* white text passes */
.product-price--special { color:#c0392b; } /* passes on white */
serious

Newsletter and Registration Fields Without Persistent Labels

WCAG 3.3.2

Custom Shopping Experiences form blocks and some theme overrides render newsletter and registration inputs with placeholder-only prompts or labels that are visually hidden in a way that also removes them from the accessibility tree. The result is fields a screen reader announces as 'edit text' with no name, and prompts that vanish on input.

How to fix:

Give every form field a persistent, programmatically associated <label> (visually-hidden is fine only if it remains in the accessibility tree via the correct sr-only technique), add autocomplete attributes, and surface required state and validation errors as text tied to the field with aria-describedby. Test each form field with a screen reader on focus.

Before
<input type="email" name="email" placeholder="Your email address">
After
<label for="newsletter-email">Email address</label>
<input type="email" id="newsletter-email" name="email"
       autocomplete="email" required>
moderate

Custom Storefront Plugins Introducing Non-Semantic Widgets

WCAG 4.1.2

Shopware's plugin ecosystem (Shopware Store) lets developers add storefront widgets - cookie banners, product comparison, wishlists, quick buy - and these are not held to an accessibility standard. Plugins built from non-semantic <div>/<span> elements add controls with no role, name, or keyboard support, regressing an otherwise compliant storefront.

How to fix:

Audit each storefront plugin: run axe/WAVE and a keyboard-only pass on the pages it affects, and prefer plugins that use native HTML controls. For custom or bespoke widgets, ensure every control is a real button/link or has a correct role and accessible name, is keyboard operable, and shows a visible focus indicator before shipping.

Before
<div class="wishlist-toggle" data-id="42"
     onclick="toggleWishlist(42)"></div>
After
<button type="button" class="wishlist-toggle" data-id="42"
        onclick="toggleWishlist(42)"
        aria-pressed="false" aria-label="Add Leather Bag to wishlist">
</button>

Shopware-Specific Tips

  • Build Shopping Experiences pages with the same heading discipline you would hand-code: one H1, logical H2/H3 order, and meaningful alt on every image element. The editor gives you full control, so the accessibility of every CMS page is your responsibility, not the theme's.
  • Audit the off-canvas cart and off-canvas menu specifically with the keyboard: open each, confirm focus moves into the panel, Tab stays trapped inside, Escape closes it, and focus returns to the trigger. These two overlays are the most common Shopware keyboard traps.
  • Override the configurator template so each variant property is a labelled radiogroup with named options and aria-checked state - swatch-only buttons are the single biggest screen reader blocker on Shopware product pages.
  • Route flash messages and Flow Builder on-page notifications through an aria-live region so add-to-cart, voucher, and newsletter confirmations are announced. Shopware's default toasts are visual-only.
  • Because Shopware is heavily used by EU merchants, treat WCAG 2.1 AA as a hard requirement under the EAA and EN 301 549, and re-test the storefront after every plugin install or theme update - the plugin store has no accessibility review.

axe DevTools (browser extension)

A free browser extension that scans rendered Shopware storefront pages for WCAG issues like missing labels, contrast failures, and ARIA errors. Run it on Shopping Experiences pages, product detail, cart, and checkout after any theme or plugin change.

WAVE Web Accessibility Evaluation Tool

A free WebAIM tool that visually flags missing form labels, empty buttons, heading-structure issues, and contrast problems - helpful for catching swatch-only configurator buttons and placeholder-only newsletter fields in the Bootstrap storefront.

NVDA screen reader

A free, open-source Windows screen reader for confirming the things scanners miss: that the off-canvas cart traps and returns focus, the configurator announces property and value, and add-to-cart notifications are read aloud.

Where Shopware Accessibility Issues Concentrate

Plugin / Tool AreaStorefront RiskWhat To Check
Shopping Experiences CMS layouts Text/image blocksMedium - merchant controls headings, alt, orderOne H1, logical heading order, meaningful alt, focus order matches layout
Configurator variant options Colour/size swatchesHigh - swatch-only buttons, no group labelRadiogroup + aria-label, named options, aria-checked state
Off-canvas cart and menu Sliding panelsHigh - no focus trap, no Escape, no focus returnModal dialog pattern: trap, Escape, return focus
Notifications toasts / Flow Builder Add-to-cart, voucher, newsletterMedium - visual-only toastsaria-live / role=status (alert for errors) updated on action
Theme colours buttons, sale prices Brand primary colourMedium - low-contrast buy button and special price4.5:1 text contrast, never colour-only for sale state

Frequently Asked Questions

Is Shopware 6 accessible out of the box?

The default Shopware 6 storefront is built on Bootstrap and Twig, so it starts from a fairly semantic, responsive, keyboard-operable base with real buttons and form controls. But it is not compliant by default: the product configurator often renders swatch-only options without group labels, the off-canvas cart and menu frequently fail to trap and return focus, toast notifications are not announced, and Shopping Experiences pages are only as accessible as the merchant builds them. Reaching WCAG 2.1 AA requires manual work on these areas.

Does Shopware need to meet the European Accessibility Act?

For most Shopware merchants selling to EU consumers, yes. The European Accessibility Act (EAA) has applied since 28 June 2025 and treats consumer e-commerce as a covered service; it references EN 301 549, which requires WCAG 2.1 Level AA for web content. Because Shopware is concentrated in the European market, its merchants are a natural audit target, so product pages, cart, and checkout need to meet WCAG 2.1 AA. This is general information, not legal advice.

How do I make the Shopware product configurator accessible?

Mark each variant property as a labelled group. Use a

/ or role="radiogroup" with an aria-label carrying the property name (Colour, Size), give every option an accessible name (the text value, not just a colour swatch), and expose the chosen option with aria-checked or aria-pressed. Make the options keyboard operable with a visible focus indicator, then confirm with a screen reader that focusing an option announces both the property and the value.

Why are my Shopware off-canvas cart and menu a keyboard trap?

Because in many customised themes they slide in without moving focus into the panel, leave focus on the page behind them, and offer no Escape key or focus return. Fix this by treating them as modal dialogs: on open, move focus to the panel or its close button; trap Tab within it; support Escape to close; and return focus to the trigger. Add role="dialog", aria-modal="true", and an accessible name to each panel.

Do Shopware plugins affect accessibility?

Yes. The Shopware Store does not enforce an accessibility standard, so storefront plugins - cookie banners, wishlists, comparison, quick buy - can add non-semantic widgets with no roles, names, or keyboard support and regress an otherwise compliant storefront. Run axe/WAVE and a keyboard pass on every page a plugin touches, before and after installing, and prefer plugins whose authors document accessibility or use native HTML controls.

Are Shopping Experiences (CMS) pages automatically accessible?

No. Shopping Experiences gives merchants full control over heading text, image alt, block order, and styling, which means the accessibility of each CMS page is entirely down to how it is built. Common mistakes are styling large text without marking it as a heading, leaving image elements with empty alt, and arranging blocks so the focus order does not match the visual layout. Apply the same heading and alt-text discipline you would when hand-coding a page.

Further Reading

Other CMS Checklists