The Definitive Resource

The Complete WCAG 2.1 Remediation Guide

We're sharing this knowledge openly because accessible websites benefit everyone. This guide covers all 28 WCAG 2.1 Level AA checks our scanner runs — with real-world impact, before-and-after code, fix time estimates, and platform-specific guidance.

28 WCAG Checks
1,100+ Sites Scanned
Real WV Data

Quick Reference: All 28 Checks at a Glance

Click any row to jump to the detailed remediation guidance below.

IssueWCAGSeverityPrevalenceFix Time
Language of Page3.1.1Error92% of WV entities2 minutes
Non-text Content1.1.1Error92% of WV entities1–4 hours depending on image count
Info and Relationships1.3.1Info83% of WV entities30–60 minutes
Info and Relationships1.3.1Info83% of WV entities15–30 minutes
Page Titled2.4.2Error45% of WV entities5 minutes per page
Info and Relationships1.3.1Error67% of WV entities15–30 minutes
Info and Relationships1.3.1Error40% of WV entities10–20 minutes per table
Link Purpose (In Context)2.4.4Warning67% of WV entities30–60 minutes
Bypass Blocks2.4.1Warning58% of WV entities15 minutes
Contrast (Minimum)1.4.3Error35% of WV entities1–2 hours
Focus Visible2.4.7Warning30% of WV entities15–30 minutes
Parsing4.1.1Info25% of WV entities30–60 minutes
Resize Text1.4.4Warning20% of WV entities2 minutes
Name, Role, Value4.1.2Error20% of WV entities30–60 minutes
Error Identification3.3.1Warning40% of WV entities20–40 minutes
Error Suggestion3.3.3Warning35% of WV entities15–30 minutes
Identify Input Purpose1.3.5Info60% of WV entities10 minutes
Label in Name2.5.3Warning15% of WV entities10–20 minutes
Status Messages4.1.3Warning25% of WV entities10–15 minutes
Pointer Cancellation2.5.2Warning10% of WV entities15–30 minutes
Timing Adjustable2.2.1Warning5% of WV entities5 minutes
Captions (Prerecorded)1.2.2Error8% of WV entities1–2 hours per video
Audio Description1.2.5Info5% of WV entities2–4 hours per video
Audio Control1.4.2Warning5% of WV entities5 minutes
Orientation1.3.4Warning3% of WV entities2 minutes
Reflow1.4.10Warning15% of WV entities1–2 hours
Text Spacing1.4.12Warning10% of WV entities30 minutes
Language of Parts3.1.2Info5% of WV entities5–10 minutes

Fix First

Found on 80%+ of WV government sites. These are one-line or template-level fixes that instantly improve accessibility for every page.

Error Language of Page WCAG 3.1.1 92% of WV entities 2 minutes

Why it matters

Screen readers need the lang attribute to pronounce content correctly. Without it, a screen reader may use the wrong language profile, making the content unintelligible to users who rely on assistive technology.

How to fix it

Add a lang attribute to the opening <html> tag with the appropriate language code. Use "en" for English. This is typically a one-line change in your site's master template.

Before (inaccessible)
<html>
  <head>...</head>
  <body>...</body>
</html>
After (accessible)
<html lang="en">
  <head>...</head>
  <body>...</body>
</html>
Platform-specific notes:

CivicPlus: Edit the master page template. WordPress: Most themes include this automatically — check your theme's header.php. Drupal: Set in /admin/config/regional/language.

Error Non-text Content WCAG 1.1.1 92% of WV entities 1–4 hours depending on image count

Why it matters

Images without alt text are invisible to screen reader users. The alt attribute provides a text alternative that describes the image content or function. For decorative images, use an empty alt="" to tell screen readers to skip them.

How to fix it

Add an alt attribute to every <img> element. For informative images, write a concise description. For decorative images (borders, spacers), use alt="" (empty string). For functional images (icons in buttons), describe the action.

Before (inaccessible)
<!-- Missing alt attribute -->
<img src="governor.jpg">

