Product and Evaluation
Product: Formation Ads (web application, current production release).
Report date: August 2026.
Contact: accessibility@formationads.com
Formation Ads is a self-service, government-compliant Meta advertising platform for military bands and Public Affairs offices: campaign creation, post boosting, credit billing with GPC invoices, and delivery reporting.
Applicable standards: WCAG 2.1 (A and AA), Section 508 (29 U.S.C. § 794d, incorporating WCAG 2.0 AA by reference), EN 301 549.
Evaluation methods used:
- Automated scanning with axe-core (Deque) integrated into the Playwright end-to-end suite, tags wcag2a and wcag2aa, run against release candidates. Scanned pages: landing, login, privacy, and data-deletion (the public surface). The full color-contrast rule set is enforced; a historical exclusion was removed in August 2026 after the failing token was retired and the suite re-verified clean.
- Manual keyboard and screen-reader review of complex interactive components (forms, modals, data tables) during development.
- Design-system review: semantic color tokens, status conveyed by text plus icon plus color (never color alone), focus management on route transitions and dialogs.
Conformance terms (per VPAT 2.5): Supports, Partially Supports, Does Not Support, Not Applicable.
Scope
Automated scans cover the four public pages listed above and enforce failures at serious and critical impact. Authenticated dashboard pages are covered by component-level conventions and manual review rather than per-page automated scans. Third-party embedded content (Stripe-hosted payment pages) is outside Formation Ads' code and is noted per criterion where relevant.
Table 1: WCAG 2.1 Level A Success Criteria
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 1.1.1 Non-text Content | Supports | Informative images carry alt text; decorative icons are aria-hidden. Upload flows require no image comprehension. |
| 1.2.1 Audio-only and Video-only (Prerecorded) | Not Applicable | No audio/video content is served by the product. |
| 1.2.2 Captions (Prerecorded) | Not Applicable | No prerecorded media. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | Not Applicable | No prerecorded media. |
| 1.3.1 Info and Relationships | Supports | Semantic landmarks (<main> on every page incl. standalone roots), heading hierarchy without skipped levels, labeled form controls, table headers on data tables. Verified by axe (wcag2a) on scanned pages. |
| 1.3.2 Meaningful Sequence | Supports | DOM order matches visual order; no CSS-only reordering of meaningful content. |
| 1.3.3 Sensory Characteristics | Supports | Instructions never rely solely on shape, position, or sound. |
| 1.4.1 Use of Color | Supports | Status (campaign state, sync health, payment state) is always text label + icon + color, per the design system's "status must be unambiguous" principle. |
| 1.4.2 Audio Control | Not Applicable | No auto-playing audio. |
| 2.1.1 Keyboard | Supports | All interactive elements are native controls or Radix primitives with full keyboard support; manual keyboard review of forms, dialogs, and tables. |
| 2.1.2 No Keyboard Trap | Supports | Dialogs (Radix) trap focus while open and restore it on close; no unrecoverable traps found in manual review. |
| 2.1.4 Character Key Shortcuts | Not Applicable | No single-character shortcuts are implemented. |
| 2.2.1 Timing Adjustable | Partially Supports | No content timers. Sessions expire after inactivity (government security requirement, FedRAMP AC-12); re-authentication restores access without data loss for saved drafts (24h localStorage draft persistence). |
| 2.2.2 Pause, Stop, Hide | Supports | No auto-updating moving content; charts render without animation (isAnimationActive={false}). Job-status polling updates text in place. |
| 2.3.1 Three Flashes or Below Threshold | Supports | No flashing content. |
| 2.4.1 Bypass Blocks | Supports | Skip-to-content link on every page, including the standalone landing page. |
| 2.4.2 Page Titled | Supports | Per-page titles via the Next.js metadata API. |
| 2.4.3 Focus Order | Supports | Focus order follows DOM order; modals move focus in and restore on close. |
| 2.4.4 Link Purpose (In Context) | Supports | Links are descriptive in context; icon-only buttons carry sr-only labels. |
| 2.5.1 Pointer Gestures | Supports | No path-based or multipoint gestures. |
| 2.5.2 Pointer Cancellation | Supports | Standard click activation (up-event) throughout. |
| 2.5.3 Label in Name | Supports | Visible labels are contained in accessible names. |
| 2.5.4 Motion Actuation | Not Applicable | No motion-operated functionality. |
| 3.1.1 Language of Page | Supports | lang="en" on the root element. |
| 3.2.1 On Focus | Supports | Focus never triggers a context change. |
| 3.2.2 On Input | Supports | Input never auto-submits or changes context; all submissions are explicit. |
| 3.3.1 Error Identification | Supports | Form errors are announced via role="alert" / aria-live regions and identified in text; focus moves to the first error on invalid submit (campaign form). |
| 3.3.2 Labels or Instructions | Supports | All inputs have programmatic labels; complex fields (budgets, tokens) include inline help. |
| 4.1.1 Parsing | Supports | React-generated markup; no duplicate-ID or malformed-nesting findings in scans. (Criterion removed in WCAG 2.2; reported for 2.1 completeness.) |
| 4.1.2 Name, Role, Value | Supports | Native elements and Radix primitives expose correct roles/states; axe (wcag2a) verifies ARIA validity on scanned pages. |
Table 2: WCAG 2.1 Level AA Success Criteria
| Criteria | Conformance Level | Remarks and Explanations |
|---|---|---|
| 1.2.4 Captions (Live) | Not Applicable | No live media. |
| 1.2.5 Audio Description (Prerecorded) | Not Applicable | No prerecorded media. |
| 1.3.4 Orientation | Supports | Responsive layout; no orientation lock. |
| 1.3.5 Identify Input Purpose | Partially Supports | Authentication is OAuth-only (no credential fields). Billing identity fields are collected on Stripe-hosted pages (third party); in-app profile fields use appropriate input types, autocomplete attributes are not exhaustively applied. |
| 1.4.3 Contrast (Minimum) | Supports | Design tokens meet AA in both themes (light primary 15.9:1; dark primary 17.7:1 on their backgrounds). Historical failures (muted text at reduced opacity, brand-blue button at 4.23:1) were remediated 2026-08; the axe color-contrast rule is enforced with no exclusions and scanned pages pass. |
| 1.4.4 Resize Text | Supports | Relative units and responsive layout; 200% zoom retains functionality without horizontal scrolling of body text. |
| 1.4.5 Images of Text | Supports | No images of text; all text is real text. |
| 1.4.10 Reflow | Supports | Content reflows at 320 CSS px; wide data tables scroll within their own containers. |
| 1.4.11 Non-text Contrast | Supports | Interactive component boundaries and focus indicators meet 3:1 against adjacent colors in both themes. |
| 1.4.12 Text Spacing | Supports | No fixed-height text containers that clip at user-adjusted spacing. |
| 1.4.13 Content on Hover or Focus | Supports | Tooltips (Radix) are dismissible (Esc), hoverable, and persistent. |
| 2.4.5 Multiple Ways | Supports | Persistent navigation sidebar, dashboard entry points, and direct URLs; marketing pages add a sitemap. |
| 2.4.6 Headings and Labels | Supports | Headings and labels are descriptive; verified in scans and review. |
| 2.4.7 Focus Visible | Supports | Visible focus rings on all interactive elements (--ring token, both themes). |
| 3.1.2 Language of Parts | Not Applicable | Single-language (English) content. |
| 3.2.3 Consistent Navigation | Supports | Sidebar and header navigation are consistent across the authenticated app; marketing pages share a consistent nav. |
| 3.2.4 Consistent Identification | Supports | Icons and controls with the same function are identified consistently (shared component library). |
| 3.3.3 Error Suggestion | Supports | Validation errors state what is wrong and how to fix it (e.g., budget bounds, required creative fields); publish-readiness failures name the blocking condition. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Supports | Financial and destructive actions (publish, purchase, refund, member removal/deactivation) require explicit confirmation dialogs stating consequences; purchases run on Stripe-hosted checkout with its own review step. |
| 4.1.3 Status Messages | Supports | Toast notifications (Sonner) and form feedback use appropriate live regions so status is announced without focus moves. |
Known Limitations
- Third-party content. Stripe-hosted payment pages are outside Formation Ads' codebase; Stripe publishes its own accessibility documentation.
- Data visualizations. Reporting charts include text labels, tabular fallbacks in surrounding UI, and tooltips, but complex time-series data may remain difficult to navigate with a screen reader.
- Assessment scope. Automated per-page scans cover the public surface; authenticated pages rely on shared-component coverage and manual review. Expanding scan coverage is on the accessibility roadmap.
Related Documents
- Public accessibility statement
- Remediation contact (respond within 5 business days, resolve within 30 days): accessibility@formationads.com