WOMMWorks On My Machine · onmymachineitworks.comSample · fictional data

Test report · Accessibility (WCAG 2.2 AA)

Acme Ledger web app and customer portal

Does not conform · 13 criteria fail
Standard
WCAG 2.2 Level A and AA (55 success criteria)
Scope
8 key screens: Login, Dashboard, Invoice list, Invoice editor, Customer page, Reports, Portal invoice, Portal payment
Method
Automated scan (axe-core) + manual review of every criterion
Assistive tech
NVDA 2024.4 + Firefox, VoiceOver + Safari (macOS, iOS), keyboard only, 200% and 400% zoom, Windows high contrast
Build
Staging 4.2.0-rc3
Tested
19 Oct 2026 – 21 Oct 2026
Auditor
Tomasz Kordiak

Summary

The app does not yet conform to WCAG 2.2 AA: 13 of 55 criteria fail on at least one screen. One issue is critical: keyboard and screen reader users cannot create an invoice because the date picker only works with a mouse (A11Y-01).

The customer portal is in better shape: a screen reader user can find and pay an invoice. Most issues come from shared components, so fixing 10 components resolves about 80% of the issues found.

Why it matters

Accessibility problems are usability problems too: the form-error issue also slowed down sighted users in the usability tests (UX-04).

Results overview

35Criteria pass
13Criteria fail
7Not applicable
28Issues found
1Critical
8Serious
Perceivable
9 pass · 5 fail · 6 n/a
Operable
15 pass · 4 fail · 1 n/a
Understandable
11 pass · 2 fail · 0 n/a
Robust
0 pass · 2 fail · 0 n/a

Defects one Jira ticket per component

KeySummarySeverityStatusComponentFound byOwnerCreated
ACME-541Accessibility: DatePicker component (A11Y-01)CriticalOpenDatePickerA11Y-01Frontend21 Oct
ACME-542Accessibility: Select component (A11Y-02, 03)HighOpenSelectA11Y-02Frontend21 Oct
ACME-543Accessibility: IconButton component (A11Y-04, 21)HighOpenIconButtonA11Y-04Frontend21 Oct
ACME-544Accessibility: FormField component (A11Y-05, 06, 07)HighOpenFormFieldA11Y-05Frontend21 Oct
ACME-545Accessibility: Theme component (A11Y-08, 10, 23)HighOpenThemeA11Y-08Frontend21 Oct
ACME-546Accessibility: Chart component (A11Y-09, 18, 22, 28)HighOpenChartA11Y-09Frontend21 Oct
ACME-547Accessibility: LineItems component (A11Y-11, 16)MediumOpenLineItemsA11Y-11Frontend21 Oct
ACME-548Accessibility: Portal theme component (A11Y-13, 14)MediumOpenPortal themeA11Y-13Frontend21 Oct
ACME-549Accessibility: Toast component (A11Y-19, 20)MediumOpenToastA11Y-19Frontend21 Oct
ACME-550Accessibility: DataTable component (A11Y-12, 26, 27)MediumOpenDataTableA11Y-12Frontend21 Oct

Observations

IDAreaObservationImpactSuggested action
OBS-01PositivePage titles, language, headings on most pages and skip links are in place.Positive–
OBS-02ComponentsMost issues come from 10 shared components; fixing them resolves about 80% of instances.EffortFix components, not pages.
OBS-03Automationaxe found 41 violations; manual review found the critical keyboard issue and 9 others axe can't detect.InfoKeep both automated checks and manual walkthroughs.
OBS-04PortalThe portal is in better shape than the back office: a screen reader user can pay an invoice.PositivePrioritise the back office.
OBS-05LegalThe European Accessibility Act has applied to many consumer-facing digital services in the EU since 28 June 2025.InfoWhether it applies to Acme is a legal question; this report gives the technical picture.
OBS-06ProcessDesigns in Figma have no focus states or error states.Root causeAdd them to the design system.

Top issues in detail

Critical A11Y-01 Date picker can't be used with a keyboard

WCAG
2.1.1 Keyboard (A)
Where
Invoice editor (issue and due date), recurring schedule
Observed
The calendar opens on click only; arrow keys do nothing and the field is read-only. Keyboard and screen reader users cannot create an invoice.
Fix
Allow typing the date (format shown), or use the ARIA date picker dialog pattern.

High A11Y-02 Custom dropdowns have no role or state

WCAG
4.1.2 Name, Role, Value (A)
Observed
NVDA announces 'clickable' with no name; expanded state not exposed; options not reachable with arrow keys.
Fix
Native <select> or the ARIA combobox pattern.

High A11Y-05 Form errors shown only by a red border

WCAG
3.3.1 Error Identification (A), 1.4.1 Use of Color (A)
Fix
Text error linked with aria-describedby, aria-invalid="true", focus on the first error.

High A11Y-08 Secondary text and placeholders have low contrast