<!-- Decorative image without empty alt -->
<img src="divider.png">
After (accessible)
<!-- Informative image -->
<img src="governor.jpg" alt="Governor signing House Bill 1234">

<!-- Decorative image -->
<img src="divider.png" alt="">

<!-- Functional image in a link -->
<a href="/search">
  <img src="search-icon.svg" alt="Search">
</a>
Platform-specific notes:

CivicPlus: Use the image properties dialog in the WYSIWYG editor. WordPress: Fill in the 'Alt Text' field in the Media Library. All platforms: Audit existing content with our scanner to find every missing alt.

Info Info and Relationships WCAG 1.3.1 83% of WV entities 30–60 minutes

Why it matters

Screen reader users navigate pages by jumping between headings. When heading levels are skipped (e.g., h1 directly to h3), users lose the logical structure and may think they missed a section.

How to fix it

Ensure heading levels are sequential. Start with a single h1 for the page title, then h2 for major sections, h3 for subsections. Don't use heading tags for visual styling — use CSS instead.

Before (inaccessible)
<h1>Benefits Application</h1>
<h3>Eligibility</h3>  <!-- Skipped h2! -->
<h5>Photo ID</h5>  <!-- Skipped h4! -->
After (accessible)
<h1>Benefits Application</h1>
  <h2>Eligibility Requirements</h2>
    <h3>Income Limits</h3>
    <h3>Residency Requirements</h3>
  <h2>Required Documents</h2>
    <h3>Photo ID</h3>
Platform-specific notes:

CivicPlus/WordPress/Drupal: Use the heading dropdown in your WYSIWYG editor — never use bold text as a fake heading.

Info Info and Relationships WCAG 1.3.1 83% of WV entities 15–30 minutes

Why it matters

ARIA landmarks define the major regions of a page. Screen reader users rely on landmarks to quickly jump between sections. Without them, users have no way to understand the page layout.

How to fix it

Use HTML5 semantic elements: <main> for primary content, <nav> for navigation, <header> for the banner, <footer> for footer content, <aside> for sidebars.

Before (inaccessible)
<body>
  <div id="header">...</div>
  <div id="nav">...</div>
  <div id="content">...</div>
  <div id="footer">...</div>
</body>
After (accessible)
<body>
  <header>
    <h1>WV DHHR</h1>
  </header>
  <nav>
    <ul>...</ul>
  </nav>
  <main>
    <h2>Welcome</h2>
  </main>
  <footer>
    <p>Contact information</p>
  </footer>
</body>
Platform-specific notes:

CivicPlus: Edit the master page template to replace <div> wrappers with semantic elements. WordPress: Most modern themes already use landmarks — check with our scanner.

Error Page Titled WCAG 2.4.2 45% of WV entities 5 minutes per page

Why it matters

The page title is the first thing a screen reader announces. It also appears in browser tabs and bookmarks. Without a descriptive title, users cannot identify the page.

How to fix it

Add a <title> element inside <head>. Use a pattern like 'Page Name - Site Name'. Ensure each page has a unique, descriptive title.

Before (inaccessible)
<head>
  <meta charset="UTF-8">
  <!-- No title element -->
</head>
After (accessible)
<head>
  <meta charset="UTF-8">
  <title>Apply for Benefits - WV DHHR</title>
</head>
Platform-specific notes:

CivicPlus: Set in page properties. WordPress: The page/post title automatically becomes the <title>. Drupal: Configure in the Metatag module.

Error Info and Relationships WCAG 1.3.1 67% of WV entities 15–30 minutes

Why it matters

Form inputs without labels are unusable for screen reader users. They cannot determine what information is being requested. Labels also increase the clickable area for motor-impaired users.

How to fix it

Associate a label with every form input: 1) <label for="id"> matching the input's id (preferred), 2) Wrap input inside <label>, 3) Use aria-label for inputs where a visible label isn't appropriate.

Before (inaccessible)
<!-- No label -->
First Name:
<input type="text" id="fname">

<!-- Placeholder is NOT a label -->
<input type="email" placeholder="Enter your email">
After (accessible)
<!-- label with for attribute (preferred) -->
<label for="fname">First Name</label>
<input type="text" id="fname">

