Developing VPAT — Accessibility Report Template
VPAT (Voluntary Product Accessibility Template) is a standard document describing a product's compliance with Section 508 (USA) or EN 301 549 (Europe). It is mandatory for selling software to US government agencies and large corporations with procurement policies.
VPAT Versions
| Version | Standard | When to Use |
|---|---|---|
| VPAT 2.4 WCAG | WCAG 2.1/2.2 | International projects |
| VPAT 2.4 508 | Section 508 | US government sector |
| VPAT 2.4 EU | EN 301 549 | European market |
| VPAT 2.4 INT | All three | Universal |
VPAT templates are available at IT Industry Council (itic.org).
VPAT Structure
VPAT consists of tables for each WCAG section. For each criterion, a support level is indicated:
| Support Level | Meaning |
|---|---|
| Supports | Fully compliant |
| Partially Supports | Partial compliance with limitations |
| Does Not Support | Non-compliant |
| Not Applicable | Criterion not applicable to product |
| Not Evaluated | Not tested |
VPAT Preparation Process
Step 1: Product Audit
Systematic manual testing is conducted with screen readers (NVDA + Firefox, JAWS + Chrome, VoiceOver + Safari) and automated tools (axe-core, WAVE).
Step 2: Filling in Criteria
For each WCAG Success Criterion (78 total for Level AA in 2.1):
1.1.1 Non-text Content (Level A)
Criteria: Supports
Remarks: All images have appropriate alt text. Decorative images
use empty alt="" attribute. Complex charts include
long description via aria-describedby.
Step 3: Documenting Limitations
1.4.3 Contrast (Minimum) (Level AA)
Criteria: Partially Supports
Remarks: Most text meets 4.5:1 contrast ratio requirement.
Exception: placeholder text in form fields uses #9ca3af
on white background (2.7:1 ratio). Fix planned in Q2 2025.
Workaround: Users can use browser high contrast mode.
Automated Draft Generation
// scripts/generate-vpat-draft.js
// Create VPAT draft based on axe-core report
const WCAG_CRITERIA = require('./wcag-criteria.json'); // All criteria list
async function generateVpatDraft(axeReport) {
const violations = new Set(axeReport.violations.map(v => v.tags).flat()
.filter(t => t.startsWith('wcag')));
const draft = WCAG_CRITERIA.map(criterion => ({
id: criterion.id,
title: criterion.title,
level: criterion.level,
support: violations.has(criterion.wcag_tag) ? 'Partially Supports' : 'Supports',
remarks: violations.has(criterion.wcag_tag)
? `Automated testing found issues: ${axeReport.violations.filter(v => v.tags.includes(criterion.wcag_tag)).map(v => v.description).join('; ')}`
: 'No issues detected in automated testing. Manual verification recommended.',
}));
// Generate Markdown
return draft.map(c =>
`### ${c.id} ${c.title} (Level ${c.level})\n\n**${c.support}**\n\n${c.remarks}\n`
).join('\n');
}
The draft requires mandatory manual review — automation covers approximately 40% of criteria.
What Is Usually Checked Manually
- Keyboard navigation (Tab/Shift+Tab/Enter/Space/Escape/arrows)
- Compatibility with NVDA, JAWS, VoiceOver
- Zoom 200% and 400% without functionality loss
- Windows high contrast mode
- Animations with
prefers-reduced-motion - Session timeouts and warnings
Timeline
Product audit, VPAT 2.4 completion, and review: 5–10 business days depending on product complexity.







