Accessibility fix list sheet for web agencies: a WCAG score, the worst problem and a fix date for every client page
What you get: an accessibility fix list in one Google Sheet for every client site you look after, with one row per page: the client, the page, a 0-100 score, how many critical, serious, moderate and minor problems the automated check found, the worst problem in plain English with a one-line fix, an owner, a due date and a re-check date. A summary tab gives each client one line (pages checked, average score, pages with critical problems), which is what you paste into the monthly client report. The example rows and numbers are made up.
The finished sheet
fixlist tab (example rows are made up)
| Client | Page | Score | Critical | Serious | Worst problem | Owner | Due | Status |
|---|---|---|---|---|---|---|---|---|
| Example Dental | /book-appointment | 78 | 1 | 2 | Form fields have no labels | Dev | 1 Nov | Fix this week |
| Example Dental | / | 91 | 0 | 1 | Text colour contrast too low | Designer | 15 Nov | Fix this month |
| Example Bakery | /shop | 84 | 1 | 1 | Images have no alt text | Client | 1 Nov | Fix this week |
| Example Bakery | /contact | 100 | 0 | 0 | Next review |
summary tab (example rows are made up)
| Client | Pages checked | Average score | Pages with a critical problem | Last check |
|---|---|---|---|---|
| Example Dental | 12 | 87 | 2 | 25 Oct 2026 |
| Example Bakery | 8 | 90 | 1 | 25 Oct 2026 |
Who this is for
Small web agencies, freelancers and in-house web teams who look after several sites and want a repeatable monthly accessibility check without paying for a per-site subscription. It also suits teams working for US cities, counties and school districts: the US Department of Justice ADA Title II web rule asks state and local governments to meet WCAG 2.1 Level AA by 26 April 2027 (populations of 50,000 or more) or 26 April 2028 (smaller ones), per ada.gov.
Step 1: the pages tab
Add a tab named pages with A Client and B Page URL in row 1, then one row per page you want checked. Start with the pages that matter most to each client: home, contact, booking or checkout, the top product or service pages, and any form. Use the full address including https://.
Step 2: run the check on every page at once
Open the Website Accessibility Scanner (WCAG 2.1 AA, axe-core) on the Apify Store. It loads each page in a real Chromium browser and runs the open-source axe-core rules for WCAG 2.0 and 2.1 Level A and AA. To build its input from your sheet, put this in any empty cell of a tab named settings, then copy the result into the input's JSON view:
="{""startUrls"": [" & TEXTJOIN(",", TRUE, ARRAYFORMULA(IF(pages!B2:B="", "", "{""url"": """ & TRIM(pages!B2:B) & """}"))) & "], ""maxPages"": " & COUNTA(pages!B2:B) & ", ""respectRobotsTxt"": true}"
maxPagesis set to the number of pages in your list, so the run stops at your list.- Pages that fail to load or are blocked by robots.txt are reported in the results and, per the Store listing, are not charged.
When the run finishes, export the dataset as CSV and import it into the same Google Sheet (File → Import → Upload, "Insert new sheet"). Name the tab results. Apify's CSV export turns nested fields into columns with slashes in their names, such as byImpact/critical and issues/0/help. Issues are listed worst first, so issues/0/… is the most serious problem on that page.
Step 3: the fixlist tab
Add a tab named fixlist with these headers: A Client, B Page, C Score, D Critical, E Serious, F Moderate, G Minor, H Worst problem, I How to fix, J Owner, K Due, L Re-check, M Status. Put =pages!A2:B in A2 to pull the list across. CSV column positions can change between runs, so each column is looked up by its header name. In C2 put the score, then copy the same formula to the other columns, changing only the header text in quotes:
=IF($B2="", "", IFERROR(INDEX(results!A:ZZ, MATCH($B2, INDEX(results!A:ZZ, 0, MATCH("url", results!1:1, 0)), 0), MATCH("score", results!1:1, 0)), "not checked"))
- D2: same formula with
"byImpact/critical"; E2"byImpact/serious"; F2"byImpact/moderate"; G2"byImpact/minor". - H2:
"issues/0/help"(the problem in plain English). I2:"issues/0/howToFix"(the one-line fix). - If a page shows
not checked, its address inpagesdiffers from theurlthe scanner reported (often a trailing slash or a redirect). Copy the reported address intopages.
Status in M2, a working rule of ours rather than any legal standard (change it to suit your clients):
=IF($B2="", "", IF(D2="not checked", "Check address", IF(D2>0, "Fix this week", IF(E2>0, "Fix this month", "Next review"))))
Due date in K2: =IF(M2="Fix this week", TODAY()+7, IF(M2="Fix this month", TODAY()+30, "")). Re-check in L2: =IF(K2="", "", K2+1). Fill J Owner by hand: dev, designer, content writer or the client.
The score comes from the scanner: 100 minus 10 for each critical rule failed, 6 for each serious, 3 for each moderate and 1 for each minor, never below 0. It is a way to sort pages, not a compliance grade.
Step 4: the summary tab
Put the client names in column A (=UNIQUE(FILTER(pages!A2:A, pages!A2:A<>"")) in A2), then:
- Pages checked, B2:
=COUNTIFS(fixlist!A:A, A2, fixlist!C:C, ">=0") - Average score, C2:
=IFERROR(ROUND(AVERAGEIFS(fixlist!C:C, fixlist!A:A, A2)), "") - Pages with a critical problem, D2:
=COUNTIFS(fixlist!A:A, A2, fixlist!D:D, ">0") - Last check, E2: type the run date.
Step 5: re-check after fixes
Before the next run, copy the fixlist score column into a new column headed with today's date (paste values only). Run the same input again, import the new CSV over the results tab, and the score column updates. The dated columns show each client their progress month by month.
A note you can send each client
Hi, this month's accessibility check covered [pages] pages on your site. Average score: [score]/100. [n] pages have a problem we rate as critical, mostly [worst problem]. We plan to fix these by [date] and re-check on [date]. This is an automated check: it finds common problems but does not certify the site as accessible, so we also do a short keyboard-only test on your booking and contact pages.
What an automated check cannot tell you
Automated rules catch only part of WCAG. Keyboard navigation order, whether a screen reader announces things in a way that makes sense, captions and transcripts, and PDFs need a person to review them. A clean score does not make a site "ADA compliant", does not certify WCAG conformance and does not prevent complaints. For the official success criteria, see the W3C WCAG 2.1 quick reference.
Related
- How to run the accessibility scanner
- Page title and meta description check sheet for small business websites
- Client website contact check for web agencies
- Unadhi accessibility guides
Questions
Does a score of 100 mean the page is accessible?
No. It means none of the automated rules failed on that page. Keyboard use, screen-reader meaning, captions and documents still need a manual review.
How many pages should I check per client?
Start with the pages people must use to become customers: home, contact, booking or checkout and any form. Add the top content pages once those are clean.
Can I use this sheet with a different scanner?
Yes. Change the header names in quotes in the Step 3 formulas to match the columns your scanner exports.
Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received. Join the partner waitlist
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.