<!-- aria-label for search -->
<input type="search" aria-label="Search this site">
Platform-specific notes:

CivicPlus: Use the form builder's label field — never leave it blank. WordPress: Contact Form 7 and Gravity Forms generate labels automatically if configured.

Error Info and Relationships WCAG 1.3.1 40% of WV entities 10–20 minutes per table

Why it matters

Data tables without header cells are extremely difficult for screen reader users. Without <th> elements, a screen reader cannot announce which column or row a data cell belongs to.

How to fix it

Use <th> elements for header cells. Add scope="col" for column headers and scope="row" for row headers. Add a <caption> to describe the table's purpose.

Before (inaccessible)
<table>
  <tr>
    <td>Name</td>
    <td>County</td>
    <td>Status</td>
  </tr>
  <tr>
    <td>John Smith</td>
    <td>Kanawha</td>
    <td>Approved</td>
  </tr>
</table>
After (accessible)
<table>
  <caption>Benefit Applications by County</caption>
  <thead>
    <tr>
      <th scope="col">Name</th>
      <th scope="col">County</th>
      <th scope="col">Status</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>John Smith</td>
      <td>Kanawha</td>
      <td>Approved</td>
    </tr>
  </tbody>
</table>

Quick Wins

Found on 50-80% of sites. Most take under an hour and have outsized impact on keyboard and screen reader users.

Warning Bypass Blocks WCAG 2.4.1 58% of WV entities 15 minutes

Why it matters

Keyboard users must tab through every navigation link on every page before reaching content. A skip link lets them jump directly to the main content.

How to fix it

Add a 'Skip to main content' link as the first focusable element, pointing to a <main> element. Visually hide it until it receives focus.

Before (inaccessible)
<body>
  <nav>
    <a href="/">Home</a>
    <a href="/about">About</a>
    <!-- 20 more links... -->
  </nav>
  <div id="content">...</div>
</body>
After (accessible)
<body>
  <a href="#main-content" class="skip-link">
    Skip to main content
  </a>
  <nav>...</nav>
  <main id="main-content">...</main>
</body>

/* CSS */
.skip-link { position: absolute; left: -9999px; }
.skip-link:focus { position: static; }
Platform-specific notes:

CivicPlus: Some templates include a skip link that targets a GUID-based ID — verify it actually works. WordPress: Add to header.php before the nav.

Error Contrast (Minimum) WCAG 1.4.3 35% of WV entities 1–2 hours

Why it matters

Low contrast makes content difficult or impossible to read for users with low vision, color blindness, or aging eyes. Minimum ratio: 4.5:1 for normal text, 3:1 for large text (18pt+).

How to fix it

Use a contrast checker (WebAIM Contrast Checker) to verify all text/background combinations. Avoid light gray text on white, or dark text on dark backgrounds.

Before (inaccessible)
<!-- Low contrast: light gray on white -->
<p style="color: #999; background: #fff;">Hard to read</p>
After (accessible)
<!-- Sufficient contrast -->
<p style="color: #333; background: #fff;">Easy to read</p>
Warning Focus Visible WCAG 2.4.7 30% of WV entities 15–30 minutes

Why it matters

Keyboard users rely on visible focus indicators to know which element is active. When focus outlines are removed with CSS and no replacement is provided, keyboard navigation becomes impossible.

How to fix it

Don't remove focus outlines without providing a visible alternative. Use :focus-visible to customize focus styles.

Before (inaccessible)
<a href="/about" style="outline: none;">About</a>
After (accessible)
<style>
  a:focus-visible {
    outline: 2px solid #0066cc;
    outline-offset: 2px;
  }
</style>
Info Parsing WCAG 4.1.1 25% of WV entities 30–60 minutes

Why it matters

Deprecated HTML elements like <font>, <center>, and <marquee> are not reliably supported by assistive technologies. Modern HTML and CSS provide accessible alternatives.

How to fix it

Replace <font> with <span> + CSS, <center> with CSS text-align, <marquee> — remove entirely, <strike> with <del>.

