Accessibility Audit — Phase 19 (SEO-Focused)
Executive Summary
Accessibility and SEO are converging in 2025. Semantic HTML — the foundation of accessibility compliance — is also Googlebot's preferred signal architecture. Lighthouse accessibility score directly correlates with Core Web Vitals performance, particularly INP (Interaction to Next Paint, replaced FID March 2024) and CLS. Google's Quality Rater Guidelines (2024 update) explicitly flag accessibility as an E-E-A-T trust indicator. Legal exposure from accessibility failures is escalating: ADA Title III lawsuits reached 4,605 in 2023 (Seyfarth Shaw), and negative SERP results from lawsuit coverage directly harm brand SERP. AI search systems (Google AIO, ChatGPT, Perplexity) preferentially extract content from semantically correct, accessible HTML structures — inaccessible pages are de facto AI-invisible.
2025 accessibility benchmarks:
- WCAG 2.2 AA = current legal standard (US ADA, EU EAA effective June 2025, AU DDA)
- Lighthouse score ≥90 = target; <70 = flag as structural risk to E-E-A-T
- 96.3% of the top 1 million homepages have WCAG failures (WebAIM Million Report 2024)
- Semantic HTML headings = 41% higher featured snippet acquisition (SEMrush 2024)
- INP <200ms (Good) = primary CWV threshold since March 2024 — poor accessibility patterns (no skip links, large unoptimized tap targets) are INP contributors
- Touch target minimum: 24×24px (WCAG 2.2 new criterion 2.5.8, Oct 2023)
Why Accessibility Matters for SEO (2025)
- INP & CLS — poor accessibility (no skip links, large tap targets missing) causes bad Core Web Vital scores; INP target <200ms
- Crawlability — screen reader-friendly semantic HTML = Googlebot-friendly; JS-only content risks non-rendering
- E-E-A-T — inclusive design signals quality and professionalism — Quality Rater Guidelines (2024) specifically flag accessibility as a trust indicator
- Legal risk — ADA Title III lawsuits hit 4,605 cases in 2023 (Seyfarth Shaw data); lawsuits = negative SERP results (reputation risk)
- Featured snippets — well-structured semantic HTML wins 2–3× more featured snippets vs. unsemantic markup
- WCAG 2.2 — new criteria (October 2023): Focus Not Obscured, Dragging Movements, Target Size (minimum 24×24px)
Step 1: Read Project Context
Read {AUDIT_DIR}/intake-data.md for business name, URL, and project paths. Check {AUDIT_DIR}/technical-findings.md for previously noted accessibility issues. Check {AUDIT_DIR}/speed-findings.md for INP/CLS data relevant to accessibility.
Tools for this phase: | Tool | Purpose | Cost | |------|---------|------| | WAVE (wave.webaim.org) | Visual accessibility report — shows errors directly on page | Free | | Axe DevTools (browser extension) | WCAG 2.1/2.2 automated testing — 0 false positives | Free/Paid | | Google Lighthouse | Accessibility score (0–100), automated WCAG checks | Free | | Siteimprove | Continuous accessibility monitoring + WCAG conformance reporting | Paid | | Color Contrast Analyzer (TPGi) | Pixel-level contrast ratio verification | Free | | NVDA (Windows) / VoiceOver (Mac/iOS) | Screen reader testing — manual verification | Free | | Screaming Frog | Crawl for missing alt text at scale | Paid/Free (≤500 URLs) | | site_crawler.py | python3 scripts/site_crawler.py --url [URL] --max-pages 50 → images_no_alt column | Free |
WCAG Conformance Levels (2025 target):
- WCAG 2.1 AA: Legal standard for most jurisdictions (US, EU, AU) — minimum target
- WCAG 2.2 AA: Current standard (Oct 2023) — adds 9 new criteria; recommended target
- WCAG 2.2 AAA: Aspirational for highest-priority accessibility
Step 2: Automated Scan (Run First)
Run Lighthouse → Accessibility score → document all flagged issues:
# Via Chrome DevTools: F12 → Lighthouse → Accessibility → Generate Report
# Or via CLI:
npx lighthouse [URL] --only-categories=accessibility --output json --output-path audit.json
Run WAVE on homepage + top 3 service pages + contact page.
Automated scan results: | Page | Lighthouse Score | WAVE Errors | WAVE Alerts | Priority | |------|----------------|------------|------------|---------| | Homepage | /100 | | | | | [Service 1] | /100 | | | | | Contact | /100 | | | |
Automated tools catch ~30–40% of WCAG issues. Manual testing required for the rest.
Step 3: Heading Hierarchy
Run: Axe DevTools → filter "Heading" issues.
- Single H1 per page? (multiple H1s = structural confusion for Googlebot + screen readers)
- No skipped levels (H1 → H3 without H2)?
- Headings describe section content (not just styled for appearance)?
- Heading order logical for screen readers (test with NVDA/VoiceOver heading navigation)?
- Service pages: H1 = primary service + location keyword?
SEO impact: Correct heading hierarchy correlates with 41% higher featured snippet acquisition (SEMrush 2024 study).
Test (manual): Disable CSS in browser (devtools → styles → uncheck user agent stylesheet) — does the page still make structural sense?
Step 4: Images & Alt Text
Run: python3 scripts/site_crawler.py --url [URL] --max-pages 50 --output {DATA_DIR}/crawl/ --csv → Check images_no_alt column for count and URLs.
| Check | Count | Pages Affected | Priority | |-------|-------|---------------|---------| | Images missing alt attribute entirely | | | Critical | | Images with alt="" that aren't decorative | | | High | | Images with alt="image" or filename as alt | | | High | | Complex images (infographics) with no extended description | | | Medium | | Logo: alt = business name? | | | High |
Alt text standards (2025):
- Informative images: describe content AND function
- Decorative images (dividers, backgrounds):
alt=""(empty string, not missing) - CTA images: alt = the CTA action ("Get a Free Quote")
- Maximum recommended alt text: 125 characters
Videos
- Captions/subtitles on all videos? (YouTube auto-captions don't meet WCAG AA)
- Transcripts available for audio content?
- Videos don't autoplay with sound? (WCAG 1.4.2 — immediate fail if violated)
Step 5: Color & Contrast
Use Color Contrast Analyzer or Axe DevTools → filter "Color Contrast" issues.
| Element | Current Ratio | WCAG AA Minimum | Pass/Fail | |---------|-------------|----------------|----------| | Body text (normal, <18pt) | :1 | 4.5:1 | | | Large text (18pt+ or 14pt bold) | :1 | 3:1 | | | UI components (buttons, input borders) | :1 | 3:1 | | | Placeholder text in forms | :1 | 4.5:1 | | | Links (if distinguishable by color alone) | :1 | 4.5:1 | |
Common failures:
- Light grey text on white background (often fails — e.g.,
#767676on white = exactly 4.5:1) - CTA button text on brand-colored background
- Error message text on red background
Step 6: Keyboard Navigation
Manual test (no mouse): Navigate entire page using only Tab, Shift+Tab, Enter, Space, Arrow keys.
| Check | Pass/Fail | Pages Affected | |-------|----------|---------------| | All interactive elements reachable via Tab | | | | Logical tab order (follows visual layout L→R, T→B) | | | | No keyboard traps (can Tab out of modals, menus, date pickers) | | | | Skip navigation link present at top ("Skip to main content") | | | | Custom dropdowns, accordions, sliders keyboard-accessible | | | | Focus indicator visible on all elements (not outline: none) | | |
WCAG 2.2 new criteria (Focus):
- Focus Not Obscured (2.4.11): Focused element must not be completely hidden by sticky headers/footers
- Focus Not Obscured Enhanced (2.4.12): Focused element fully visible
Step 7: Forms & Inputs
Test all forms: contact, quote, booking, search, newsletter.
| Form | Location | Fields | Labeled? | Error Msgs? | Mobile OK? | |------|---------|--------|---------|------------|-----------| | Contact | [page] | [count] | ✅/❌ | ✅/❌ | ✅/❌ | | Quote | [page] | [count] | ✅/❌ | ✅/❌ | ✅/❌