ADA Audit Pro

Sample accessibility audit report

This is what you get from a manual audit: every issue explained, ranked, matched to the WCAG criterion it breaks, and paired with a fix your developers can use.

Download the sample spreadsheet (Excel)Download the full report (PDF, 17 pages)

Report overview

Audit details
Site testedExample Goods (fictional online store)
Pages in scopeHome, collection, product, cart and checkout
StandardWCAG 2.2 Level AA, which covers the requirements of the ADA and Section 508
MethodsKeyboard-only testing; NVDA and JAWS on Windows; VoiceOver on macOS and iOS; TalkBack on Android; zoom to 400%; contrast checks. Automated tools (axe, WAVE) are a starting point, and every finding is confirmed by hand.
Delivered asAn Excel spreadsheet your team can filter by page, severity or WCAG criterion
Tested byRohit, DHS Trusted Tester (Section 508)

Findings by severity

6High
5Medium
2Low
  • High: prevents or seriously hinders someone from completing a key task, such as buying.
  • Medium: causes difficulty or confusion, but a workaround exists.
  • Low: a small inconvenience or best-practice improvement.

All 13 findings at a glance

All findings, with severity, page, WCAG conformance level and success criterion
IDIssueSeverityPageWCAG levelWCAG criterion
A-01Size options cannot be selected with the keyboardHighProduct pageA2.1.1
A-02Cart confirmation message is not announcedHighProduct page, cartAA4.1.3
A-03Focus does not move into the mini-cart drawerHighCart drawerA2.4.3
A-04Icon-only buttons have no accessible nameHighAll pagesA4.1.2
A-05Checkout errors are not linked to their form fieldsHighCheckoutA3.3.1, 1.3.1
A-06Focus outline removed from links and buttonsHighAll pagesAA2.4.7
A-07Main navigation links are not marked up as a listMediumAll pagesA1.3.1
A-08Current page is not identified in the navigationMediumAll pagesA4.1.2
A-09Sale price text has insufficient color contrastMediumCollection and product pagesAA1.4.3
A-10Active slide is not identified in the carousel indicatorsMediumHome pageA4.1.2
A-11Selected filter is not identified programmaticallyMediumCollection pageA4.1.2
A-12Redundant alternative text on product imagesLowCollection pageBest practice1.1.1 (related)
A-13Footer headings skip a heading levelLowAll pages (footer)A1.3.1

The next section shows six of these in full. The PDF report documents all 13, one per page. The Excel file has all 13 in the same columns as a real findings spreadsheet: Page, Issue, Screenshot, Actual Result, Expected Result / Remediation, Severity, WCAG Conformance Level, WCAG Success Criteria and Comments.

Six findings in detail

A-01: Size options cannot be selected with the keyboard

Severity
High
Page
Product page
WCAG conformance level
A
WCAG success criterion
2.1.1
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

Interactive controls must be operable with a keyboard alone. Custom controls built from non-interactive elements are invisible to the keyboard unless they are given the right role and behavior. When a required choice, such as a product size, cannot be made without a mouse, the whole purchase is blocked.

Steps to reproduce

  1. Open any product page in a desktop browser.
  2. Press Tab repeatedly, starting from the product title.
  3. Observe that focus moves from the image gallery straight to the Add to cart button. The size options (S, M, L and XL) are never reached.
  4. Press Enter or Space while the size area is visible: no size is selected.

Actual behavior

The size options (S, M, L and XL) are styled div elements with mouse click handlers only. They are not in the tab order, and pressing Enter or Space has no effect. As a result, people who navigate with a keyboard, a switch device or voice control cannot choose a size and cannot complete a purchase.

Expected behavior / remediation

All options of a product should be selectable with the keyboard and announced with their name, role and state.

  1. Use native radio buttons grouped in a fieldset with a legend, instead of styled div elements.
  2. Style the radio buttons with CSS so the visual design stays the same.
<fieldset>
  <legend>Size</legend>
  <input type="radio" id="size-s" name="size" value="S">
  <label for="size-s">S</label>
  <input type="radio" id="size-m" name="size" value="M">
  <label for="size-m">M</label>
</fieldset>

Comments

Affects people using keyboards, switch devices, voice control and screen readers. To confirm the fix, tab to the group and choose with the arrow keys. A screen reader should announce "Size, M, radio button, 2 of 4, selected".

A-02: Cart confirmation message is not announced

Severity
High
Page
Product page, cart
WCAG conformance level
AA
WCAG success criterion
4.1.3
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

When a page changes after an action, such as an item being added to a cart, people who cannot see the change need it announced. Status messages should be exposed programmatically so assistive technologies can announce them without moving focus.

Steps to reproduce

  1. Turn on a screen reader (NVDA on Windows or VoiceOver on macOS).
  2. On a product page, choose a size and activate Add to cart.
  3. Observe that the cart count and the on-screen notice change, but the screen reader announces nothing.

Actual behavior

After "Add to cart" is activated, the cart count changes and a notice reading "Linen overshirt added to cart" appears on screen, but the notice is inserted into the page without a status role. As a result, screen reader users receive no confirmation and cannot tell whether the item was added.

Expected behavior / remediation

Status messages should be announced by assistive technologies without moving keyboard focus.

  1. Add an empty container with role="status" to the page when it loads.
  2. Write the confirmation text into that container after the item is added. The container must already exist, or many screen readers will not announce the text.
<div id="cart-status" role="status"></div>