Before (inaccessible)
<font size="5" color="red">Important</font>
<center>Welcome</center>
<marquee>Breaking news</marquee>
After (accessible)
<span class="alert-text">Important</span>
<div style="text-align: center;">Welcome</div>
<p>Breaking news</p>
Warning Resize Text WCAG 1.4.4 20% of WV entities 2 minutes

Why it matters

Users with low vision need to zoom in to read content. When the viewport meta tag includes user-scalable=no, it prevents pinch-to-zoom on mobile, making content unreadable.

How to fix it

Remove user-scalable=no and maximum-scale restrictions from your viewport meta tag.

Before (inaccessible)
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1.0">
After (accessible)
<meta name="viewport" content="width=device-width, initial-scale=1">
Error Name, Role, Value WCAG 4.1.2 20% of WV entities 30–60 minutes

Why it matters

Interactive elements need accessible names so screen reader users know what they do. Custom widgets built with ARIA roles must have names via aria-label or visible text. Clickable divs need a role.

How to fix it

Add aria-label or visible text to elements with interactive ARIA roles. Add role='button' to clickable div/span elements.

Before (inaccessible)
<div role="button"></div>
<div onclick="doSomething()" tabindex="0">Click me</div>
After (accessible)
<div role="button" aria-label="Close dialog">X</div>
<div role="button" onclick="doSomething()" tabindex="0">Click me</div>

Forms & Interactive

Critical for any site with forms, search, or dynamic content. These ensure every resident can complete tasks online.

Warning Error Identification WCAG 3.3.1 40% of WV entities 20–40 minutes

Why it matters

When a required form input has no error message mechanism, users who make mistakes cannot identify what went wrong. Screen reader users especially need programmatic error identification.

How to fix it

For required inputs, use aria-describedby pointing to an error message container with role='alert'.

Before (inaccessible)
<input type="text" required>
After (accessible)
<input type="text" required aria-describedby="name-error">
<span id="name-error" role="alert"></span>
Warning Error Suggestion WCAG 3.3.3 35% of WV entities 15–30 minutes

Why it matters

Inputs with validation constraints should provide format hints. Without them, users must guess the correct format through trial and error.

How to fix it

Add aria-describedby to validated inputs, linking to a hint that describes the expected format.

Before (inaccessible)
<input type="email">
<input pattern="\d{3}-\d{4}">
After (accessible)
<input type="email" aria-describedby="email-hint">
<span id="email-hint">Example: user@example.com</span>
Info Identify Input Purpose WCAG 1.3.5 60% of WV entities 10 minutes

Why it matters

Users with cognitive or motor disabilities benefit from browser autofill. The autocomplete attribute lets browsers pre-fill information, reducing effort and errors.

How to fix it

Add autocomplete attributes to form fields: given-name, family-name, email, tel, postal-code, etc.

Before (inaccessible)
<input type="text" name="fname">
<input type="email" name="email">
After (accessible)
<input type="text" name="fname" autocomplete="given-name">
<input type="email" name="email" autocomplete="email">
Warning Label in Name WCAG 2.5.3 15% of WV entities 10–20 minutes

Why it matters

When an element has both visible text and an aria-label, speech-input users (Dragon NaturallySpeaking) cannot activate the control by speaking its visible label if the aria-label doesn't contain that text.

How to fix it

Ensure aria-label values contain the visible text of the element.

Before (inaccessible)
<button aria-label="Find items">Search</button>
After (accessible)
<button aria-label="Search products">Search</button>
Warning Status Messages WCAG 4.1.3 25% of WV entities 10–15 minutes

Why it matters

Dynamic messages (alerts, notifications, progress) must be announced to screen reader users. Elements with role='alert' or role='status' need aria-live attributes.

How to fix it

Add aria-live='assertive' to role='alert' elements and aria-live='polite' to role='status' elements.

Before (inaccessible)
<div role="alert">Form submitted</div>
After (accessible)
<div role="alert" aria-live="assertive">Form submitted</div>
Warning Pointer Cancellation WCAG 2.5.2 10% of WV entities 15–30 minutes

Why it matters

