How accessibility remediation works, step by step

A Validiscan project runs in five steps: a baseline scan, changes to your shop’s code, a verification scan, the Remediation Evidence Package and, if you want it, regression protection. Nothing reaches your live shop until you, your developer or your agency merge, publish or apply it.

The five steps at a glance

In each step, Validiscan does the work, you have one or two things to do, and something arrives that you can check.

  1. 1

    Baseline scan

    What Validiscan does
    Scans the pages of your shop against WCAG 2.2 AA at desktop and phone size, and works through the manual checks
    What you do
    Give written permission for a full scan
    What you receive
    The list of failures found, each with what it means for your customers
  2. 2

    Changes to your shop’s code

    What Validiscan does
    Fixes what code can fix and reviews every change before it is delivered
    What you do
    Give access to your repository or Shopify theme, or upload a copy of your theme files; then review the changes, and merge, publish or apply them. On Shopify you can preview the theme copy and publish it yourself
    What you receive
    A pull request, an unpublished copy of your theme, or a patch bundle
  3. 3

    Verification scan

    What Validiscan does
    Scans the affected pages again once the changes are live
    What you do
    Put the changes live, then ask for the verification scan
    What you receive
    The findings it no longer finds, marked fixed
  4. 4

    Remediation Evidence Package

    What Validiscan does
    Builds the package from the scans and the manual checks
    What you do
    Read it, and have the draft accessibility statement reviewed
    What you receive
    PDF, DOCX and JSON in a zip with SHA-256 checksums
  5. 5

    Regression protection (optional)

    What Validiscan does
    Re-scans your shop every week and compares it with the verified result
    What you do
    Decide whether you want it
    What you receive
    An email when a re-scan finds a change, and a timeline of every re-scan
Details: what the length of a project depends on, and the five steps in the customer portal

How long a project takes depends mostly on steps 2 and 3: they wait for you or your agency to review the change and put it live. The scans, the review of every change and the package are Validiscan’s work.

The customer portal, where you follow the project, lists the same five steps until the first results arrive. The portal calls step 1 the first scan; this site uses the fixed term baseline scan.

What does Validiscan need from you before the baseline scan?

Validiscan needs three answers before the baseline scan: the shop owner’s written permission for a full scan, how the changes should reach your code, and whether AI may draft fixes of tier ASSISTED. Without a record of that permission, no full scan starts.

  • Permission for a full scan

    Validiscan runs a full scan only after the shop owner has agreed in writing, and records that permission. Without that record, no full scan starts.

  • Access to your code

    One of three ways: access to the GitHub repository that holds your theme, a Theme Access password for your Shopify store, or no access to your systems, in which case your developer uploads a copy of your theme’s files and the changes come back as a patch bundle.

  • Your answer on AI drafting

    AI is used only to draft fixes of tier ASSISTED, and only if you agree. It is off until you do.

Details: the permission, the three ways in, and AI drafting

Validiscan needs three answers before it starts: your permission to scan, how the changes should reach your code, and whether AI may draft some of them.

  • Permission for a full scan. A full scan goes further than the free check: it puts a product in the cart and opens the first checkout step. Validiscan runs it only after the shop owner has agreed in writing. Validiscan records the permission in its system, with the time and the name of the person at Validiscan who recorded it. Without that record, no full scan starts.
  • Access to your code. One of three ways, explained below: access to the GitHub repository that holds your theme, a Theme Access password for your Shopify store, or no access to your systems, in which case your developer uploads a copy of your theme’s files and the changes come back as a patch bundle. That is also the way when your theme is kept somewhere other than GitHub, for example on GitLab or Bitbucket.
  • Your answer on AI drafting. AI is used only to draft fixes of tier ASSISTED, and only if you agree. It is off until you do. How Validiscan handles your data

What happens in the baseline scan?

The baseline scan checks a sample of each type of page in your shop against WCAG 2.2 AA and lists every failure it finds. The scanner runs 102 automated rules. A scan cannot prove everything. Validiscan also works through 35 manual checks, which cover every WCAG criterion that no rule tests.

Automated rules
102
Manual checks
35
Sampled pages, default limit
150
Desktop size, by default
1440 by 900 pixels
Phone size, by default
390 by 844 pixels
Details: which pages, the cart and checkout, the rules and the manual checks

