Back to home

How we test

AccessifyAI checks a Shopify store against a fixed set of rules. This page lists every rule, the WCAG 2.2 success criterion it reports under, how it counts in the score, and what it cannot see. It is written for developers, agencies and anyone deciding how far to rely on a scan.

Last updated:

The scan tests 15 of the 55 WCAG 2.2 Level A and AA success criteria, several of them only in part, and reports two AAA suggestions that never lower the score. Its results describe what the rules found on the pages the scan reached. They are not a statement of WCAG conformance or of compliance with the ADA, the EAA or the BFSG.

What the scanner reads

The scanner requests each page over HTTP, the way a new visitor’s browser would, and checks the HTML the store sends with rules written for Shopify themes. It does not run JavaScript and does not render the page. It sees the markup your theme outputs, not what scripts change after the page loads.

It starts at the address you give it and follows links within the same store. The free scan on this website reads 1 page. In the app, a scan reads up to 10 pages on Free, 50 on Basic and 500 on Pro. It skips feeds, files, account pages and policy pages.

A new visitor has an empty cart and is not logged in, so the scanner sees the empty cart, the empty cart drawer and the logged-out header. For a store behind a password page, the app can use the storefront password you enter.

Content that a browser does not render or that is hidden from assistive technology is skipped by most rules, because a screen reader does not read it either: noscript and template content, elements with the hidden attribute, inline display:none or visibility:hidden, and aria-hidden subtrees. Three rules look at hidden elements on purpose: autoplaying sound, duplicate ids and focusable elements marked aria-hidden.

The criteria and the rules behind them

Each criterion links to the W3C explanation. The paragraph under it says which part the rules reach. Rule names are the ones the dashboard shows, followed by the severity.

1.1.1 Non-text content

Level A. W3C explanation: 1.1.1

Checks that images and icons have a text alternative and that the alternative is not a filename or a placeholder word. Whether the text describes the image correctly, or whether an image is decorative, needs a person.

  • Photo has no description (critical)An img element with no alt attribute. Images marked decorative (role="presentation", role="none" or aria-hidden="true") and hidden images are skipped; alt="" counts as decorative.
  • Photo description is just a filename (major)An alt text that is only "image", "photo", "picture", "img" or "untitled", or that ends in .jpg, .jpeg, .png, .gif, .webp or .svg.
  • Photo description is too long (minor)An alt text longer than 125 characters.
  • Icon has no description (minor)An svg element outside any link, button or named control, not marked aria-hidden="true" or role="presentation", with no aria-label, aria-labelledby or title. A decorative icon only needs aria-hidden="true".

1.3.1 Info and relationships

Level A. W3C explanation: 1.3.1

Checks headings, form labels and the main and navigation landmarks in the markup. Tables, lists, visual grouping and reading order are not checked.

  • Page has no main headline (major)A page with headings but no h1.
  • Page has more than one main headline (minor)More than one visible h1 on a page. Reported once per page.
  • Headings jump out of order (major)A heading more than one level below the one before it, for example an h4 straight after an h2.
  • Blank headline in your page (major)A visible heading with no text, aria-label, aria-labelledby, image alt or svg title inside it.
  • Form field with no label (critical)An input (other than hidden, submit, button, reset or image) with no label element, wrapping label, aria-label, aria-labelledby or title. A placeholder alone does not count.
  • Comment box with no label (critical)A textarea with no label, aria-label, aria-labelledby or title.
  • Dropdown with no label (critical)A select with no label, aria-label, aria-labelledby or title. The name attribute is not a label.
  • No main content marker (major)A full page (title, header or main candidate, closing body tag) with no main element and no role="main".
  • Menu not marked as navigation (minor)A full page with a list or header holding three or more links, and no nav element or role="navigation" anywhere.

1.4.2 Audio control

Level A. W3C explanation: 1.4.2

Checks video and audio elements that autoplay. Sound started by a script or an embedded player is not seen.

  • Video plays sound on load (critical)A video or audio element with autoplay and neither muted nor controls. Hidden players count, because their sound still plays.

1.4.3 Contrast (minimum)

Level AA. W3C explanation: 1.4.3

Checks text whose colour and background are both set in the element’s own style attribute. Colours from the theme’s stylesheets, CSS variables, gradients and text on images are not measured, so most contrast problems in a theme need a contrast checker and a person.

  • Text is too faint to read (critical below 3:1, major otherwise)Text whose inline colour and background give a ratio below 4.5:1, or below 3:1 for large text (24px, or 18.66px bold; h1 to h3 use browser default sizes). Critical below 3:1, major otherwise.

1.4.4 Resize text

Level AA. W3C explanation: 1.4.4

Checks the viewport meta tag for settings that block pinch zoom. Whether the page still works at 200% needs a person.

  • Customers can not pinch-zoom your store (critical)A viewport meta tag with user-scalable=no or 0, or maximum-scale below 2.

2.4.1 Bypass blocks

Level A. W3C explanation: 2.4.1