Users with motor impairments may accidentally trigger actions on pointer down. Actions should fire on pointer up (click) so users can cancel by moving the pointer away.

How to fix it

Use onclick instead of onmousedown or ontouchstart.

Before (inaccessible)
<button onmousedown="submitForm()">Submit</button>
After (accessible)
<button onclick="submitForm()">Submit</button>
Warning Timing Adjustable WCAG 2.2.1 5% of WV entities 5 minutes

Why it matters

Auto-refreshing pages via <meta http-equiv='refresh'> disorient users, especially those using screen readers. Users may lose their place or be redirected before finishing.

How to fix it

Remove <meta http-equiv='refresh'> tags. Use server-side redirects (HTTP 301/302) instead.

Before (inaccessible)
<meta http-equiv="refresh" content="5;url=/new-page">
After (accessible)
<!-- Use server-side redirect instead -->
<p>This page has moved. <a href="/new-page">Go to the new page</a></p>

Media, Display & Code Quality

Important for sites with video, PDFs, or legacy HTML. Ensures content works at all zoom levels and on all devices.

Error Captions (Prerecorded) WCAG 1.2.2 8% of WV entities 1–2 hours per video

Why it matters

Users who are deaf or hard of hearing cannot access audio in videos without captions. Captions also benefit users in noisy environments or those who process written information better.

How to fix it

Add a <track> element with kind='captions' inside each <video>. The track should reference a WebVTT (.vtt) file.

Before (inaccessible)
<video controls src="/training.mp4"></video>
After (accessible)
<video controls>
  <source src="/training.mp4" type="video/mp4">
  <track kind="captions" src="/training.vtt"
         srclang="en" label="English">
</video>
Info Audio Description WCAG 1.2.5 5% of WV entities 2–4 hours per video

Why it matters

Blind or low-vision users cannot see visual information in videos. Audio descriptions narrate important visual content not conveyed through the existing audio.

How to fix it

Add a <track> element with kind='descriptions' to video elements.

Before (inaccessible)
<video controls>
  <source src="/training.mp4">
  <track kind="captions" src="/captions.vtt">
</video>
After (accessible)
<video controls>
  <source src="/training.mp4">
  <track kind="captions" src="/captions.vtt">
  <track kind="descriptions" src="/descriptions.vtt"
         srclang="en" label="Audio Description">
</video>
Warning Audio Control WCAG 1.4.2 5% of WV entities 5 minutes

Why it matters

Audio that plays automatically interferes with screen readers. Users may not hear their assistive technology over autoplaying media.

How to fix it

Remove the autoplay attribute. If autoplay is necessary, add muted and provide a visible pause button.

Before (inaccessible)
<video autoplay src="/intro.mp4"></video>
After (accessible)
<video autoplay muted loop playsinline>
  <source src="/background.mp4">
</video>
<button onclick="document.querySelector('video').pause()">
  Pause video
</button>
Warning Orientation WCAG 1.3.4 3% of WV entities 2 minutes

Why it matters

Some users mount devices in a fixed orientation (e.g., wheelchair-mounted tablets). Forcing orientation prevents access.

How to fix it

Remove orientation restrictions from the viewport meta tag.

Before (inaccessible)
<meta name="viewport" content="width=device-width, orientation=landscape">
After (accessible)
<meta name="viewport" content="width=device-width, initial-scale=1">
Warning Reflow WCAG 1.4.10 15% of WV entities 1–2 hours

Why it matters

Content must reflow to 320px width (400% zoom) without horizontal scrolling. Fixed-width elements prevent this for low-vision users.

How to fix it

Replace fixed pixel widths with flexible units (%, vw, max-width). Use flexbox or grid layouts.

Before (inaccessible)
<div style="width: 800px;">Content</div>
After (accessible)
<div style="max-width: 800px; width: 100%;">Content</div>
Warning Text Spacing WCAG 1.4.12 10% of WV entities 30 minutes

Why it matters

Users with dyslexia often override text spacing. Elements with overflow:hidden + fixed line-height may clip text when spacing is increased.

How to fix it