The baseline scan checks the pages of your shop against WCAG 2.2 AA and lists every failure it finds, with what it means for your customers.

The scan loads a sample of each type of page in your shop, among them the home page, product lists, product pages, the cart, the first checkout step, search results, the login page, the contact page and legal pages. How many pages of each type it loads, and the page limit, are set for each shop; by default the limit is 150 sampled pages, and search results, the login page, the contact page, legal pages, the cart and the first checkout step can come on top. By default each page is loaded at desktop size (1440 by 900 pixels) and at phone size (390 by 844 pixels). To reach the cart and the checkout, the scan adds one product to the cart and opens the first checkout step. It never completes a purchase and never enters payment data.

The scanner runs 102 automated rules: axe-core rules and Validiscan’s own checks for problems typical of shops, such as cookie banners, carousels, checkout forms and price updates. A scan cannot prove everything. Validiscan also works through a checklist of 35 manual checks, which covers every WCAG criterion that no rule tests, and records each one as passed, failed or not applicable, with notes.

The method, the standards and the limits of automated testing

How does Validiscan sort the findings?

Validiscan sorts the findings in triage, before anything is delivered. The same failure on many pages is one finding with a count of the pages and elements where it occurs, and each finding has one of three fix tiers: AUTO, ASSISTED or MANUAL.

Each finding has one of three fix tiers:

AUTO
A deterministic recipe changes the theme source: the same code always gets the same change.
ASSISTED
The change needs judgement, for example the name of an icon button. AI may draft it only if you agreed to that, and Validiscan reviews every drafted change before it is delivered.
MANUAL
Guidance only: a content or design decision someone has to make, such as captions for your videos. The work on MANUAL findings that need your own content decisions is not part of a project.
Details: grouped findings and false positives

Before anything is delivered, Validiscan goes through the findings. This is called triage. The same failure on many pages, such as an unnamed button in the header, is one finding with a count of the pages and elements where it occurs. A finding that turns out not to be a failure is marked as a false positive, with a written justification. The Remediation Evidence Package lists these as excluded findings.

Who checks a change before it reaches you?

Validiscan reviews every change before it is delivered, and only changes that passed the automatic validation and that Validiscan approved are delivered. Your developer then reviews the change again, or you preview the theme copy on Shopify. At Validiscan, the person who reviews the changes is William Quaade Rasmussen.

Details: what the validation checks, your developer’s checklist, and who reviews at Validiscan

Validiscan reviews every change before it is delivered: the diff, the result of the automatic validation, and the explanation of what changed and why. The validation checks each changed Liquid, Twig, PHP, HTML, XML, JavaScript or JSON file for errors with a parser or syntax check for its type, and each changed CSS, SCSS or LESS file with a structure check for an unclosed brace, string or comment, which does not compile it; none of these checks runs your theme’s code. Only changes that passed the validation and that Validiscan has approved are delivered. A rejected change gets a written reason and is not delivered.

Your developer then reviews the change again, as an ordinary pull request or patch, or you preview the theme copy on Shopify. The checklist in each pull request asks them to try the branch outside the live shop, check the affected pages, operate the changed elements with the keyboard alone and, where they can, with a screen reader.

At Validiscan, the person who reviews the changes is William Quaade Rasmussen, who runs the company alone. Because the changes are in your code and the package is your file, nothing in your shop depends on Validiscan afterwards; regression protection is cancelled to the end of any month. About Validiscan

How do the changes reach your code?

Validiscan delivers changes in one of three ways: a pull request on GitHub, an unpublished copy of your Shopify theme, or a patch bundle. None of them touches your live shop: you, or your developer, decide what goes live.

The three ways a delivery reaches your code
Way What Validiscan needs What arrives Goes live when
A pull request on GitHub Access to the GitHub repository that holds your theme, through Validiscan’s GitHub App or an access token One pull request against your default branch, from a new branch, with each fix as its own commit You or your developer merge and deploy it
An unpublished copy of your Shopify theme A Theme Access password for your Shopify store A new, unpublished theme in your Shopify admin, named Validiscan A11y <date> You publish it
A patch bundle No access to your systems, but an export of your theme: one zip file of up to 100 MB, uploaded in the customer portal A zip archive for your developer, which Validiscan sends to you You or your developer apply it
What a pull request from Validiscan is made of
Branch
validiscan/a11y-<date>-<id>, for example validiscan/a11y-20260924-9f8e7d6c
Commits
one per fix, with a message of the form fix(a11y): <finding title> (WCAG <criteria>)
Against
your default branch; nothing is pushed to it
Description
a summary table, an explanation of each change and a review checklist

