Sightline

Checkout Barrier Index

How hard real online stores are to use with a screen reader or a keyboard on the way to checkout, measured with automated accessibility checks and a keyboard-only walk on each product page. Stores are reported by platform, never named.

Crawl finished Nov 8, 2026, 10:07 PM UTC · analysed at commit 0406ebe

Open the results as a dashboard

Headline results

  • Median axe-core violations per product page (distinct WCAG A/AA rules failed)

    4

    Middle half of stores (interquartile range): 2–6, n = 60

    How this was counted

    axe-core 4.14.0, tags wcag2a, wcag2aa, wcag21aa, wcag22aa, one product page per store. Median failing elements per product page: 13. Home page median: 3 rules.

  • Stores where keyboard-only traversal could not reach add to cart within 150 Tabs

    9% 3 of 33

    95% Wilson interval: 3%–24%, n = 33

    How this was counted

    Tab only from the top of the page, no Enter, Space or clicks; Escape pressed once if focus was trapped. Counted over product pages with an enabled add-to-cart control named "add to cart/bag/basket" or "buy now". Focus traps among the failures: 1. Not in the denominator: 12 pages where a cookie or sign-up dialog held focus and Escape did not close it, 7 whose add-to-cart button is disabled or hidden until a size is chosen, 8 with no control using that wording, 0 traversal errors.

  • Stores where Tab alone could not reach add to cart, counting a dialog that held focus as blocked

    33% 15 of 45

    95% Wilson interval: 21%–48%, n = 45

    How this was counted

    The same traversal as the row above, but the 12 pages where a cookie or sign-up dialog held focus and Escape did not close it count as blocked instead of being left out: a keyboard or screen-reader user meets that dialog first. Added on 9 November 2026 after the first analysis, from the same crawl; no store was crawled again.

  • Stores with at least one button that has no accessible name (home or product page)

    35% 21 of 60

    95% Wilson interval: 24%–48%, n = 60

    How this was counted

    axe-core rules button-name, input-button-name and aria-command-name. A screen reader announces these as "button" with nothing else.

  • Most common failing rule: color-contrast

    60% of stores (36 of 60)

    95% Wilson interval: 47%–71%, n = 60

    How this was counted

    Elements must meet minimum color contrast ratio thresholds. Counted once per store if it fails on the home, product or cart page; 697 failing elements in total. Tied on store count with target-size (480 elements); ranked first by failing elements.

  • Sampled stores that refused or timed out for an honest, rate-limited, read-only crawler

    24 of 100

    95% Wilson interval: 17%–33%, n = 100

    How this was counted

    Blocked at the home page: 21; at the product page: 3. Also excluded: 0 disallowed by robots.txt, 16 with no product page found from the home page, 0 crawler errors. Blocked stores are left out of every other number.

Not a measurement: a design property

Sightline path: product facts, readback and payment reachable by voice and keyboard on all 60 items; no store UI needed

A design property, not a measurement on these stores: Sightline reads product facts from catalog data, speaks the readback and pays through PayPal, so none of the store pages audited here sit on its path. 60 is the number of stores whose product page was crawled.

By store platform

Accessibility failures and keyboard reach by store platform
PlatformStores sampledProduct page auditedMedian failures, product pageMedian failures, home pageAdd to cart reachable by keyboard
Shopify20203.52.591% of 11 judged
WooCommerce15643.5100% of 4 judged
Magento / Adobe Commerce645.5550% of 2 judged
BigCommerce984.54100% of 4 judged
Salesforce Commerce Cloud15113483% of 6 judged
Custom or other351132100% of 6 judged

The most common failures

  1. color-contrast: Elements must meet minimum color contrast ratio thresholds. Found on 36 stores.
  2. target-size: All touch targets must be 24px large, or leave sufficient space. Found on 36 stores.
  3. link-name: Links must have discernible text. Found on 35 stores.
  4. button-name: Buttons must have discernible text. Found on 20 stores.
  5. image-alt: Images must have alternative text. Found on 15 stores.
  6. nested-interactive: Interactive controls must not be nested. Found on 14 stores.
  7. listitem: <li> elements must be contained in a <ul> or <ol>. Found on 13 stores.
  8. list: <ul> and <ol> must only directly contain <li>, <script> or <template> elements. Found on 12 stores.
  9. meta-viewport: Zooming and scaling must not be disabled. Found on 12 stores.
  10. aria-required-children: Certain ARIA roles must contain particular children. Found on 10 stores.

How Sightline avoids them

Sightline never asks a blind shopper to use the store’s pages, so none of these failures sit on its path: product facts come from structured catalog data, the readback is spoken text, and payment happens through PayPal with a spoken confirmation.

Limits of this measurement

  • Convenience sample: 100 well-known stores selling everyday goods, picked from public knowledge and platform showcase pages, then grouped by the platform their pages actually showed. Not a random sample of all online stores, and platform groups are small, so per-platform numbers are indicative only.
  • Crawled between 2026-11-08 20:14 and 2026-11-08 22:07 UTC from a single location in India with headless Chromium at 1280×900. Stores change their pages often, and geo redirects, currency conversion and consent banners differ by country: several large US retailers answered with a country selector or a global corporate page, which shows up here as no product page found.
  • Stores that timed out or gave no product page on the first pass were crawled once more after product-link discovery was widened (a second category page and flat product URLs). Stores already measured were not crawled again, so a fresh run of the current code can pick different product pages.
  • 24 stores refused or timed out and are excluded, so the measured set leans toward stores without aggressive bot defences.
  • Automated rules catch only part of WCAG. Zero axe violations would not mean a page is accessible; these counts are a floor, not a full audit. No screen reader was run.
  • One product page per store, found from links on the home page (or up to two category pages). It may not represent the rest of the catalogue.
  • Keyboard traversal presses Tab only (plus Escape once when trapped). It never presses Enter, Space or arrow keys, so it does not open menus, choose a size or dismiss dialogs that need a button press. Pages where a consent or sign-up dialog held focus, and pages whose add-to-cart button is disabled or hidden until a size is chosen, are left out of the reachability rate rather than counted as failures.
  • Add to cart is matched by its accessible name in English ("add to cart/bag/basket", "buy now"). Stores that use other wording are counted as having no matching control, not as failures.
  • Visible focus is a heuristic: computed styles of the focused element, its label, parent, next sibling, first child and pseudo-elements are compared focused versus blurred. It misses indicators drawn elsewhere and can count unrelated style changes.
  • Product images, the price region and size or colour selectors are found by heuristics on class names, the main heading and structured data, and can miss or misclassify elements.
  • Cart pages are opened by direct URL only where robots.txt allows: 32 stores had an (empty) cart page audited and 29 were skipped because robots.txt disallows it, so cart numbers are partial. Checkout pages are never opened.
  • The Sightline path line is a design property of the product, not a measurement on these stores.
  • Stores appear only as unsalted 12-character sha256 prefixes of their domain. That keeps names out of the published data but does not stop someone who guesses a domain from confirming it; the per-store rows exist for reproducibility, not for naming stores.

How it was measured

  • Read-only: no add-to-cart clicks, no forms, no accounts, no personal data.
  • robots.txt honoured, one page every five seconds per store, an honest user agent.
  • Automated checks find only part of the barriers people meet; real numbers are worse, not better.
  • The script and the aggregated data are in the repository: evals/barrier/.