Use relative units (em, rem) for line-height and letter-spacing. Avoid combining overflow:hidden with fixed text properties.

Before (inaccessible)
<div style="overflow: hidden; line-height: 14px; height: 20px;">
  Content that may be clipped
</div>
After (accessible)
<div style="line-height: 1.5; letter-spacing: 0.12em;">
  Content adapts to spacing overrides
</div>
Info Language of Parts WCAG 3.1.2 5% of WV entities 5–10 minutes

Why it matters

When a page section is in a different language, screen readers need a lang attribute on that element to switch pronunciation. Empty or invalid lang attributes cause wrong pronunciation.

How to fix it

Use valid BCP 47 language tags: en, es, fr, de, zh, ar. Remove empty lang attributes.

Before (inaccessible)
<p lang="">Some text</p>
<span lang="english">Hello</span>
After (accessible)
<p lang="es">Hola mundo</p>
<span lang="fr">Bonjour</span>

PDF Accessibility: Beyond WCAG

WCAG 2.1 covers web pages, but PDFs have their own accessibility standard: PDF/UA (ISO 14289-1). Government agencies that publish PDFs must meet both WCAG requirements and the PDF/UA structural requirements that screen readers depend on.

PDF/UA (ISO 14289-1)

The international standard for accessible PDFs. Requires a complete structure tree with proper tag hierarchy (headings, paragraphs, lists, tables), language declarations, alternative text for images, proper reading order, and Unicode character mapping. Every tagged element must have a role that assistive technology can interpret.

Matterhorn Protocol

The definitive test suite for PDF/UA compliance, maintained by the PDF Association. Defines 136 specific failure conditions across 31 checkpoints, covering structure, metadata, fonts, images, annotations, and content tagging. Approximately 89 of these checks can be fully automated; the remainder require human judgment.

Section 508

The U.S. federal accessibility standard that applies to all government agencies and organizations receiving federal funding. For electronic documents like PDFs, Section 508 incorporates WCAG 2.0 Level AA and PDF/UA requirements. Non-compliance can result in complaints, lawsuits, and loss of federal funding.

Why Adobe Acrobat (and Other Checkers) Miss Things

Not all accessibility checkers test the same rules. A PDF can pass Adobe Acrobat's built-in checker and still fail a full Matterhorn Protocol validation. Here's why.

Common Checkers

Adobe Acrobat Pro, PAC 2024, Axes

  • Partial Matterhorn coverage. Adobe checks ~30 of 136 failure conditions. PAC covers more but still misses edge cases in font encoding, annotation tagging, and XMP metadata.
  • Lenient structure validation. May accept a PDF with a structure tree that lacks ParentTree entries, missing /StructParent keys on annotations, or orphaned marked-content references — all of which break screen readers.
  • XMP metadata gaps. Rarely validate that pdfuaid:part is declared with the required pdfaExtension:schemas description. A PDF can claim PDF/UA conformance in its metadata while missing the schema declaration that proves it.
  • No Type3 font glyph validation. Type3 fonts define each glyph as a content stream. If those streams contain untagged drawing operators, assistive technology can't associate them with the structure tree. Most checkers ignore this entirely.
  • Inconsistent role mapping checks. May not flag custom tag names that lack a /RoleMap entry mapping them to standard PDF structure types.

veraPDF (Our Validator)

Open-source, used by Library of Congress & EU national archives

  • Full Matterhorn Protocol coverage. Tests all 89 machine-checkable failure conditions across every clause of ISO 14289-1. Nothing is skipped.
  • Strict structure tree validation. Verifies that every content operator on every page is wrapped in a marked-content sequence, that every annotation has a /StructParent entry pointing to a valid ParentTree node, and that the tag hierarchy forms a valid tree.
  • Complete XMP metadata checks. Validates not just that pdfuaid:part=1 exists, but that the extension schema declaration is present and well-formed — the exact check that proves real conformance.
  • Type3 font and Form XObject validation. Inspects content streams inside Type3 /CharProcs glyph definitions and Form XObjects to ensure every drawing operator is wrapped in proper artifact or tag markers.
  • Deterministic, reproducible results. Same PDF always produces the same validation output. No heuristics, no "close enough" — either the document meets the standard or it doesn't.