A pull request on GitHub

When your theme is in a GitHub repository, you give Validiscan access to it, through Validiscan’s GitHub App or an access token. Validiscan’s setup specifies the App’s permissions as read and write access to the repository’s contents and pull requests and read access to its metadata, and nothing else. A token needs the same permissions on that one repository. For each delivery, Validiscan:

  1. creates a new branch from your default branch, named validiscan/a11y-<date>-<id>, for example validiscan/a11y-20260924-9f8e7d6c;
  2. commits each fix on its own, with a message of the form fix(a11y): <finding title> (WCAG <criteria>), so each one can be kept or reverted separately;
  3. opens one pull request against your default branch, with a summary table, an explanation of each change and a review checklist.

Nothing is pushed to your default branch. Your developer reviews the pull request, tries the branch in a preview or staging environment and merges it. If you close the pull request without merging it, for example because your default branch has moved on and the pull request no longer merges cleanly, its changes go back to Validiscan’s list for a later delivery, which starts again from your default branch as it is then.

An unpublished copy of your Shopify theme

On Shopify you can instead give Validiscan a Theme Access password for your store. Validiscan downloads your live theme, applies the changes and uploads the result as a new, unpublished theme named Validiscan A11y <date>, for example Validiscan A11y 2026-09-24. Validiscan never uploads to your live theme and never publishes a theme.

You find the copy in your Shopify admin under Online Store, Themes. Preview it, check the affected pages, also with the keyboard alone, and publish it when you are satisfied. Your visitors see your live theme until then. The copy is your live theme as it was on the day of the delivery: if you change the live theme after that, make the same change in the copy before you publish it, or it is lost. Keep your previous theme until you are sure; you can switch back to it.

A patch bundle, and where a theme export comes from

Without access to a repository or a Shopify store, the changes come as a patch bundle: a zip archive for your developer, which Validiscan sends to you. It contains:

  • PATCH.md: what changed and why, per finding, with the exact code change and instructions for applying it;
  • validiscan-a11y.patch: every change in one patch, which applies with git apply;
  • diffs/: the same changes as one patch file per fix, to apply one at a time;
  • files/: the complete changed files, based on your theme export;
  • README.md: what is in the archive and where to start.

The bundle is prepared from an export of your current theme: one zip file of up to 100 MB, uploaded in the customer portal by an admin of your organization, for example your developer. Validiscan then points every change at the exact file and line. Without an export there is no source to change, so no patch bundle can be prepared.

Where a theme export comes from, per platform
Platform How to get the export
Shopify In the Shopify admin, open Online Store, then Themes. In the menu of the theme you use, choose “Download theme file”. Shopify sends the ZIP file by email.
Shopware Your developer makes a ZIP of your theme plugin: its folder under custom/plugins, as it is deployed to your shop.
WooCommerce Your developer makes a ZIP of your theme folder under wp-content/themes, including the child theme if you use one.
Magento Your developer makes a ZIP of your theme folder under app/design/frontend.

Shopify describes the theme download in its help article Downloading themes: the ZIP file goes to the email address of the staff account that asked for it.

What the delivery documents look like

Below is a pull request description exactly as the application writes it, for its fictional test shop Nordlicht Outdoor. Under it, collapsed, are the PATCH.md and README.md of a patch bundle for the same shop. These documents exist in English and in German; inside them, finding titles, the explanations of the changes and the names of WCAG criteria stay in English. The links in the specimens are printed as plain text: in a real delivery they open the finding in Validiscan, behind a login. One more difference: in the PATCH.md specimen every change is shown against the original theme, so its second and third change, both in sections/header.liquid, do not apply one after the other. In a real bundle each patch in diffs/ is made on top of the ones before it, and they apply in numeric order.