WCAG
1.4.3 Contrast (Minimum) (AA)
Observed
#9CA3AF on white: 2.5:1 (needs 4.5:1), on every page.
Fix
#6B7280 (4.8:1) or darker.

WCAG 2.2 criteria 35 pass · 13 fail · 7 n/a

CriterionNameLevelResultIssues / note
1.1.1Non-text ContentAFailA11Y-04 A11Y-18 A11Y-24
1.2.1Audio-only and Video-only (Prerecorded)AN/ANo audio or video
1.2.2Captions (Prerecorded)AN/ANo video
1.2.3Audio Description or Media Alternative (Prerecorded)AN/ANo video
1.2.4Captions (Live)AAN/ANo live media
1.2.5Audio Description (Prerecorded)AAN/ANo video
1.3.1Info and RelationshipsAFailA11Y-16 A11Y-17 A11Y-26
1.3.2Meaningful SequenceAPass–
1.3.3Sensory CharacteristicsAPass–
1.3.4OrientationAAPass–
1.3.5Identify Input PurposeAAPass–
1.4.1Use of ColorAPass–
1.4.2Audio ControlAN/ANo audio
1.4.3Contrast (Minimum)AAFailA11Y-08 A11Y-09 A11Y-23
1.4.4Resize TextAAPass–
1.4.5Images of TextAAPass–
1.4.10ReflowAAFailA11Y-11 A11Y-12
1.4.11Non-text ContrastAAFailA11Y-10 A11Y-28
1.4.12Text SpacingAAPass–
1.4.13Content on Hover or FocusAAPass–
2.1.1KeyboardAFailA11Y-01 A11Y-27
2.1.2No Keyboard TrapAPass–
2.1.4Character Key ShortcutsAPass–
2.2.1Timing AdjustableAPass–
2.2.2Pause, Stop, HideAPass–
2.3.1Three Flashes or Below ThresholdAPass–
2.4.1Bypass BlocksAPass–
2.4.2Page TitledAPass–
2.4.3Focus OrderAPass–
2.4.4Link Purpose (In Context)APass–
2.4.5Multiple WaysAAPass–
2.4.6Headings and LabelsAAPass–
2.4.7Focus VisibleAAFailA11Y-13 A11Y-14
2.4.11Focus Not Obscured (Minimum)AAFailA11Y-15
2.5.1Pointer GesturesAPass–
2.5.2Pointer CancellationAPass–
2.5.3Label in NameAPass–
2.5.4Motion ActuationAN/ANo motion input
2.5.7Dragging MovementsAAPass–
2.5.8Target Size (Minimum)AAFailA11Y-21 A11Y-22
3.1.1Language of PageAPass–
3.1.2Language of PartsAAPass–
3.2.1On FocusAPass–
3.2.2On InputAPass–
3.2.3Consistent NavigationAAPass–
3.2.4Consistent IdentificationAAPass–
3.2.6Consistent HelpAPass–
3.3.1Error IdentificationAFailA11Y-05 A11Y-06
3.3.2Labels or InstructionsAPass–
3.3.3Error SuggestionAAFailA11Y-07
3.3.4Error Prevention (Legal, Financial, Data)AAPass–
3.3.7Redundant EntryAPass–
3.3.8Accessible Authentication (Minimum)AAPass–
4.1.2Name, Role, ValueAFailA11Y-02 A11Y-03 A11Y-25
4.1.3Status MessagesAAFailA11Y-19 A11Y-20

All issues 28 issues