What does this mean in practice?

A PDF that passes Adobe Acrobat's accessibility check can still fail 20–40 Matterhorn Protocol rules when tested with veraPDF. These aren't theoretical edge cases — they're real failures that cause screen readers like JAWS and NVDA to skip content, read elements out of order, or crash on complex documents. We validate every PDF against the full Matterhorn Protocol before marking it compliant.

How We Ensure Every Check Is Correct

Our remediation pipeline doesn't just fix once and hope. It validates after every change, iterates on remaining failures, and escalates to more powerful strategies automatically.

1

Fix & Validate Loop

Every PDF goes through an automated fix-validate cycle. After each remediation pass, the document is re-validated against all 89 machine-checkable Matterhorn Protocol rules. If any failures remain, the system identifies the specific clauses that failed and generates targeted fixes for each one.

2

6-Strategy Escalation

If a light-touch fix doesn't achieve compliance, the system automatically escalates through six increasingly powerful strategies — from metadata repair to OCR remediation to full structure rebuilds to pixel-level reconstruction. Each strategy is followed by a complete re-validation.

3

Clause-Targeted Refinement

After initial remediation, remaining failures are analyzed by specific PDF/UA clause. The system generates surgical fixes for individual violations — a missing ParentTree entry, an untagged annotation, an improperly wrapped content stream — and re-validates after each fix. This iterative refinement is what pushes compliance from ~90% to 99%+.

4

Continuous Monitoring

Every fixed PDF is tracked in a compliance database. If a site publishes a new PDF or replaces an existing one, it's automatically detected, validated, and remediated. Compliance isn't a one-time event — it's maintained continuously.

2,400+ PDFs fixed
99%+ Compliance rate
136 Failure conditions checked

DIY vs SiteCheck ADA

If you have the technical capacity, these fixes are straightforward — this guide gives you everything you need. All 28 checks are documented above with before-and-after code you can copy directly. If you'd rather have experts handle it, we're here to help.

TaskDo it yourselfWith SiteCheck ADA
Full WCAG 2.1 AA scan (all 28 checks, every public page)Hours of manual testing per pageAutomated in minutes
PDF accessibility audit & remediationRequires Adobe Pro + trainingUnlimited structural + AI-enhanced fixes included
Prioritized remediation roadmapSelf-organized spreadsheetDelivered as PDF + dashboard
AI-generated HTML fixes for every issueRequires in-house dev + WCAG expertiseIncluded with $4,800 package
Post-remediation verificationAnother round of manual testingAutomated rescan included
365 days of compliance monitoringHire or contract an accessibility firmIncluded with $4,800 package

Services & pricing

Simple annual pricing. No hidden fees. Invoiced to your agency's normal vendor-payment process.

Transparent pricing. No hidden fees. Generous included allocations.

Compliance Report

Detailed assessment of all WCAG 2.1 violations with remediation guidance.

$500
  • Full HTML & PDF accessibility audit
  • WCAG 2.1 Level AA issue breakdown
  • Prioritized remediation roadmap
  • Executive summary for leadership
  • Delivered within 48 hours
Request Report — $500
Multi-Site

Enterprise

Everything in Full Remediation — scaled for departments managing multiple websites or large document libraries.

$9,600 /year
  • Everything in Report + Full Remediation
  • 1,500 PDF Agent credits (3x standard)
  • Up to 3 sites under one subscription
  • Priority processing queue
  • Dedicated account manager
  • Quarterly compliance summary reports
  • Discounted additional credits ($0.75/PDF)
  • Compliance documentation support
Get Started — $9,600/year

Need more than 3 sites or 1,500 credits? Contact us for custom sizing.

Need to fix a few documents fast? P-card friendly. No subscription required. Starting at $1.50/PDF.
See per-PDF pricing →

Still have questions? We're here to help — not to sell.

Email ada@appalach.info or call (304) 814-2769. We'll answer your accessibility questions, no strings attached.