Checks for a skip link to the main content on pages with a header or navigation, and for titles on embedded frames.

  • No skip menu shortcut (major)A page with a navigation or header links where none of the first ten in-page links points at the main content.
  • Embedded content has no label (critical)A visible iframe with no title or an empty one.

2.4.2 Page titled

Level A. W3C explanation: 2.4.2

Checks that the page has a non-empty title element. Whether the title describes the page needs a person.

  • Browser tab has no title (critical)A page with no title element, or an empty one.

2.4.3 Focus order

Level A. W3C explanation: 2.4.3

Checks for positive tabindex values, which reorder the Tab sequence. Whether focus moves in a sensible order, including into menus, drawers and dialogs, needs a keyboard test.

  • Tab order is scrambled (major)A rendered element with a tabindex above 0.

2.4.4 Link purpose (in context)

Level A. W3C explanation: 2.4.4

Checks for links with no accessible name at all. Whether a named link says where it goes needs a person.

  • Link with no text (critical)A link with no text, aria-label, aria-labelledby or title, and no image alt, labelled child or svg title inside.

2.4.11 Focus not obscured (minimum)

Level AA, new in WCAG 2.2. W3C explanation: 2.4.11

Flags fixed or sticky elements pinned near the top of the page as worth checking. Whether they cover a focused element needs a keyboard test with scrolling.

  • Sticky header may cover a focused field, worth checking by hand (minor)An element whose style attribute sets position fixed or sticky with top between 0 and 80px.
  • Sticky element hides focus (minor)A rule in a style block on the page with the same fixed or sticky position near the top. Linked stylesheet files are not read.

2.5.8 Target size (minimum)

Level AA, new in WCAG 2.2. W3C explanation: 2.5.8

Measures controls whose width and height are set in pixels in their own style attribute. Sizes from stylesheets are not measured.

  • Button too small to tap (major)A button, link, input or element with a button-like role whose inline width and height, plus padding and border, are under 24 by 24 CSS pixels. Plain links inside a paragraph or list item are exempt.

3.1.1 Language of page

Level A. W3C explanation: 3.1.1

Checks that the html element has a lang attribute. Whether the value matches the page language needs a person.

  • Page language not set (critical)An html element with no lang attribute.

3.2.1 On focus

Level A. W3C explanation: 3.2.1

Checks for elements that take focus when the page loads. Changes a script makes when something receives focus are not seen.

  • Page grabs focus on load (minor)A rendered element with the autofocus attribute.

3.3.8 Accessible authentication (minimum)

Level AA, new in WCAG 2.2. W3C explanation: 3.3.8

Detects reCAPTCHA and hCaptcha widgets inside a login or account form. Other puzzles, and whether an alternative exists, need a person.

  • CAPTCHA blocks some customers (major)A reCAPTCHA or hCaptcha widget inside a form with a password field or a login, sign-in or account name. CAPTCHAs on contact, newsletter and review forms are not reported.

4.1.2 Name, role, value

Level A. W3C explanation: 4.1.2

Checks names on buttons, button inputs and frames, clickable elements without a role, ARIA references, hidden focusable elements and duplicate ids. Custom widgets built with ARIA roles, and states such as expanded or checked, are not checked.

  • Embedded content has no label (critical)A visible iframe with no title or an empty one.
  • Button with no text (critical)A button element with no text, aria-label, aria-labelledby or title, and no image alt or svg title inside.
  • Clickable element not marked as clickable (critical)A div or span with an onclick attribute and no role. Click handlers added by a script are not seen.
  • Broken accessibility wiring (major)An aria-labelledby or aria-describedby that points to an id missing from the page. Reported once per missing id.
  • Hidden element you can still tab to (critical)A focusable element (link with href, button, form field or tabindex 0 or higher) that itself carries aria-hidden="true". Disabled elements and a negative tabindex are exempt.
  • Search or submit button with no label (critical)An input of type button, image, submit or reset with no usable name. Submit and reset without a value attribute get the browser’s default name and pass.
  • Two elements share the same ID (major)The same id on more than one element, hidden ones included, because labels and ARIA references then resolve to the wrong one. Reported once per id.

Two AAA suggestions

These findings appear in the report as suggestions. They are Level AAA, which the EAA and the BFSG do not require, and they do not change the score.

2.4.9 Link purpose (link only)

Level AAA. W3C explanation: 2.4.9

A link text such as "Read more" is reported as a suggestion. In context, inside a card whose heading names the article, it can still pass 2.4.4.

  • Generic link text like Click here or Read more (minor)A link whose whole name is "click here", "here", "read more", "more", "link" or "learn more". AAA suggestion, not counted in the score.

3.2.5 Change on request

Level AAA. W3C explanation: 3.2.5

A link that opens a new tab without saying so is reported as a suggestion.

  • Link opens a new tab silently (AAA) (minor)A link with target="_blank" and no "new window" or "new tab" text or visually hidden note. AAA suggestion, not counted in the score.

Severity and the score

