
Shopify Checkout Accessibility Guide: WCAG for Standard + Plus + Hydrogen
Shopify checkout in 2026 ships in three architectures with very different accessibility surface areas: the standard one-page checkout (used by every non-Plus merchant and most Plus merchants), checkout extensibility on Plus (Polaris-component-driven UI extensions), and Hydrogen (merchant-built React storefronts using Shopify's Cart API). This guide covers the WCAG checklist for each, the customization patterns that introduce accessibility risk, and the source-code patterns that fix them.
The three checkout architectures
1. Standard checkout (every Shopify merchant)
Shopify's native one-page checkout, served at checkout.shopify.com or the merchant's checkout subdomain. Renders a single page with three sections (Customer / Shipping / Payment) progressively revealed. Built by Shopify, accessibility-engineered against WCAG 2.1 AA.
Merchant accessibility surface: limited. The merchant controls:
- Branding (logo, colors via theme settings + Shop Pay branding API).
- Custom order-status-page content.
- Custom email templates.
- Cart attributes / line-item properties added from the cart page.
Where regressions appear: custom branding that produces sub-4.5:1 contrast; custom order-status-page Liquid content with sensory-only instructions; custom email templates that ignore alt text; cart attributes added via merchant scripts that lack labels.
2. Checkout extensibility (Shopify Plus)
Plus merchants add UI to the standard checkout via Checkout UI Extensions. Extensions are built with the Polaris design system's checkout components — <TextField>, <Button>, <Banner>, <Choice> — which pass accessibility by default.
Merchant accessibility surface: bounded. Extension authors get:
- Polaris components (accessibility-engineered).
- Limited DOM access (extensions render in iframes for security).
- Configuration-driven layout, not raw HTML.
Where regressions appear: extension authors who bypass Polaris components and ship raw HTML/CSS/JS via the available escape hatches; extensions that capture focus on mount without warning; auto-submitting forms; extensions that announce errors visually but not via aria-live.
3. Hydrogen checkout (custom storefront)
Hydrogen storefronts use Shopify's Cart and Checkout APIs but render the checkout UI in merchant-built React. Every WCAG criterion is the merchant's responsibility because every pixel is the merchant's code.
Merchant accessibility surface: full. Everything matters:
- Form labels, autocomplete attributes, error identification, error suggestion.
- Keyboard navigation across multi-step flows.
- Focus management between steps.
- Status messages for async updates (shipping rates, taxes, payment processing).
- Color contrast across every component.
- Mobile tap-target sizing.
Where regressions appear: everywhere. Hydrogen merchants ship custom checkout designs that frequently miss the WCAG basics — not because they don't care, but because the standard Shopify checkout was hiding the work for them.
The WCAG checklist — every checkout architecture
For each item below, the criterion applies across all three architectures unless explicitly noted.
Form labels — every input
WCAG 3.3.2 Labels or Instructions (Level A): every form input must have a programmatic label. Not just placeholder text — placeholder disappears as soon as the user types and screen readers do not always announce it.
Pattern:
<label for="ship-postal">Postal code</label>
<input id="ship-postal" name="postal_code" autocomplete="postal-code" type="text" required>
Standard checkout: handled by Shopify. Extensibility: handled by Polaris <TextField>. Hydrogen: merchant must implement.
Autocomplete — every user-info input
WCAG 1.3.5 Identify Input Purpose (Level AA): user-info fields must declare their purpose via autocomplete. Standard values: email, tel, name, given-name, family-name, street-address, address-line1, address-line2, postal-code, country, cc-number, cc-exp, cc-csc.
See the full glossary entry for the complete list.
Standard checkout: handled. Extensibility: handled by Polaris <TextField autocomplete="...">. Hydrogen: merchant must implement on every input.
Error identification + suggestion
WCAG 3.3.1 Error Identification (Level A) + 3.3.3 Error Suggestion (Level AA): when input is invalid, identify the field in error and describe what is wrong + how to fix it.
Pattern:
<label for="ship-email">Email</label>
<input id="ship-email" type="email" autocomplete="email"
aria-invalid="true" aria-describedby="ship-email-error">
<p id="ship-email-error" role="alert">
Email is invalid — use the format [email protected].
</p>
The aria-invalid="true" flips on when validation fails. The aria-describedby connects the field to the error message. The role="alert" ensures screen readers announce the error immediately.
Keyboard operability — every interactive element
WCAG 2.1.1 Keyboard (Level A): every checkout control reachable and operable via keyboard alone. WCAG 2.4.7 Focus Visible (Level AA): visible focus indicator on every focusable element.
Common Hydrogen failures: custom date-of-birth inputs implemented as scrollable lists rather than native date pickers; custom country selectors that do not handle Arrow keys; "place order" buttons that are styled <div> elements instead of <button>.
Status messages — async updates
WCAG 4.1.3 Status Messages (Level AA): every async update — "Shipping rates updated", "Tax calculated", "Discount applied", "Payment processing..." — must be announced by screen readers without requiring focus to move into the message.
Pattern:
<div role="status" aria-live="polite">
<span>Shipping calculated: $5.99 USD standard, $14.99 USD express</span>
</div>
Or use the convenience role: <div role="status"> is implicitly aria-live="polite". For time-critical errors (payment failed, address invalid), use role="alert" (implicitly aria-live="assertive").
See /glossary/aria-live for the full pattern.
Color contrast — every text-on-background pair
WCAG 1.4.3 Contrast Minimum (Level AA): 4.5:1 for body text, 3:1 for large text. WCAG 1.4.11 Non-text Contrast (Level AA): 3:1 for required UI component borders, focus indicators, and informative graphics.
Standard checkout: passes by default; merchant custom branding can introduce regressions. Extensibility: Polaris colors pass; merchant-overridden colors via theme settings can introduce regressions. Hydrogen: every color decision is the merchant's.
Tap-target size — mobile checkout
WCAG 2.5.8 Target Size Minimum (Level AA, WCAG 2.2): every tap target ≥24×24 CSS pixels.
Common failure: payment-method radio buttons rendered at 18×18 pixels in a tight horizontal layout. Easy to miss on touch input; fails 2.5.8.
Skip link / landmark structure
WCAG 2.4.1 Bypass Blocks (Level A) + 1.3.1 Info and Relationships (Level A): a skip link to the main content + correct landmark structure (<header>, <main>, <form>, <footer>).
Standard checkout: handled. Extensibility: handled by checkout host structure. Hydrogen: merchant must add a skip link + correct landmark elements.
Accessible authentication
WCAG 3.3.8 Accessible Authentication Minimum (Level AA, WCAG 2.2): no cognitive function tests in the login flow. CAPTCHA must have an alternative; password fields must allow paste.
Common failure: custom Hydrogen login that blocks paste on the password field with onpaste="return false". Standard Shopify customer accounts handle this correctly.
The audit + fix workflow
- Run the free AccessComply scan on the cart page, the checkout page (or your Hydrogen route), and the order-status page. The scan reports per-criterion failures with the exact CSS selector.
- Fix at the source-code level:
- Standard checkout: adjust theme settings (colors, typography), edit cart-attribute scripts, edit order-status-page Liquid.
- Extensibility: replace raw-HTML escape hatches with Polaris components; add
aria-liveto async-update zones. - Hydrogen: add labels, autocomplete, aria-describedby error messages, role="status" live regions to every form + async update.
- Verify with a re-scan. The previously-flagged criteria should be resolved.
- Document the remediation on the accessibility statement page on the storefront.
- Run quarterly re-scans to catch regressions from theme updates, third-party app changes, or new merchant content.
Common Shopify Plus checkout pitfalls
- Custom JavaScript in cart-attribute scripts that introduces unlabeled inputs — Plus merchants frequently add line-item-property forms via Liquid scripts that ship without labels. Audit at the cart page level.
- Order-status-page custom content with sensory-only instructions — "Use the green button to track your order". Pair the color cue with the canonical button text.
- Checkout UI Extensions that bypass Polaris — extension authors with the "raw-HTML escape hatch" enabled frequently ship inaccessible custom UI. The fix is to use Polaris components.
- Custom email templates with no alt text on logos / promo images — checkout confirmation emails are part of the checkout flow per EAA scope. Add alt text to every image.
Quick checklist
- Every form field has a programmatic label + correct
autocompletevalue. - Every error message is identified by
aria-describedby+role="alert". - Every async status update is wrapped in
role="status"(polite) orrole="alert"(assertive). - Every interactive element is keyboard-operable + has visible focus.
- Every text + background pair passes 4.5:1 (3:1 for large text).
- Every UI component border passes 3:1 against adjacent colors.
- Every mobile tap target is ≥24×24 CSS pixels.
- Custom branding does not break Shopify's default contrast.
- Order-status-page custom content uses non-sensory instructions.
- Hydrogen storefronts include skip-nav + correct landmark structure.
Further reading
- Shopify Checkout Extensibility documentation
- Shopify Polaris design system
- Hydrogen documentation
- WCAG 1.4.3 Contrast (Minimum)
- WCAG 3.3.2 Labels or Instructions
- WCAG 4.1.3 Status Messages
- WCAG 3.3.8 Accessible Authentication
- Glossary — aria-live
- Glossary — HTML autocomplete
- AccessComply — Shopify accessibility complete guide
Scan your store free, fix violations at the source
AccessComply scans your Shopify store for ADA + EAA / WCAG 2.1 + 2.2 AA violations and applies real source-code fixes — no overlays, no widgets.