Why Accessibility Is a Business Decision, Not Just a Legal One
Most founders hear "accessibility" and think of compliance checklists and legal risk. That framing misses the point entirely. Yes, ADA lawsuits targeting websites hit over 4,000 per year in the US. Yes, the Department of Justice has confirmed that websites qualify as "places of public accommodation." But the legal argument is the least interesting reason to care about accessibility.
Over one billion people worldwide live with some form of disability. That is roughly 15% of the global population, and they represent $13 trillion in annual disposable income. When your app is inaccessible, you are not just risking a lawsuit. You are locking out a massive market segment that actively wants to give you money.
Then there is the SEO angle. Google rewards accessible websites. Proper heading hierarchy, descriptive alt text, semantic HTML, and keyboard navigability all directly improve your search rankings. Screen readers and search engine crawlers parse content in remarkably similar ways. Building for one helps the other.
There is also the quality argument. Accessible code is clean code. When you build with proper semantics, logical tab order, and clear focus states, you end up with a better product for everyone. Users on slow connections benefit from lightweight semantic markup. Power users who navigate with keyboards move faster. Mobile users get better touch targets. Accessibility is not charity. It is good engineering that happens to also be the right thing to do.
WCAG 2.1 AA vs AAA: What Level to Target
The Web Content Accessibility Guidelines (WCAG) define three conformance levels: A, AA, and AAA. Level A covers the absolute basics. Level AAA is near-perfect accessibility. Level AA is the practical target for most startups, and here is why.
Level A requirements are the minimum bar. If you fail Level A, your site is essentially unusable for many disabled users. Missing alt text on images, no keyboard navigation, auto-playing audio with no way to stop it. These are Level A failures, and they are embarrassing to ship in 2026.
Level AA adds meaningful improvements: color contrast ratios of at least 4.5:1 for normal text (criterion 1.4.3), text resizing up to 200% without loss of content (1.4.4), visible focus indicators (2.4.7), and consistent navigation (3.2.3). This is the level that most legal settlements require, and the level that the European Accessibility Act mandates for digital products sold in the EU starting June 2025.
Level AAA is aspirational for most products. It requires things like a 7:1 contrast ratio, sign language interpretation for all video content, and no time limits on any interactions. Very few commercial websites achieve full AAA compliance, and WCAG itself does not recommend AAA as a blanket target.
Our recommendation: target WCAG 2.1 AA from day one. It covers the requirements that matter most for usability, keeps you on the right side of legal requirements in both the US and EU, and is achievable without dramatically slowing down your development process. If specific pages serve users who need higher accessibility (medical portals, government services), target AAA for those pages specifically.
One important note: WCAG 2.2 was published in October 2023 and adds nine new success criteria. The most notable additions include focus appearance requirements (2.4.11), dragging alternatives (2.5.7), and accessible authentication (3.3.7). If you are building a new product, target WCAG 2.2 AA. The additional criteria are sensible and not difficult to implement from scratch.
The Ten Most Common Accessibility Violations
WebAIM's annual analysis of the top one million websites consistently finds the same violations year after year. Fixing these ten issues will resolve roughly 95% of accessibility problems on most sites.
- Missing alternative text on images. Every meaningful image needs an alt attribute that describes its content. Decorative images should use an empty alt="" to signal screen readers to skip them.
- Low color contrast. Text that does not meet the 4.5:1 ratio against its background is the single most common WCAG failure. Gray text on white backgrounds is the usual offender.
- Missing form labels. Every input field needs a programmatically associated label element. Placeholder text is not a substitute for a label.
- Empty links and buttons. Links that contain only an icon or image with no accessible name leave screen reader users stranded. Add aria-label or visually hidden text.
- Missing document language. The html element needs a lang attribute (like lang="en") so screen readers know which language to use for pronunciation.
- Empty headings. Headings that contain no text, or headings used purely for styling, break the document outline that screen reader users rely on for navigation.
- No skip navigation link. Without a "skip to main content" link, keyboard users must tab through your entire header and navigation on every single page load.
- Inaccessible custom components. Custom dropdowns, modals, and tabs that were built from div elements instead of native HTML often lack proper keyboard support and ARIA roles.
- Auto-playing media. Video or audio that plays automatically without user consent is disorienting for screen reader users and violates WCAG 1.4.2.
- Missing error identification. Form validation errors that only use color (red borders) to indicate problems are invisible to colorblind users. Errors need text descriptions.
The pattern here is clear. Most accessibility failures are not exotic edge cases. They are basic HTML hygiene that developers skip because they are moving fast. The good news: fixing these issues is straightforward once you know what to look for.
Building Accessibility Into Your Development Workflow
Bolting accessibility onto a finished product costs five to ten times more than building it in from the start. The key is making accessibility violations impossible to ignore during development, not something you audit after launch.
Linting and Static Analysis
Install eslint-plugin-jsx-a11y if you are using React. It catches missing alt text, invalid ARIA attributes, and non-interactive elements with click handlers at the code level. Your IDE will show warnings before you even save the file. For Vue, use eslint-plugin-vuejs-accessibility. Both are zero-config additions to your existing ESLint setup.
Automated CI Checks
Add axe-core to your CI pipeline. The @axe-core/playwright or @axe-core/puppeteer packages can run accessibility scans against rendered pages during your end-to-end test suite. Fail the build if any critical or serious violations are found. This catches issues that static analysis misses, like color contrast problems that only appear with certain theme combinations.
Design System Approach
Build accessibility into your component library. If your Button component always renders a proper button element with focus styles, every developer who uses it gets accessibility for free. If your Modal component traps focus and restores it on close, nobody has to remember to implement that behavior manually. Radix UI, Headless UI, and React Aria are excellent foundations for accessible component libraries.
Code Review Checklist
Add three questions to every PR review: Can I navigate this feature with a keyboard alone? Does every interactive element have a visible focus state? Would a screen reader user understand the content flow? These take seconds to check and catch the majority of issues that automated tools miss.
Testing Tools That Actually Help
Automated tools catch about 30% of accessibility issues. The other 70% require human judgment. Here is the testing stack we recommend.
Automated Scanning
axe DevTools is the industry standard browser extension. It scans the current page and categorizes issues by severity. The free version catches most common violations. The paid version adds intelligent guided testing and issue management. Run it on every page of your app before any major release.
Lighthouse includes an accessibility audit in Chrome DevTools. It uses axe-core under the hood but presents results in a simpler format with a 0-100 score. Useful for quick checks, but do not treat a 100 score as proof of full compliance. It only catches automated issues.
WAVE from WebAIM provides a visual overlay showing exactly where accessibility issues exist on the page. It is especially good for spotting structural problems like heading hierarchy gaps and missing landmarks.
Screen Reader Testing
You need to test with an actual screen reader at least once per feature. On Mac, VoiceOver is built in. On Windows, NVDA is free and excellent. On mobile, TalkBack (Android) and VoiceOver (iOS) are both built into the operating system. Spend 30 minutes learning the basic screen reader commands. Navigate your app without looking at the screen. The experience is often eye-opening.
Keyboard-Only Testing
Unplug your mouse. Navigate your entire app using only Tab, Shift+Tab, Enter, Space, and arrow keys. Can you reach every interactive element? Can you see where focus is at all times? Can you operate dropdown menus, modals, and date pickers? If the answer to any of these is no, you have keyboard accessibility issues that need fixing.
Budget two to four hours per sprint for manual accessibility testing. It sounds like a lot, but it is cheaper than a remediation project later.
Keyboard Navigation and Focus Management
Keyboard accessibility is the foundation of all other accessibility. If a user cannot navigate your app with a keyboard, they cannot use it with a screen reader, voice control, or most other assistive technologies. Get keyboard navigation right and you solve half of your accessibility problems.
Tab Order
The tab order should follow the visual reading order of the page. Left to right, top to bottom in LTR languages. If your tab order jumps around the page unexpectedly, you probably have CSS that visually repositions elements without changing the DOM order. Fix the DOM order instead of using tabindex values greater than 0. Setting tabindex="1" or higher creates a parallel tab order that causes more problems than it solves.
Focus Trapping in Modals
When a modal dialog opens, focus must move into the modal and stay there until the modal closes. Tab should cycle through the interactive elements inside the modal, not escape to the page behind it. When the modal closes, focus should return to the element that triggered it. Libraries like Focus Trap and Headless UI handle this automatically.
Skip Navigation Links
Add a "Skip to main content" link as the first focusable element on every page. It should be visually hidden until focused, then become visible. This lets keyboard users bypass your navigation menu on every page. The implementation is simple: an anchor link pointing to the main content area, styled with CSS to appear only on focus.
Focus Indicators
Never add outline: none to your CSS without providing an alternative focus indicator. The default browser focus ring is not pretty, but removing it without a replacement makes your site unusable for keyboard users. Use :focus-visible instead of :focus to show focus rings only for keyboard navigation, not mouse clicks. Design custom focus indicators that are visible against all background colors in your app. A 2px solid outline with a contrasting color and a small offset works well in most designs.
Color, Typography, and Responsive Design
Visual design choices have a direct impact on accessibility. Color, font size, spacing, and responsive behavior all affect whether users can perceive and interact with your content.
Color Contrast
WCAG 2.1 AA requires a contrast ratio of at least 4.5:1 for normal text and 3:1 for large text (18px bold or 24px regular). Use a tool like the WebAIM Contrast Checker or Stark (a Figma plugin) to verify contrast ratios during design, not after development. The most common failure is light gray text on white backgrounds, often used for "secondary" or "muted" text. If you need to de-emphasize text, use smaller font size instead of lower contrast.
Font Sizing and Scaling
Use rem or em units for font sizes, not pixels. This allows users who have set a larger default font size in their browser to see your text at their preferred size. WCAG requires that text can be resized up to 200% without loss of content or functionality. If your layout breaks at 200% zoom, you have a compliance issue. Test by zooming to 200% in your browser and checking that all content remains readable and no horizontal scrolling is required.
Touch Targets
WCAG 2.2 requires touch targets of at least 24x24 CSS pixels (criterion 2.5.8). Apple recommends 44x44 points, and Google recommends 48x48dp. For mobile apps, go with the platform recommendation. Small tap targets frustrate everyone, not just users with motor disabilities. Spacing between adjacent targets matters too. Two small buttons right next to each other lead to frequent mis-taps.
Responsive Behavior
Responsive design and accessibility are deeply connected. Content must reflow at 320px width without horizontal scrolling (WCAG 1.4.10). This means no fixed-width layouts, no content that disappears at small viewports, and no horizontal data tables that require scrolling. Mobile-first design naturally satisfies most of these requirements.
ARIA: When to Use It and When to Avoid It
ARIA (Accessible Rich Internet Applications) is a set of HTML attributes that provide additional semantics for assistive technologies. It is powerful, frequently misused, and often unnecessary.
The first rule of ARIA is: do not use ARIA if you can use native HTML instead. A button element is always better than a div with role="button". A nav element is always better than a div with role="navigation". Native HTML elements come with built-in keyboard handling, screen reader announcements, and browser behavior that you would have to manually replicate with ARIA.
When ARIA Is Necessary
ARIA becomes essential for custom interactive components that have no native HTML equivalent. Tab panels, tree views, comboboxes with autocomplete, and live regions that announce dynamic content changes all require ARIA to be accessible. If you are building a custom component that does not map to a native HTML element, you need ARIA roles, states, and properties.
Common ARIA Mistakes
- Redundant roles. Adding role="button" to a button element or role="link" to an a element is unnecessary and can actually cause problems with some screen readers.
- Missing required children. Some ARIA roles require specific child roles. A role="tablist" must contain elements with role="tab". A role="menu" must contain role="menuitem" elements.
- Broken aria-labelledby references. If the ID referenced by aria-labelledby does not exist on the page, the element ends up with no accessible name at all. Worse than no ARIA.
- Using aria-hidden="true" on focusable elements. This tells screen readers to ignore an element while keyboard users can still focus it. The result is a confusing ghost element.
The Cost to Remediate
If your existing app has significant accessibility issues, expect the remediation to take four to eight weeks for a mid-sized application, depending on the severity of violations. Budget $15,000 to $40,000 for a thorough audit and remediation by experienced accessibility developers. The investment pays for itself through reduced legal risk, expanded market reach, and improved SEO performance.
Building accessibility into a new product from scratch adds roughly 10 to 15% to your development timeline. That is a fraction of the cost of retrofitting. If you are starting a new project, build it right from day one. Book a free strategy call to discuss how we can help you build an accessible product without slowing down your launch.
Need help building this?
Our team has launched 50+ products for startups and ambitious brands. Let's talk about your project.