Where Shopify accessibility problems come from
| Layer | Typical findings | Where you fix it |
| Theme settings | Low-contrast colour schemes, auto-playing slideshows, scrolling announcement
bars, button labels such as "Shop now" | Theme editor, no code |
| Theme code (Liquid, CSS, JavaScript) | Colour swatches with no names, sale prices read
out as two numbers, cart drawers that lose focus, mega menus that only open on hover | Edit code
on a duplicate theme, or ask the theme developer |
| Apps | Newsletter pop-ups with no close button, review stars with no text, chat launchers
that trap focus, upsell carousels | App settings, app embeds toggle, or the app developer |
| Content | Product photos with no alt text, bold text used as headings, "click here" links
in descriptions, text inside banner images | Products, collections, pages and Files in the admin |
| Checkout | Rarely the source; changes are limited to branding and extensions | Checkout
settings and checkout extensions |
Most stores find that a handful of theme and app issues account for the majority of findings, because
they repeat on every product and collection page. Content issues are spread thinly but add up.
Working out which layer caused a finding
- Run the checker on one page of each type. Home page, a collection, a product with
variants, a product on sale, a blog post, the cart page and your contact page. Shopify uses one template
per type, so these cover almost the whole shop.
- Inspect the failing element. In the browser's element inspector, theme markup usually
sits inside elements whose ids start with
shopify-section-. Markup injected by apps is often
inside a container named after the app, or inside an iframe, and is frequently added near the end of
the body.
- Switch off app embeds in a preview. In the theme editor, open the App embeds panel
and turn embeds off on your duplicate theme, then run the check again. Findings that disappear belong
to an app.
- Compare with a fresh copy of the theme. Add an untouched copy of your theme from
the Theme Store or theme library to the admin and check the same page. If the fault is not there, it
came from a later code edit.
๐ก Theme preview links let you run checks on an unpublished theme. Copy the preview
link from the theme's Actions menu and test that address, so shoppers never see a half-finished fix.
The fix, step by step
Step 1
Duplicate the theme and record
a baseline
In the admin, go to Online Store, then Themes, open the Actions menu on your live theme
and choose Duplicate. Do all work on the copy. Run the Accessibility Audit on the preview of one page
of each template type and save the results, so you can see what improved. Note the theme name and version,
because an update from the theme developer may already fix some of the problems you find.
Step 2
Fix what the theme editor controls
Open
Customize on the duplicate. In Theme settings, adjust the colour schemes so text and buttons have enough
contrast against their backgrounds, checking each scheme the sections use. Turn off autoplay on slideshows
or make sure a visible pause control exists, stop scrolling announcement bars, and rewrite vague button
labels in section settings so they say where they go, such as "Browse winter coats" instead of "Shop
now".
Step 3
Add alt text to product media and
files
Open each product, click an image in the Media area and choose Add alt text. Describe what
distinguishes that photo, such as the colour, angle or detail shown, rather than repeating the product
title for every image. Images used in theme sections, like banners, take their alt text from the file,
so set it under Content, then Files. Leave purely decorative images empty, and never put important text
such as sale terms only inside a banner image.
Step 4
Test app embeds and pop-ups one
at a time
With app embeds switched off, turn them back on one by one and repeat a keyboard pass
and the checker after each. Newsletter and discount pop-ups must be closable with a visible button and
the Escape key, must receive focus when they open and return it when closed. Review widgets need star
ratings as text. Where an app fails and has no setting to fix it, raise it with the developer or replace
the app.
Step 5
Repair product page controls in
Liquid
On the product template, check that variant options are grouped in a fieldset
with a legend naming the option, and that colour swatches carry the colour name as text,
not only a coloured circle. Give quantity plus and minus buttons names such as "Increase quantity". Make
sure sale prices include hidden labels for the regular and sale price, and that price and stock changes
after choosing a variant are announced through a status region.
Step 6
Make the cart drawer and notices
behave
Add a product to the basket using only the keyboard. If a drawer or pop-up opens, focus
should move into it, Tab should stay inside while it is open, Escape and a labelled close button should
shut it, and focus should return to the Add to cart button afterwards. If the item is added without a
drawer, a status message such as "Added to your basket" should be announced. Removing a cart line should
leave focus somewhere sensible.
Step 7
Publish, recheck and add an accessibility
statement
When the duplicate passes your keyboard walk-through and the checker shows the improvements
you expected, publish it and run the checks again on the live store, since some apps behave differently
on a published theme. Then create a page under Online Store, then Pages, explaining what you have tested,
any known problems, and how shoppers can contact you for help or to order another way, and link it from
the footer.
Liquid and HTML patterns for common product page faults
Variant options as a named group
{%- for option in product.options_with_values -%}
<fieldset class="variant-option">
<legend>{{ option.name }}</legend>
{%- for value in option.values -%}
<input type="radio"
id="opt-{{ option.position }}-{{ forloop.index }}"
name="{{ option.name | handle }}"
value="{{ value | escape }}"
{% if option.selected_value == value %}checked{% endif %}>
<label for="opt-{{ option.position }}-{{ forloop.index }}">
<span class="swatch" aria-hidden="true"></span>
{{ value }}
</label>
{%- endfor -%}
</fieldset>
{%- endfor -%}
The visible or hidden text {{ value }} gives each swatch its colour or size name, and
native radio buttons give arrow-key movement within the group for free. If your design shows only the
swatch, wrap the name in a visually hidden class rather than removing it.
Sale prices that make sense when read aloud
<div class="price">
{%- if product.compare_at_price > product.price -%}
<span class="visually-hidden">Regular price</span>
<s>{{ product.compare_at_price | money }}</s>
<span class="visually-hidden">Sale price</span>
{{ product.price | money }}
{%- else -%}
{{ product.price | money }}
{%- endif -%}
</div>
Most screen readers do not announce strike-through formatting, so without the hidden labels shoppers
hear two prices with no idea which one they pay. Shopify's own free themes already include this pattern;
older or heavily customised themes often do not.
Announcing variant and basket changes
<div id="product-status" class="visually-hidden" role="status" aria-live="polite"></div>
// after the variant changes and the price is updated:
document.getElementById('product-status').textContent =
'Selected: Navy, Large. Price ยฃ45. In stock.';
Keep the status element in the template from the start and only change its text. The same element
can announce "Added to your basket" when there is no cart drawer.
Page language
Check that layout/theme.liquid sets the language on the root element, for example <html lang="{{ request.locale.iso_code }}">.
This makes screen readers use the right pronunciation, and it follows the shopper's chosen language on
multilingual stores.
Apps, overlays and third-party widgets
Apps are the part of a Shopify store most likely to add accessibility problems after launch, because
each one injects its own markup, styles and scripts. Before installing, look at the app's listing and
documentation for any statement about keyboard and screen reader support, and try its demo store with
the keyboard.
- Pop-ups and spin-to-win wheels. Check the delay, whether Escape closes them, whether
focus moves in and out correctly, and whether the close button has a name. Many can be switched to a
less intrusive bar or slide-in.
- Reviews. Star ratings should be readable as text, such as "Rated 4.5 out of 5 from
28 reviews", not just a row of icons.
- Chat and help widgets. The launcher must be a named button, and the chat window must not trap focus once opened.
- Filters and search. When a collection updates after ticking a filter, the number
of results should be announced, and focus should not jump to the top of the page.
โ ๏ธ Several apps sell an accessibility toolbar or overlay that promises compliance.
These do not repair the theme's code, the missing alt text or the inaccessible app pop-ups, and they
can conflict with the screen readers and settings disabled shoppers already use. Spend the effort on
the fixes above instead.
What about checkout?
Shopify runs the checkout pages itself, and merchants cannot edit their HTML directly. The older checkout.liquid
customisation route has been retired in favour of checkout extensibility, where changes are made through
branding settings and checkout extensions. In practice that means:
- Your main responsibility in checkout is branding: make sure the colours and fonts you choose in the
checkout editor keep text and buttons readable.
- Any checkout or thank-you page extension you install or build should be tested with a keyboard and
a screen reader, like any other app.
- If you find a problem in the core checkout, report it to Shopify Support with the page, browser and assistive technology you used.
Accelerated payment buttons, such as wallet buttons on product and cart pages, are provided by the
payment services. Check that they can be reached with Tab and are not hidden behind a sticky Add to cart
bar.
Content habits for store owners and staff
Theme and app fixes are made once. Content accessibility depends on everyone who adds products and
pages, so build a short checklist into your routine. The detail for each is in its own guide:
- Alt text for each product photo, describing what that photo shows: see fixing
alt text.
- Headings in product descriptions and pages chosen from the Heading options in the rich text editor,
in order, not bold paragraphs: see fixing
heading structure.
- Link wording that names the destination rather than "click here": see fixing
vague link text.
- Size charts and care instructions as real tables or text, not images.
- Videos with captions, and no autoplaying sound.
Colour scheme contrast and visible focus outlines are theme-wide settings; fixing
colour contrast and fixing focus
indicators explain what to aim for.
Keeping it fixed through theme updates
Theme developers release updates, and Shopify lets you add the new version to your theme library.
Code edits you made to the old version are not carried across automatically, so keep a record of every
accessibility change you make in Liquid, CSS or JavaScript: the file, what you changed and why. Before
publishing an updated theme, rerun the checker and your keyboard walk-through, reapply any changes the
update did not include, and tell the theme developer about faults so they can fix them for everyone.
Themes listed in the Shopify Theme Store have to meet Shopify's published accessibility requirements,
which is a useful baseline, but it does not cover your settings, apps or content.
Questions and answers
1. Are Shopify stores accessible by default?
Partly. Shopify runs the checkout and its own free themes are built with accessibility
in mind, including skip links, labelled forms and hidden price labels. But every store also depends on
the theme you chose, the settings you picked, the apps you installed and the content you added. Low-contrast
colour choices, pop-up apps and product photos without alt text are common problems that no theme can
prevent. Each store needs its own testing.
2. Which Shopify theme is the most accessible?
There is no single answer, and it changes as themes are updated. Themes in the Shopify
Theme Store must meet Shopify's accessibility requirements before listing, and Shopify's own free themes
are a solid starting point. Before buying a paid theme, try its demo store with only a keyboard, run
the Accessibility Audit on a demo product page and look for a statement about accessibility from the
developer. Your own settings and apps will still matter more than the theme name.
3. How do I add alt text to Shopify product images?
Open the product in the admin, click the image in the Media section and choose Add
alt text. Type a short description of what that particular photo shows and save. For images used in theme
sections such as banners and image-with-text blocks, set the alt text on the file in the Files area under
Content. Many themes fall back to the product title when alt text is empty, which means every photo of
the product sounds identical.
4. Will an accessibility app make my Shopify store compliant?
No. Overlay and toolbar apps add a layer on top of the store, but they do not correct
the underlying code, such as unnamed buttons, focus traps in pop-ups or missing alt text, and they can
interfere with assistive technology shoppers already use. Many accessibility specialists and disabled
users advise against them. The dependable route is to fix the theme settings, code, apps and content
directly, then test with a keyboard and screen reader.
5. Can I fix accessibility problems in Shopify checkout?
Only to a limited degree, because Shopify runs the checkout pages and merchants cannot
edit their HTML. You control branding, so choose colours and fonts that keep text and buttons readable,
and you control which checkout extensions you add, so test those with a keyboard and a screen reader.
If you find a fault in the core checkout, report it to Shopify Support with details of the page, browser
and assistive technology involved.
6. Do I need an accessibility statement on my Shopify store?
For most private businesses in the UK there is no specific rule requiring one, unlike
public sector websites. It is still good practice and helps show you take reasonable steps under the
Equality Act 2010. A short page saying what you have tested, what is known not to work and how shoppers
can get help or order another way is enough. If you sell into the EU, check whether the European Accessibility
Act applies to you. This is not legal advice.
7. Why do screen readers read my sale price wrongly?
Because most screen readers ignore strike-through formatting. If the theme shows the
original price with a line through it and the sale price beside it, a shopper using a screen reader hears
two prices with no way to tell which is current. The fix is to add visually hidden labels such as Regular
price and Sale price before each figure in the price snippet of your theme. Shopify's own free themes
already include this pattern.
Check your Shopify store
The Accessibility Audit tests your page against WCAG 2.2 level AA and lists each finding with
the element that failed and the success criterion behind it, so you can see whether the theme, an app
or your content needs fixing.
Open Accessibility Fixes โ