Pull request description, as produced for a fictional shop Example data

Accessibility fixes from Validiscan

This pull request fixes 3 accessibility problems that Validiscan found on Nordlicht Outdoor (https://nordlicht-outdoor.example). Every change is an ordinary edit to your theme source: no scripts, no overlays, nothing extra that runs in your visitors’ browsers. Each fix is a separate commit, so you can review, keep or revert them one by one.

Nothing was changed on your live site Validiscan only created this branch and this pull request. Nothing was pushed to your default branch and nothing was deployed to your live site; merging and deploying stay entirely under your control.

Summary

The table scrolls sideways.

# Finding WCAG criterion Impact Files
1 <html> element must have a lang attribute 3.1.1 Language of Page (A) Serious layout/theme.liquid
2 Images must have alternative text 1.1.1 Non-text Content (A) Critical sections/header.liquid
3 Buttons must have discernible text 4.1.2 Name, Role, Value (A) Critical sections/header.liquid

What changed and why

1. <html> element must have a lang attribute
  • WCAG criterion: 3.1.1 Language of Page (A)
  • Impact: Serious
  • Files: layout/theme.liquid (modified, +1 -1)
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

Adds lang="{{ request.locale.iso_code }}" to the <html> element so screen readers pronounce the page in the right language (WCAG 3.1.1).

2. Images must have alternative text
  • WCAG criterion: 1.1.1 Non-text Content (A)
  • Impact: Critical
  • Files: sections/header.liquid (modified, +1 -1)
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

The logo image is the only content of the home link, so it gets the shop name as its alternative text (WCAG 1.1.1).

3. Buttons must have discernible text
  • WCAG criterion: 4.1.2 Name, Role, Value (A)
  • Impact: Critical
  • Files: sections/header.liquid (modified, +1 -1)
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

The icon-only search button gets an accessible name from the theme’s locale file (WCAG 4.1.2).

Not included

One approved fix could not be applied: the affected code has changed since it was prepared, or another fix in this delivery changes the same lines. Validiscan will prepare it again and deliver it separately.

  • Links must have discernible text

Review checklist

  • Read the diff of each commit; the changes are small and limited to the files listed above.
  • Deploy this branch to a preview or staging environment (not to your live shop).
  • Open the affected pages and check that they look and work as before.
  • Operate the changed elements with the keyboard only (Tab, Shift+Tab, Enter, Space, Esc): everything must be reachable and the focus visible.
  • If you can, check the changed elements with a screen reader (for example NVDA or VoiceOver).
  • Merge when you are satisfied. Validiscan then checks the affected pages with a verification scan.

Prepared by Validiscan (validiscan.com) on 24 September 2026 · delivery 9f8e7d6c

PATCH.md of a patch bundle Example data
Show the PATCH.md, with the code change for each finding

Accessibility fixes for Nordlicht Outdoor

Prepared by Validiscan on 24 September 2026 for https://nordlicht-outdoor.example. This document describes 3 source code changes that fix accessibility problems found on Nordlicht Outdoor, with the exact code change for each finding and instructions for applying them.

Nothing was changed on your live site. You or your developer apply the changes, test them and publish them. They are ordinary edits to your theme source: no scripts, no overlays.

Summary

The table scrolls sideways.

# Finding WCAG criterion Impact Files
1 <html> element must have a lang attribute 3.1.1 Language of Page (A) Serious layout/theme.liquid
2 Images must have alternative text 1.1.1 Non-text Content (A) Critical sections/header.liquid
3 Buttons must have discernible text 4.1.2 Name, Role, Value (A) Critical sections/header.liquid

How to apply

With git

Unpack this archive, then run these commands in the root folder of your theme (the folder that contains the paths shown below), replacing path/to/bundle with the folder you unpacked the archive to. The first command only checks that the changes apply; the second applies all of them.

git apply --check path/to/bundle/validiscan-a11y.patch
git apply path/to/bundle/validiscan-a11y.patch

To apply the fixes one at a time instead, apply the files in diffs/ in numeric order with git apply.

Without git

The folder files/ contains the complete modified files, based on the theme export you uploaded. Make a backup of your theme, then copy each file over the file with the same path.

Alternatively, make each change by hand in a code editor, following the sections below.

How to read a change: lines starting with - are removed, lines starting with + are added, and all other lines are unchanged context that helps you find the right place. The line numbers after @@ are approximate if the file has changed in the meantime.

Changes

1. <html> element must have a lang attribute
  • WCAG criterion: 3.1.1 Language of Page (A)
  • Impact: Serious
  • Files: layout/theme.liquid (modified, +1 -1)
  • Patch file: diffs/01-a1b2c3d4.patch
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

Adds lang="{{ request.locale.iso_code }}" to the <html> element so screen readers pronounce the page in the right language (WCAG 3.1.1).

diff --git a/layout/theme.liquid b/layout/theme.liquid
--- a/layout/theme.liquid
+++ b/layout/theme.liquid
@@ -1,5 +1,5 @@
 <!doctype html>
-<html class="no-js">
+<html class="no-js" lang="{{ request.locale.iso_code }}">
   <head>
     <title>{{ page_title }}</title>
   </head>
2. Images must have alternative text
  • WCAG criterion: 1.1.1 Non-text Content (A)
  • Impact: Critical
  • Files: sections/header.liquid (modified, +1 -1)
  • Patch file: diffs/02-b2c3d4e5.patch
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

The logo image is the only content of the home link, so it gets the shop name as its alternative text (WCAG 1.1.1).

diff --git a/sections/header.liquid b/sections/header.liquid
--- a/sections/header.liquid
+++ b/sections/header.liquid
@@ -1,6 +1,6 @@
 <header class="header">
   <a href="/" class="header__heading-link">
-    <img src="{{ 'logo.svg' | asset_url }}" width="120" height="40">
+    <img src="{{ 'logo.svg' | asset_url }}" width="120" height="40" alt="{{ shop.name }}">
   </a>
   <button type="button" class="header__icon header__icon--search">
     <svg class="icon icon-search" aria-hidden="true"></svg>
3. Buttons must have discernible text
  • WCAG criterion: 4.1.2 Name, Role, Value (A)
  • Impact: Critical
  • Files: sections/header.liquid (modified, +1 -1)
  • Patch file: diffs/03-c3d4e5f6.patch
  • Open this finding in Validiscan (screenshots and all affected pages; login required)

The icon-only search button gets an accessible name from the theme’s locale file (WCAG 4.1.2).

diff --git a/sections/header.liquid b/sections/header.liquid
--- a/sections/header.liquid
+++ b/sections/header.liquid
@@ -2,7 +2,7 @@
   <a href="/" class="header__heading-link">
     <img src="{{ 'logo.svg' | asset_url }}" width="120" height="40">
   </a>
-  <button type="button" class="header__icon header__icon--search">
+  <button type="button" class="header__icon header__icon--search" aria-label="{{ 'general.search.search' | t }}">
     <svg class="icon icon-search" aria-hidden="true"></svg>
   </button>
 </header>

Not included

These approved fixes could not be applied to your theme export: the affected code differs from the version they were prepared for, or another fix in this bundle changes the same lines. They are not part of this bundle; Validiscan will prepare them again.

  • Links must have discernible text (sections/header.liquid)

After applying

  1. Test the affected pages in a preview or staging environment before publishing.
  2. Operate the changed elements with the keyboard only: everything must be reachable and the focus visible.
  3. Publish the changes and let us know: Validiscan then checks the affected pages with a verification scan.

Prepared by Validiscan (validiscan.com) on 24 September 2026 · delivery 9f8e7d6c

Questions? Write to info@validiscan.com and mention delivery 9f8e7d6c.

README.md of a patch bundle Example data
Show the README.md, with the archive’s contents

Validiscan accessibility fixes for Nordlicht Outdoor

This archive contains 3 accessibility fixes for your theme, prepared by Validiscan on 24 September 2026. Start with PATCH.md: it explains every change and how to apply it.

Contents

  • PATCH.md: what changed and why, per finding, with the exact code change and instructions
  • validiscan-a11y.patch: every change of this bundle in one patch (unified diff; applies with git apply)
  • diffs/: the same changes as one patch file per fix, to apply one at a time in numeric order
  • files/: the complete modified files, based on your theme export
  • README.md: this file

Quick start

  1. Make a backup of your theme, or work on a copy or a preview theme.
  2. Apply the patches with git apply (see PATCH.md) or copy the files from files/ over your theme.
  3. Test the affected pages, then publish.

Nothing in this archive runs on your site by itself: there are no scripts, widgets or overlays. Every fix is a change to your own theme source.


Prepared by Validiscan (validiscan.com) on 24 September 2026 · delivery 9f8e7d6c

Questions? Write to info@validiscan.com and mention delivery 9f8e7d6c.

How does Validiscan check that the changes work?

A verification scan checks that the changes work once they are live on your shop. A finding with a delivered change that the verification scan no longer finds, on every page where it was last seen, is marked fixed; one that was fixed and shows up again is open again.

Runs
once the changes are live on your shop
Covers
the page types the changes affect and every page where a delivered finding was last seen
Who asks for it
an admin of your organization, in the customer portal, or you, by email to Validiscan
Details: which pages the scan covers, and how to ask for it

Once the changes are live on your shop, a verification scan checks that they work. It covers the page types the changes affect and every page where a delivered finding was last seen. A finding with a delivered change that the verification scan no longer finds, on every page where it was last seen, is marked fixed. A finding that was fixed and shows up again is open again.

What you do: put the changes live, by merging and deploying the pull request, publishing the theme copy or applying the bundle. Then ask for the verification scan: an admin of your organization requests it in the customer portal, or you tell Validiscan by email.

What does the Remediation Evidence Package record?

The Remediation Evidence Package is a dated record of what was tested, what was changed and what the verification scan confirmed. It includes a draft accessibility statement for your shop, marked as a draft for legal review, and says it is not a certificate and does not state legal compliance.

Built from
the baseline scan, the verification scan and the manual checks
Files
PDF, DOCX and JSON in a zip
Checksums
SHA-256
Once finished
does not change; a correction is a new version
Where you get it
the customer portal
Details: what the package is built from, its files and its scope statement

After the verification scan, Validiscan builds the Remediation Evidence Package: a dated record of what was tested, what was changed and what the verification scan confirmed. It is built from the baseline scan, the verification scan and the manual checks. It comes as PDF, DOCX and JSON in a zip with SHA-256 checksums, and includes a draft accessibility statement for your shop, marked as a draft for legal review. A finished package does not change; a correction is a new version. You download it from the customer portal.

Its scope statement says: “Conformance with WCAG 2.1 AA and WCAG 2.2 AA success criteria as evaluated on the listed pages and dates.” It also says: “This package is evidence of an evaluation and of remediation work. It is not a certificate and does not state legal compliance.”

What the Remediation Evidence Package contains

What happens after the project?

Regression protection is the optional last step: Validiscan re-scans your shop every week and compares the result with the verified baseline. A fixed problem that came back, for example after a theme or app update, is open again; fixing what a re-scan finds is not part of regression protection.

Details: what a project covers, when you get an email, and the timeline

A project covers one shop: one domain and one theme. It includes the baseline scan, the manual checks, the AUTO and ASSISTED fixes delivered in one of the three ways above, one verification scan and the Remediation Evidence Package.

Regression protection is the optional last step, billed monthly. Validiscan re-scans your shop every week and compares the result with the verified baseline. Fixed problems can come back, for example after a theme or app update. A problem that came back is open again.

Validiscan sends at most one email per re-scan: when the re-scan found a fixed problem that came back, a new problem, a problem that is no longer found or a change in the pages covered, and when the re-scan could not finish. A re-scan with none of these sends no email, unless you asked Validiscan for one. The customer portal shows every re-scan on a timeline. Fixing what a re-scan finds is not part of regression protection.

How regression protection works

Start with a free check of your shop.

Send your shop’s address. Validiscan scans it and replies with every failure the scan can prove, with the page and the code.

Request a free check

Or write to info@validiscan.com.

What the free check covers, and what it leaves out
You send
your shop’s address
Pages scanned
up to 15
You get
every failure the scan can prove, with the page and the code
On your shop
public pages only; no login, nothing bought, no forms sent
What it is not
a full audit

Write to Validiscan

For a free check, give the address of your shop and its platform.

Validiscan uses what you send to answer you. Privacy notice