# Six accessibility failures are blocking sales on almost every online store. Here is how to find yours.

## Summary

WebAIM's 2026 Million report identified six recurring issues that account for 96% of accessibility errors on the web. For online stores, each one is a drag on conversion. This article shows you how to find them on your own store in five minutes.

- 95.9% of the top one million home pages have issues that block at least some customers from completing a purchase.
- Online stores perform worse than the web average. Shopify stores averages 36.6% more issues per page than the typical site.
- 96% of these issues come from the same six problems, and the same six have topped the list every year for seven years.
- Stores that fix the basics enter the rare 4.1% that are open to every customer for business.

If you run an online store, [WebAIM's 2026 Million report](https://webaim.org/projects/million/) is worth your attention, because almost everything it identifies is a customer who tried to buy from a site like yours, but couldn't. Collectively, that is [costing UK businesses an estimated £17 billion every year](/blog/black-friday-cyber-monday-sales-advantage). Here's how to make sure you're not missing out on that.

That is the framing I would ask you to hold onto while you read the rest of this article. Accessibility, as a topic, is often easy to file under "_important but not urgent_". Lost sales aren't. Every lost sale is a customer who tried to buy from you and couldn't, and the report is a list of the most common reasons why.

Some of the numbers are striking. 95.9% of the top one million home pages have accessibility failures that block at least some customers from completing a purchase. And that number got worse this year, after six years of slow improvement - with online stores sitting among the worst performing categories in the entire report. [Shopify sites averaged 36.6% more issues than the typical page on the web](/blog/shopify-checkout-accessibility-product-pages/). Although it's worth noting that Shopify Checkout is highly accessible - it's the product pages which are letting you down.

The useful number, though, is 96%. That is the share of every issue WebAIM detected, across 56 million failures across a million sites, that comes from just six recurring problems. **The same six failures have topped the list every year for seven years.**

This is a short, stable, well-documented list of fixable issues. And the stores that work through this list and fix their failures end up in the rare 4.1% that are open to every customer for business, regardless of how those customers browse the web. The other 95.9% keep losing orders to the same six failures, year after year, while everyone wonders why their conversion rate is stuck.

## TL;DR for business leaders

- **Problem:** 96% of the issues stopping customers from buying come from six recurring failures, and online stores rank among the worst performers.
- **Impact:** Customers cannot complete purchases, your acquisition spend is wasted on traffic that bounces, and your store sits with the 95.9% rather than the rare 4.1%.
- **Fix:** Run a 5-minute diagnostic on the four pages that matter most, then work through the six issues in order of prevalence.
- **Result:** A measurable drop in unexplained drop-off, more completed orders, and a competitive position most of your category is failing to claim.

## Run this 5-minute test before you read on

Open Chrome, go to your busiest product page, and run [Google PageSpeed Insights](/start-here/product-page-accessibility-guide/) on the URL.

You are looking at the **Accessibility** score, not Performance. Scroll down to the audits section and you will see a list of issues. Most of what shows up there will map to one of the six problems below.

Now do the same on your home page, a category page, and your checkout. Five minutes, four pages, and you have a list of every automated issue on the journey your customers are actually walking.

**Two caveats before we go further.**

Automated tools find roughly 30% of issues that block customers. They are very good at finding the six failures in this article, because all six are mechanical and easy for software to detect. They are not good at the harder questions: does this make sense to a screen reader user, does this dropdown announce the right thing when a customer changes a size, can someone using only a keyboard actually get to your "add to bag" button without giving up first. For that, you need a human eye, which is the gap that [accessibility reviews](/reviews/) are designed to close.

A clean automated score also does not mean a perfectly accessible store. It means you have cleared the lowest bar. The reason that bar matters is that 96% of customers who get blocked are getting blocked at it.

**Onto the six.**

## 1. Low contrast text (found on 83.9% of stores)

Low contrast text is the most common problem on the web. WebAIM found an average of 34 separate instances of low contrast text on _every home page they tested_, up 15% in a single year.

Low contrast text often shows up as light grey body copy on white, white text laid over a pale lifestyle photo, or a brand colour button that looks crisp on the designer's monitor and washes out in sunlight. Sale tags are a regular offender, because the background flips between light and dark depending on the product image behind them.

**Who this blocks:** anyone with low vision, plenty of customers over 50, anyone with cataracts, anyone reading on a phone outside, anyone with a cheap monitor, anyone tired at the end of a working day. In practice, a meaningful chunk of your customers some of the time, including a lot of customers who would never describe themselves as having a disability.

**Sales cost:** people skim before they read. If your price, your "add to bag" button, your shipping copy, or your sale flag is hard to read, you lose them in the first second. They will not know they bounced because of contrast. They will just feel the page was hard work and go somewhere easier.

**How to spot it:** in PageSpeed Insights, look for the audit named "Background and foreground colours have a sufficient contrast ratio". Expand it to see every failing element on the page, with the contrast ratio it currently has and the ratio it needs. If you want to understand the science behind _why_ the ratio matters, here is a [full breakdown of WCAG colour contrast and the 4.5:1 ratio](/blog/wcag-colour-contrast-explained/). To stress-test how your contrast holds up under real use, [testing with browser zoom](/reviews/browser-zoom-testing/) shows what happens when a customer increases their browser zoom to read a page more comfortably, which a lot of older customers do as a default.

**What fixing it looks like:** mostly a design system fix. Pick contrast-safe defaults for body text, buttons, links, and labels, and stop overriding them with brand colours that fail. Most failures on a typical store come from three or four colour combinations being repeated across the site, so once you fix the system, the page-by-page work is small.

**What to brief your developer:** audit every text/background colour combination in the design system, adjust any that fail 4.5:1 (body text) or 3:1 (large text and UI components) until they pass, and update the design tokens so the fix propagates across the codebase.

## 2. Missing or weak alt text (53.1% of stores)

This one matters more for ecommerce than almost any other category, because product images carry a huge part of the buying decision.

The WebAIM report found that one in five linked images on the average home page has no alt text. On a product page, that means a screen reader user will often hear the filename, or just "image", instead of a description of what they are about to buy. Product images often show more than then written description covers (the fit, how it looks on the model, the way the fabric drapes, what the back of the product looks like) so the customer is left making a buying decision with half the information.

The [full guide to writing alt text for product images](/blog/how-to-write-alt-text-for-product-images/) covers what good descriptions look like across product photography, lifestyle imagery, and variants. The short version is below.

**Who this blocks:** screen reader users, obviously. But also anyone whose connection failed to load the image (more common than you might think), anyone using a text-based browser, and Google's image crawler, which is increasingly how products get surfaced in search and AI-generated answers. There is a separate piece on [how AI is becoming a sales channel that depends on accessibility](/blog/ai-as-a-sales-channel-accessibility/), and alt text is a large consideration.

**Sales cost:** if your product images do not carry their meaning into alt text, you become invisible to a slice of buyers. The slice is small in absolute terms, but it is also a slice your competitors are usually not serving either, which makes it disproportionately winnable.

**How to spot it:** in PageSpeed Insights, look for the audit named "Image elements have `[alt]` attributes". This catches images missing alt text entirely, but it will not catch weak or repetitive alt text (every image on a page being called "product image" or just the product name). For that, [this video on effective alt text for product pages](/reviews/effective-product-alt-text/) walks through what good and bad alt text actually look like in real use.

**What fixing it looks like:** there is a [full guide to writing alt text for product images](/blog/how-to-write-alt-text-for-product-images/) for the long version. The short version: describe what is relevant about the image to someone making a buying decision. The colour, the cut, the texture, the use case. Not "a t-shirt". A t-shirt in what?

If you are using AI to generate alt text, be careful. [A test of three AI alt text generators](/blog/can-ai-be-used-to-write-good-descriptive-alt-text/) showed mixed results. AI is a useful first draft, not a finished answer, and the gap between draft and finished is where the sales sit.

**What to brief your developer (and your content team):** make sure every image element has an `alt` attribute (even if empty for decorative images). On Shopify, WooCommerce, and most modern platforms, alt text lives on the image in the admin panel, so the content team can fix existing products without developer time. Bake it into the standard product upload process so the problem stops reappearing.

## 3. Missing form labels (51% of stores)

Half the web has at least one form field with no proper label. For a store, that almost always shows up in two places: the search bar in the header, and somewhere in checkout.

A form label is the bit of text that tells the customer what to type into a field. The common workarounds are to use placeholder text inside the field as a substitute, or to lean on an icon (a magnifying glass for search, for example) and assume that is enough. Neither works well. Placeholder text disappears the moment the field has focus, which is a problem for anyone who looks away mid-typing or has memory or attention difficulties. Icons get ignored by screen readers entirely.

This is the highest-stakes failure on the list, because it directly hits the part of your store where money changes hands. A confusing checkout form costs you sales from every customer, not only disabled ones. The accessibility fix and the conversion fix are, in this case, the same fix, which is why this would normally be the place to start for any store doing meaningful volume.

**How to spot it:** in PageSpeed Insights, look for the audit named "Form elements have associated labels". To see the pattern at full scale, [this review of the Vitality life insurance form](/reviews/vitality/) walks through what goes wrong on a real form when labels are not done well, and what the fixes look like step by step.

**What fixing it looks like:** every form field gets an associated label. The label should be visible, not just announced to assistive technology, because everyone benefits from a label that does not disappear. The proper HTML pattern is `<label for="...">` paired with the field's `id`, or the field wrapped inside the label. Usually one line of HTML per field, and it is the kind of fix that can ship the same day someone notices it.

**What to brief your developer:** every form field needs a visible label, programmatically associated with its field. Placeholder text is fine as a hint (like a format example) but never as a substitute for a label. For search inputs and other icon-only inputs, either add a visible label or use an `aria-label` attribute that names the field.

## 4. Empty links (46.3% of stores)

An empty link is a link that contains no readable text. The most common offender on a store is the row of social icons in your footer, where each link contains an icon and nothing else. The cart icon in your header often has the same problem, as do search icons, hamburger menus, and "add to wishlist" hearts.

To a screen reader, every one of those announces as "link" with no further information. Voice control users cannot say "click cart link" because there is no readable text to match against, so the link might as well not exist. Multiply that across thousands of sessions a month and the number of customers who cannot reach your cart adds up to a real number of orders.

**How to spot it:** in PageSpeed Insights, look for the audit named "Links have a discernible name". To see the pattern in a real store, [this Pact Coffee review](/reviews/pact-coffee/) walks through how custom buttons end up empty even when they look perfectly normal to a sighted user, and [Where's your focus?](/reviews/wheres-your-focus/) shows what happens when these same links also break the keyboard journey.

**What fixing it looks like:** every icon link needs an accessible name. The cleanest fix is to add visible text alongside the icon, which often makes the design clearer for everyone. If the design genuinely demands icon-only, an `aria-label` attribute on the link does the job. Describe what it does, not what it is. "Open cart", not "shopping cart icon".

**What to brief your developer:** audit every link that contains only an icon or image, and add visible text alongside the icon wherever the design allows. Where the design demands icon-only, use `aria-label` (not `title`, which does nothing for screen readers in most cases). For dynamic states like a cart count, make sure the `aria-label` updates when the count changes.

## 5. Empty buttons (30.6% of stores)

The same problem as empty links, applied to buttons. Most often it is the close button on a modal (the X that dismisses a popup), the cart icon in the header, or a "quick view" button on a product card.

If a customer cannot dismiss your newsletter popup because the close button has no name, they are stuck on a page they did not want to be on, and the most common response is to close the tab. That is one of the more painful ways a store can lose a sale, because the customer did not even get to your product before you blocked them.

A lot of "buttons" on stores are not really buttons at all. They are custom controls that look like buttons but were built as styled `<div>` elements with click handlers. To assistive technology, those are invisible. [This custom dropdown review](/reviews/accessible-custom-dropdown/) and [this review of product options on a real store](/reviews/accessible-product-options/) both walk through this pattern, which is particularly common on Shopify stores using newer themes.

**How to spot it:** in PageSpeed Insights, look for the audit named "Buttons have an accessible name". For the deeper testing pattern, [this keyboard trap review](/reviews/keyboard-trap/) shows what happens when a customer cannot escape a control they did not mean to enter, which is usually how empty button problems play out in real journeys.

**What fixing it looks like:** every button needs an accessible name (visible text inside the button, or an `aria-label` if the design requires icon-only). And use a real `<button>` element, not a styled `<div>`. The browser gives you keyboard support, focus, and the right semantics for free if you use the right tag, which means a chunk of the work is already done before anyone writes any code.

**What to brief your developer:** every button needs an accessible name, and every "button" should actually be a `<button>` element rather than a styled `<div>`. For dynamic states (like a wishlist heart that toggles between empty and full), make sure the accessible name reflects the current state. Audit any modal popups specifically: the close button must have an accessible name and be reachable by keyboard.

## 6. Missing document language (13.5% of stores)

The quickest fix on the list, and the one most likely to be your developer's job rather than yours.

Every HTML page should declare its language with a `lang` attribute on the `<html>` tag. When this is missing, screen readers do not know which language to use, so they pronounce English content with whatever default voice the user has set. If their default is French, your product descriptions get read out in a French accent. It is bad enough that screen reader users often abandon a page entirely when it happens.

The sales cost is smaller than the other five, but the fix is so trivial there is no excuse for leaving it broken.

**How to spot it:** in PageSpeed Insights, look for the audits named "`<html>` element has a `[lang]` attribute" and "`<html>` element has a valid value for its `[lang]` attribute". The second one catches the case where someone has set the language but used an invalid code (like `lang="english"` instead of `lang="en"`).

**What fixing it looks like:** one line in your site's template. If you are on Shopify, WooCommerce, or any modern platform, this is usually already set correctly by the theme. If it is not, your developer can fix it in five minutes.

**What to brief your developer:** add `lang="en"` (or whatever language your store is in) to the `<html>` tag in the site template. For stores serving multiple languages, the attribute should change to match the active language version.

## Why the same six keep showing up

WebAIM has been running this report for seven years. The same six problems have topped it every single year. Page complexity has nearly doubled since 2019. ARIA usage is six times higher than it was. AI-assisted coding has made it faster than ever to ship new components, often without anyone reviewing whether they actually work for every customer.

The failures are not getting more sophisticated. They are getting more numerous, on more pages, in more places, because nobody is checking.

That is good news if you run a store. It means you do not need a full accessibility programme to leap ahead of your competitors. You need to fix six things, on every page that matters: home, category, product, cart, checkout. If you can do that, you are already in the top 4% of stores by usability for a slice of your customers your competitors are quietly losing.

## What to do this week

If you suspect customers are dropping out before they reach your checkout, here is the order to work in:

1. Run [PageSpeed Insights](https://pagespeed.web.dev/) on your home page, a category page, a product page, and your checkout. Note the accessibility score and the issues flagged.
2. Group the issues into the six buckets above. Most will fit cleanly.
3. Fix the highest-count issue first, which is usually contrast or alt text. Do not try to fix everything at once, and do not get distracted by issues that are not on the six.
4. Re-run the test. Watch the score move. Pick the next.
5. For the journey-based issues PageSpeed Insights cannot see (the dropdowns, the keyboard journeys, the screen reader experience on a real product page), work through the [free product page accessibility guide](/start-here/product-page-accessibility-guide/).
6. If you want a quick, specific steer on your own store rather than a generic checklist, [send me a URL](/contact/) or <a href='mailto:hello@davedavies.dev' data-plausible-event='Direct Email Click'>email me directly</a> and I will tell you where I would start.

The list is not getting any shorter, and your competitors are not fixing theirs.