<script>
  document.getElementById("cart-status").textContent =
    "Linen overshirt added to cart. Your cart has 2 items.";
</script>

Comments

Affects people using screen readers. To confirm the fix, turn on NVDA or VoiceOver, add an item and listen for the message.

A-05: Checkout errors are not linked to their form fields

Severity
High
Page
Checkout
WCAG conformance level
A
WCAG success criterion
3.3.1, 1.3.1
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

Form errors must be identified in text and connected to the field they belong to, so that people using assistive technologies know that an error occurred, where it is and how to fix it.

Steps to reproduce

  1. Add an item to the cart and go to checkout.
  2. Leave the Email field empty and activate Continue to shipping.
  3. Observe the red message under the field. A screen reader announces nothing, and focus stays on the button.

Actual behavior

When the email field is left empty, a red message appears under it, but the message is not connected to the field and focus stays on the button. As a result, screen reader users are not told that an error occurred or which field it relates to.

Expected behavior / remediation

Errors should be identified in text, connected to the field they belong to, and announced to assistive technologies.

  1. Add aria-invalid="true" to each field in error.
  2. Connect the error message to its field with aria-describedby.
  3. Move focus to an error summary at the top of the form that links to each problem.
<label for="email">Email</label>
<input id="email" type="email"
       aria-invalid="true"
       aria-describedby="email-error">
<p id="email-error">
  Enter your email address, for example name@example.com.
</p>

Comments

Affects people using screen readers and people with cognitive or learning disabilities. To confirm the fix, submit the empty form. Focus should move to the summary, and each field should be announced as invalid with its message.

A-08: Current page is not identified in the navigation

Severity
Medium
Page
All pages
WCAG conformance level
A
WCAG success criterion
4.1.2
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

Navigation should tell people using assistive technologies which page they are on. A visual highlight alone is not available to people who cannot see it.

Steps to reproduce

  1. Open the Shop page.
  2. Inspect the Shop link in the main navigation.
  3. Observe that it is styled in bold but has no aria-current attribute, and that a screen reader does not announce it as the current page.

Actual behavior

The link for the current page is shown in bold, but no attribute identifies it as current. As a result, screen reader users are not told which page they are on.

Expected behavior / remediation

The current state of the active link should be defined programmatically and announced.

  1. Add aria-current="page" to the link of the current page.
  2. Make sure the attribute moves to the right link on every page.
<a href="/shop/" aria-current="page">Shop</a>

Comments

Affects people using screen readers. To confirm the fix, tab to the link and listen for "current page".

A-10: Active slide is not identified in the carousel indicators

Severity
Medium
Page
Home page
WCAG conformance level
A
WCAG success criterion
4.1.2
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

Carousel controls must have accessible names, and the currently active slide must be identifiable by people who cannot see the visual indicator.

Steps to reproduce

  1. Open the home page and tab to the carousel indicators.
  2. With a screen reader running, move through the five dots.
  3. Observe that each is announced as "button", with no name and no indication of which slide is active.

Actual behavior

The five round indicators under the homepage carousel are button elements with no text. The active slide is shown only by a filled dot. As a result, screen reader users hear "button" five times and cannot tell which slide is active.

Expected behavior / remediation

Each indicator should have an accessible name, and the active one should be identified programmatically.

  1. Give each button a name, such as aria-label="Go to slide 2 of 5".
  2. Add aria-current="true" to the active indicator, and update it when the slide changes.
<button type="button" aria-label="Go to slide 1 of 5" aria-current="true"></button>
<button type="button" aria-label="Go to slide 2 of 5"></button>

Comments

Affects people using screen readers. Note: aria-selected is only valid on elements with the tab, option, row or gridcell role, so it should not be added to plain buttons. If the indicators follow the tabs pattern, use role="tablist", role="tab" and aria-selected instead.

A-12: Redundant alternative text on product images

Severity
Low
Page
Collection page
WCAG conformance level
Best practice
WCAG success criterion
1.1.1 (related)
ScreenshotAn annotated screenshot of this issue is added here in a real report, based on the client's website.

Issue description

Images that only repeat adjacent text add noise for screen reader users. Decorative or redundant images should be hidden from assistive technologies by giving them an empty alt attribute.

Steps to reproduce

  1. Open a collection page and listen to a product card with a screen reader.
  2. Observe that the product name is read twice: once from the image alt text and once from the link text.

Actual behavior

Each product image has alt text that repeats the product name shown in the adjacent visible link (for example alt="Linen overshirt" beside the link "Linen overshirt"). As a result, screen reader users hear the same name twice.

Expected behavior / remediation

Images that only repeat adjacent text should be ignored by assistive technologies.

  1. Set the alt attribute to an empty string on images that repeat adjacent text.
  2. Alternatively, place the image and the text inside the same link.
<a href="/shop/linen-overshirt/">
  <img src="overshirt.jpg" alt="">
  Linen overshirt
</a>

Comments

A small annoyance rather than a barrier. To confirm the fix, listen to a product card with a screen reader and check that the name is read once.

What's in a full audit

  • A findings spreadsheet your team can filter by page, severity or WCAG criterion
  • For every issue: a screenshot of your site, the issue description, steps to reproduce, the actual and expected behavior with a code-level fix, the severity, and the WCAG level and criterion
  • A walkthrough call with your developers
  • A free retest after your fixes

See what a report would say about your site.

I'll test your homepage by hand and send you a free one-page report on the top 3 barriers I find, with a plain-English fix for each.