Can a customer who can't see your photos buy from you?
Enter your store address. We read the HTML your storefront serves, name the theme it came from, and check the controls that only exist on a shop — the product grid, the variant picker, the quantity stepper, the cart drawer and the newsletter box in the footer — under the criterion each problem sits beneath.
Free, instant, no signup and no card. Nothing is stored.
Free, instant, no signup and no card. Your .myshopify.com address works too. We read the HTML your storefront serves for that one page. Nothing is stored.
Why a store fails differently from a website
Most accessibility checkers read a page. A store is not a page — it is a catalogue rendered through a template, and the two halves fail for different reasons and get fixed in different places.
The theme half is your Liquid: the cart icon with no name, the variant select with no label, the quantity input with no label, the drawer with no dialog role. Fix it once and it is fixed on every page in the store, forever. It is the cheap half.
The catalogue half is your product data, and no theme change touches it. Alt text on a product image exists only if somebody typed it into the admin field. A store on Dawn — the theme Shopify maintains, with every accessibility fix they have shipped — still carries one level A failure per undescribed photo, and a 400-product catalogue with three images each carries 1,200 of them. That is the half most merchants have never looked at, and it is the half a demand letter opens with, because it is trivial to demonstrate.
The two answers this checker refuses to give
A storefront behind its password page is not graded. What a password wall serves is Shopify's markup, not yours. Scoring it would produce a grade for their login form and tell you nothing about your theme — so we say what happened and stop.
A site we cannot confirm is Shopify is not graded either. Every rule here is written against a storefront's own markup. Run them on something else and they all go quiet, and a page of silence reads as a clean bill of health. That is the one way a free checker can be actively harmful, so when the Shopify signals are absent we say so instead.
And within a real storefront, an empty alt attribute is never called a failure. Inside a product card whose link already carries the product title, alt="" is the correct answer. It goes in its own bucket for you to walk, and never into the violation count.
What the checker looks for
Six failures, each naming its criterion, then the review and verify items — real problems that need your judgement or a rendered page, reported separately and never counted as violations.
- Shopify-hosted image with no alt attribute at allFailureWCAG 2.1 SC 1.1.1 Non-text Content (Level A)
- The image is served from Shopify's own CDN — a product photo, a collection image, a lifestyle shot uploaded in admin — and the tag carries no alt attribute. Not an empty one: none. A screen reader falls back to reading the file name aloud, which on a Shopify store is usually something like 4839-2_1024x1024.jpg. This is the most common automated failure on the web and the first one a demand letter names, because anybody can demonstrate it in a browser in ten seconds.
- The fix: Alt text for product media is edited per image in Shopify admin — Products → the product → hover an image → Add alt text. If the theme is dropping it, the Liquid is passing no alt at all; the correct form is {{ image.alt | escape }} on every image tag in snippets/card-product.liquid and sections/main-product.liquid. Fill the admin field for anything a customer needs to see described.
- Store control with an icon and no accessible nameFailureWCAG 2.1 SC 4.1.2 Name, Role, Value (Level A)
- A cart, search, account or menu control in the store chrome whose entire contents are an icon — an SVG or an image with no alt — and which carries no aria-label, no title and no visually-hidden text. A screen reader announces it as “button” or “link” with nothing after it. These are the five controls every visitor uses before they see a product, so an unnamed one is not an edge case: it is the front door.
- The fix: Add a visually-hidden span inside the control — <span class="visually-hidden">Cart</span> — rather than an aria-label, so speech-recognition users can say the word they see. In Dawn these live in sections/header.liquid and snippets/cart-drawer.liquid; the icon SVGs themselves should carry aria-hidden="true" and focusable="false".
- Variant picker with no labelFailureWCAG 2.1 SC 1.3.1 Info and Relationships / SC 4.1.2 (Level A)
- A size, colour or style selector — a select named options[…] or the radio group behind a colour swatch — with no label element pointing at it and no accessible name of its own. Sighted customers read the option name printed above the control; a screen reader user is handed a combo box that announces no question. This is the control that decides what the customer is actually buying.
- The fix: Every variant control needs its option name as a real label: <label for="Option-0">Size</label>, or on a swatch group a <fieldset> with a <legend>. In Dawn this is snippets/product-variant-picker.liquid; in a 1.0 theme it is usually sections/product-template.liquid, where the option name is often rendered as a bare div above an unlabelled select.
- Quantity field with no labelFailureWCAG 2.1 SC 3.3.2 Labels or Instructions / SC 4.1.2 (Level A)
- The quantity input on the product form or in the cart has no label, no aria-label and no title. It announces as an edit field with no name, next to two buttons that are usually a plus and a minus icon with no name either. A customer using a screen reader can reach the box and cannot tell what typing in it does.
- The fix: Label it — <label class="quantity__label" for="Quantity-1">Quantity</label> — and give the stepper buttons text: “Decrease quantity for Blue Hoodie”. Dawn ships this correctly in snippets/quantity-input.liquid, so a store missing it is usually on a 1.0 theme or a customised product form.
- Newsletter signup field with no labelFailureWCAG 2.1 SC 3.3.2 Labels or Instructions (Level A)
- The footer email field — Shopify's contact[email] form — is labelled only by its placeholder text. Placeholders are not labels: they disappear the moment the customer types, several screen-reader and browser combinations never announce them, and they fail the criterion outright. It is on every page of the store, because it is in the footer.
- The fix: Add a real label and keep the placeholder if you like the look: <label for="NewsletterForm--footer">Email</label>. Dawn does this in sections/footer.liquid with a visually-hidden label; a theme that removed it, or a third-party popup app, is the usual source.
- No language declared on the pageFailureWCAG 2.1 SC 3.1.1 Language of Page (Level A)
- The html element carries no usable lang attribute, so a screen reader has nothing to pick a voice from and falls back to whatever language the listener's own device is set to. Nothing about it is visible on screen, which is why a store can carry it through years of redesigns.
- The fix: In theme.liquid the opening tag should be <html class="no-js" lang="{{ request.locale.iso_code }}">. Driving it from request.locale is what makes it correct on a market that sells in more than one language; a hard-coded lang="en" on a German storefront is worse than none.
- Cart drawer with no dialog semanticsReviewWCAG 2.1 SC 4.1.2 Name, Role, Value (Level A)
- A cart or menu drawer is in the markup and the element carries no role="dialog" and no aria-modal. When it opens, a screen reader is not told a dialog appeared, and the rest of the page usually stays reachable behind it — so a customer can tab out of the open cart into the product grid underneath and have no idea the cart is still on screen. Whether focus is actually trapped needs a rendered page, which is why this is review.
- The fix: Give the drawer role="dialog", aria-modal="true" and an accessible name, move focus into it on open, return focus to the control that opened it on close, and close it on Escape. Dawn's cart-drawer.liquid is a working reference.
- No skip-to-content link foundReviewWCAG 2.1 SC 2.4.1 Bypass Blocks (Level A)
- Nothing near the top of the body looks like a skip link. A store header is the most repetitive block on the web — announcement bar, logo, a multi-level menu, search, account, cart — and without a way past it a keyboard user tabs through the whole thing on every page before reaching a product. Reported as review rather than failure because a theme can satisfy the criterion with landmarks alone, which needs a rendered page to confirm.
- The fix: Dawn ships one as the first element in theme.liquid: <a class="skip-to-content-link button visually-hidden" href="#MainContent">Skip to content</a>, with id="MainContent" on the main element. Adding both to a 1.0 theme is a two-line change.
- Auto-rotating slideshow with no pause control in the markupReviewWCAG 2.1 SC 2.2.2 Pause, Stop, Hide (Level A)
- The homepage slideshow section is configured to advance on its own and we found no pause or play control in the served markup. Moving content that starts automatically, lasts more than five seconds and runs alongside other content has to be pausable. It is also the most common reason a merchant's own screenshot of a bug cannot be reproduced: the slide moved.
- The fix: Dawn's slideshow section renders a pause button when autoplay is on — check that the theme's slideshow.liquid still includes it, or turn autoplay off in the theme editor, which is the one-click version of the fix.
- Sunset Online Store 1.0 themeReview
- The storefront is running one of the themes Shopify retired when Online Store 2.0 shipped. They still work and they are not forbidden — but they stopped receiving updates, and the accessibility work Shopify has done since then went into Dawn and its siblings, not into these. The skip link, named drawer toggles, the focus trap in the cart drawer and the pause control on the slideshow are all fixes a merchant on a 1.0 theme has to make by hand.
- The fix: You do not have to re-platform to fix this. Treat the specific failures listed above as the work; the theme name is context for why they are there. If you were already planning a refresh, Dawn is the accessible baseline and Shopify maintains it.
- Accessibility overlay app installedReview
- An overlay widget is loaded on the storefront. Overlays are sold through the Shopify App Store as compliance, and they are the single most common reason a merchant believes a store is covered when it is not: they cannot fix missing alt text, unlabelled variant pickers or a cart drawer that traps focus, because those live in the theme's markup. US lawsuits filed in 2023 and 2024 name plaintiffs who encountered the barrier while the overlay was running.
- The fix: Keep it or remove it — that is a business decision, not a WCAG one. What it does not do is discharge the obligation: the failures listed above are still in the theme, and the remediation has to happen there.
- Shopify image marked decorative with alt=""Verify
- The image has an empty alt attribute, which tells assistive technology to skip it. Inside a product card whose link already carries the product title, that is exactly right and this bucket is good news. On a standalone product photo or a banner carrying an offer, it means the information in the picture reaches nobody. Only you can tell which of the two this is, so it is never counted as a violation.
- The fix: Walk the list. Anything a customer needs to know from the picture — the print on the shirt, the words on the sale banner, the chart in the size guide — needs a description in the admin alt-text field. Anything that is genuinely a flourish beside text that already says it should stay as it is.
Where each fix actually lives
The most expensive mistake a merchant makes here is sending the whole list to a developer. Half of it is not a code change.
- Product image alt textShopify admin — Products → image → Add alt text
- Cart, search, menu icon namessections/header.liquid
- Variant picker labelssnippets/product-variant-picker.liquid
- Quantity field labelsnippets/quantity-input.liquid
- Newsletter field labelsections/footer.liquid
- Page languagelayout/theme.liquid — lang="{{ request.locale.iso_code }}"
- Skip linklayout/theme.liquid + id="MainContent" on <main>
- Cart drawer dialog semanticssnippets/cart-drawer.liquid
- Slideshow autoplayTheme editor — turn autoplay off, no code
- Overlay widgetShopify admin → Apps — a business decision, not a fix
Common questions
- Does the ADA apply to a Shopify store?
- US courts have overwhelmingly treated an online store as a place of public accommodation under Title III, and e-commerce is where the filings concentrate: accessibility lawsuits and demand letters against online retailers have run in the thousands a year since 2018, with the large majority naming a shop rather than a brochure site. Being on Shopify does not change the analysis. Shopify is responsible for its own checkout and admin; the storefront a customer meets is your theme, your product data and your apps, and that is where almost every cited barrier lives.
- Isn't Shopify accessible out of the box?
- Shopify's own checkout is the strongest part of the stack, and the themes it maintains — Dawn and the Online Store 2.0 family — ship a skip link, named drawer controls, a labelled quantity input and a labelled newsletter form. But three things are yours regardless of theme: the alt text on every product image, which only exists if somebody typed it in admin; the apps you install, which inject markup Shopify never reviewed; and any customisation a developer made to the theme. A store on Dawn with no alt text on 400 product photos has hundreds of level A failures.
- Which themes does this checker know about?
- It reads the theme name Shopify puts in the page and sorts it into three buckets. Online Store 2.0 themes Shopify maintains — Dawn, Craft, Crave, Sense, Studio, Taste, Refresh, Origin, Ride, Colorblock, Publisher, Spotlight — are the accessible baseline. The sunset 1.0 themes — Debut, Brooklyn, Narrative, Supply, Venture, Minimal, Boundless, Simple, Express, Pop and their siblings — still run and are not forbidden, but they stopped receiving updates, so every fix Shopify has shipped since is one you make yourself. Anything else is reported as custom and not guessed at.
- Will an accessibility app from the Shopify App Store fix this?
- An overlay widget cannot fix any of the failures on this page. Missing alt text, an unlabelled variant picker, an unnamed cart icon and a cart drawer with no dialog semantics all live in your theme's markup and your product data; an overlay is a script that runs afterwards and paints a toolbar over the result. This checker reports an installed overlay as a review item, not a violation — keeping it is a business decision — but it does not reduce the list above by one line. US lawsuits filed in 2023 and 2024 name plaintiffs who hit the barrier with the overlay running.
- Why does it say my store isn't Shopify?
- We look for the signals Shopify puts in its own markup: assets on cdn.shopify.com, /cdn/shop/ media paths, the inline Shopify object, a myshopify.com domain, shopify-section markup, the product form, and the powered-by and x-shopid response headers. If none of them are there, the honest answer is that we cannot confirm it, so we stop rather than run store checks that would find nothing and report the silence as a pass. A headless storefront — Hydrogen, or a custom front end on the Storefront API — is the usual reason: the store is real and the checks genuinely cannot see it. Run the full scan instead; it renders the page.
- My store has a password page. Can you check it?
- No, and it refuses to try. A storefront password wall is Shopify's page, not yours — grading it would score their login form and tell you nothing about your theme. Either remove the password under Online Store → Preferences, or run the full scan, which accepts a storefront password so it can get behind the wall without ever storing it.
- What can't this tell me?
- Anything that needs a rendered page. Colour contrast between your sale badge and its background, whether focus is actually trapped inside the cart drawer when it opens, whether the quick-add modal returns focus to the button that opened it, the reading order your CSS produces, and everything behind a click. Those are the scan's job, and it is free too. This page answers what is decidable from the markup your server sends — which, on Shopify, is most of the product form, because Liquid renders on their servers rather than in the browser.
- Does this store my store's URL?
- No. The check is a single HTTP GET of the page you name, run inside the request and discarded when it answers. There is no account, no email field and no row written anywhere. If you go on to run the free scan, that one does keep a report so you can come back to it.
Keep reading
- Which images have no alt text? →
- Which form fields have no label? →
- What is your hamburger button called? →
- Is an overlay running on your site? →
- Which voice will read your page aloud? →
- Can a keyboard reach everything a mouse can? →
- The ADA compliance checker →
- Is my website ADA compliant? →
- The free accessibility checker →
- The WCAG compliance tool →