Each rule has a fixed severity, listed above. The score starts at 100, and each rule that fails deducts 10 points if critical, 5 if major and 1 if minor, once. Each further element the same rule fails on adds 20% of that, up to 2 times the rule's points more, so one rule never takes more than 3 times its points and one template habit, such as a duplicated ID, cannot empty the score on its own. The same rule on the same element on many pages counts once, because it is one fix in one template. The score goes down to 0 at most, and AAA suggestions deduct nothing. This rule applies since 30 September 2026; earlier scans were recalculated with it.

The dashboard leads with how many of the 15 tested criteria have no open finding, and shows the score below it.

The score summarises what this scan found on the pages it reached. It is not a share of WCAG, and 100 does not mean that a store conforms to WCAG or meets any law.

Scheduled scans compare each result with the one before. A drop of more than 5 points, or a new critical finding, is reported as a regression.

Known limits

  • No JavaScript. Drawers, dialogs, filters, variant pickers and anything a script builds are checked only as far as their markup is in the page source. Focus movement, keyboard traps and live announcements are not tested.
  • No rendering. Contrast and target size are measured only from inline style attributes. Colours and sizes from the theme’s stylesheet files, hover and focus states, and layouts at different screen widths are not seen.
  • Markup, not meaning. The rules check that names, labels and alt texts exist and are not placeholders. They do not check that they are right.
  • Custom widgets. ARIA roles such as radio, tab, listbox or menu, and states such as aria-expanded or aria-checked, are not validated.
  • Pages and states not reached. Pages beyond the plan’s limit, pages behind a customer login, a filled cart and error messages that appear after submitting a form are not scanned.
  • Embedded frames. Content inside iframes, such as videos, maps and some app widgets, is not scanned. Only the frame’s title is checked.
  • Mistakes. When a rule cannot tell a barrier from correct markup, it is written to stay quiet rather than guess. It can still be wrong in both directions.

What always needs a person

The dashboard lists six checks next to the score that a scan cannot make. They are chosen for what Shopify stores get wrong most often:

  • Whether each alt text says why the image is there, not only what it shows
  • Browsing, adding to cart and checking out with the keyboard alone, with focus always visible
  • Contrast of text placed on photos and banners, and of hover and focus states
  • Captions and transcripts for video and audio
  • Pages at 400% zoom and on a narrow phone screen, without sideways scrolling
  • Form error messages: clear, next to the field, and saying how to fix it

Beyond those, the other WCAG 2.2 A and AA criteria are not tested at all. Several of them decide whether a shopper can buy: keyboard access and keyboard traps (2.1.1, 2.1.2), visible focus (2.4.7), reflow at narrow widths (1.4.10), contrast of controls and focus indicators (1.4.11), error messages (3.3.1) and status messages such as cart updates (4.1.3). A person with a keyboard and a screen reader finds these.

AI alt text drafts

On Basic and Pro the app can draft alt text for product images. A draft is a suggestion: you read it, edit it and apply it, and the text it replaces is kept. Nothing is written to your store until you apply it.

On Basic the draft is written from the product’s title and description, without looking at the photo. On Pro the photo itself goes to the model, so the draft describes what the image shows. Drafts are limited to 125 characters.

The AI does not know why an image is on the page, what the shopper needs from it, or whether it is decorative. That judgement stays on the manual list above.

The privacy policy lists which services process this data.

Change log

  • The score counts each failing rule once, with a capped share for each further element it fails on, so one template habit such as a duplicated ID no longer empties the score. Earlier scans were recalculated with the same rule.
  • This page published, with every rule, its criterion, severity and limits.
  • The dashboard now leads with how many of the 15 tested criteria pass, marks the three criteria new in WCAG 2.2, lists the checks that need a person, and calls AI alt text a draft.
  • A scan that reaches no pages now says why: password page, wrong password or store unreachable. When the plan’s page limit stops a scan, the report says at least how many pages were left unread.
  • One alt text length limit, 125 characters, for the scanner, the generator and the editor.
  • False positives removed, each reproduced before the fix: "Read more" links moved from 2.4.4 (A) to a 2.4.9 (AAA) suggestion; bare icons lowered from critical to minor; contrast values from color-mix() and similar functions skipped instead of misread; rem, em and default heading sizes used for the large-text threshold; padding and border counted in target size; disabled hidden controls, textareas with a title and fixed footers no longer flagged; the navigation landmark rule limited to pages that have a menu.
  • Content inside noscript and under hidden ancestors no longer produces findings. A logo image with alt text counts as heading text. Submit buttons without a value attribute pass with the browser’s default name. Skip link detection checks the first ten in-page links, and only on pages with something to skip. A broken ARIA reference repeated in every product card is reported once. The zoom rule catches maximum-scale=1 at the end of the tag and user-scalable=0. Stores that redirect to another host are crawled past the first page.

Questions and corrections

If a rule reports something that is not a barrier, or misses one it should catch, write to us with the page address and the finding. Changes to rules are listed in the log above.

support@accessifyai.de

The free scan on the home page reads one page and shows the findings from these rules. Run the free scan

How we test: accessibility scanner rules, WCAG mapping and limits | AccessifyAI