IDPageWCAGImpactIssueComponentFix
A11Y-01Invoice editor2.1.1CriticalDate picker opens on click only; field is read-onlyDatePickerAllow typing; ARIA date picker dialog pattern
A11Y-02Invoice editor4.1.2SeriousCustomer selector has no role, name or expanded stateSelectNative select or ARIA combobox
A11Y-03Invoice editor4.1.2SeriousCurrency and VAT selectors not reachable with arrow keysSelectSame component fix as A11Y-02
A11Y-04Invoice list1.1.1SeriousRow action icons (download, duplicate, delete) have no nameIconButtonaria-label with invoice number
A11Y-05Invoice editor3.3.1SeriousErrors shown only by a red borderFormFieldText error linked with aria-describedby; aria-invalid
A11Y-06Customer page3.3.1SeriousSame form error pattern on customer formFormFieldSame component fix
A11Y-07Invoice editor3.3.3SeriousNo suggestion for invalid VAT number or IBANFormFieldExplain the expected format
A11Y-08All pages1.4.3SeriousGrey secondary text #9CA3AF on white (2.5:1)ThemeUse #6B7280 (4.8:1) or darker
A11Y-09Reports1.4.3SeriousChart axis labels 2.8:1ChartDarker label colour
A11Y-10Invoice editor1.4.11ModerateInput borders 1.9:1 against backgroundThemeBorder colour with ≥ 3:1
A11Y-11Invoice editor1.4.10ModerateLine items need horizontal scrolling at 320 pxLineItemsStack lines as cards below 600 px
A11Y-12Reports1.4.10ModerateReport table cut off at 400% zoomDataTableScrollable region with caption, or reflow
A11Y-13Portal invoice2.4.7ModerateFocus outline removed on buttonsPortal themeVisible :focus-visible style
A11Y-14Portal payment2.4.7ModerateFocus outline removed on payment formPortal themeSame fix
A11Y-15Invoice editor2.4.11ModerateSticky footer covers the focused fieldLayoutscroll-padding-bottom = footer height
A11Y-16Invoice editor1.3.1ModerateLine items are divs; no table semanticsLineItemsTable with header cells or grid roles
A11Y-17Dashboard1.3.1ModerateKPI tiles use visual headings without heading markupStatTileProper heading levels
A11Y-18Reports1.1.1ModerateRevenue chart has no text alternativeChartData table or summary text
A11Y-19Invoice editor4.1.3Moderate'Saved' toast not announced to screen readersToastrole=status / aria-live polite
A11Y-20Invoice list4.1.3ModerateBulk action result not announcedToastSame fix
A11Y-21Invoice list2.5.8MinorRow action icons 16 × 16 pxIconButton24 × 24 px target or spacing
A11Y-22Dashboard2.5.8MinorChart legend toggles 14 × 14 pxChartLarger hit area
A11Y-23Login1.4.3MinorPlaceholder text 2.6:1ThemeSame as A11Y-08
A11Y-24Customer page1.1.1MinorCustomer logo alt text is the file nameAvatarUse the customer name
A11Y-25Portal payment4.1.2MinorCard field iframe has no accessible namePayment formtitle attribute on the provider iframe
A11Y-26Reports1.3.1MinorTable header cells are styled td elementsDataTableUse th with scope
A11Y-27Invoice list2.1.1MinorRow click opens invoice; no keyboard equivalent besides the linkDataTableKeep link as the target; remove row click or add Enter
A11Y-28Dashboard1.4.11MinorChart series distinguished by colour only (also 1.4.1)ChartPatterns or direct labels

Issues by page

PageCriticalSeriousModerateMinorTotal
Login–1–12
Dashboard–1124
Invoice list–2125
Invoice editor155–11
Customer page–2–13
Reports–2215
Portal invoice–11–2
Portal payment–1113

Issues marked 'All pages' are counted on every page.

Automated scan (axe)

RuleImpactPagesInstances
color-contrastSerious817
button-nameCritical39
labelCritical24
aria-required-attrCritical13
image-altCritical22
regionModerate55
target-sizeSerious21

41 violations of 7 rules across 8 pages. Automated tools catch roughly a third of WCAG issues; the rest come from manual testing.

Assistive technology walkthroughs

TaskNVDA + FirefoxVoiceOver + SafariKeyboard only400% zoomHigh contrast
Log inCompletedCompletedCompletedCompletedCompleted
Create and send an invoiceBlockedBlockedBlockedWith difficultyCompleted
Find an unpaid invoiceWith difficultyCompletedCompletedCompletedCompleted
Record a paymentWith difficultyWith difficultyCompletedCompletedCompleted
Run a revenue reportWith difficultyWith difficultyCompletedWith difficultyCompleted
Invite a userCompletedCompletedCompletedCompletedCompleted
Pay an invoice in the portalCompletedWith difficultyWith difficultyCompletedCompleted
Download an invoice PDFCompletedCompletedCompletedCompletedCompleted

8 tasks × 5 set-ups = 40 walkthroughs.

Fix plan

OrderComponentResolvesEffort
1 · nowDatePicker, SelectA11Y-01, 02, 03 (blocks users)3 days
2 · next releaseFormField, IconButton, ThemeA11Y-04 – 08, 10, 21, 234 days
3 · following releaseChart, LineItems, DataTable, Toast, Portal themeA11Y-09, 11 – 20, 22, 26 – 285 days
4 · ongoingaxe in Playwright at 'moderate'; keyboard walkthroughs as UAT casesPrevents regressions1 day

After the fixes the failed criteria are re-tested and the report updated; an accessibility statement can be drafted from it.

Scope and method

PagesLogin, Dashboard, Invoice list, Invoice editor, Customer page, Reports, Portal invoice, Portal payment
Viewports1440 px desktop, 375 px mobile, 320 px reflow
Screen readersNVDA 2024.4 + Firefox 132, VoiceOver + Safari 18 (macOS 15, iOS 18)
Toolsaxe-core 4.10, Colour Contrast Analyser, browser zoom, Windows high contrast
Not coveredPDF documents (invoices) — PDF/UA is a separate check; email templates

Sample report. Acme Ledger, its data, people and defects are fictional. Your report shows your product, your tickets and your tools.
More sample reports · Book a 15-minute call