Skip to main content
ADA Store Fix

Turn your client’s Shopify store into a documented remediation, without chasing a freelance developer.

You handle the case. We handle the store’s code. We map each allegation to the specific change made, usually within 5 business days (2 business days on rush), and hand you a report you can read in minutes and attach to your file.

See a sample report

Reply within 1 business day. No sales call.

Terms at a glance

Scope
Shopify theme code: Liquid, HTML, CSS, ARIA and JavaScript.
Free theme scan
Reply within 1 business day of the complaint and the store address.
Fix
Usually 5 business days from payment and theme collaborator access, with an estimated delivery date on every quote. Rush: 2 business days, standard themes only, subject to availability, confirmed on the quote.
Price
$1,250 fixed for a standard theme, paid in full upfront by your client. Rush adds $2,000 ($3,250 in total). Complex themes get a custom quote within 2 business days.
Engagement
Your client hires us and pays. We take direction from you, with your client’s consent, and share the report with you. No retainer, no minimum volume and no exclusivity.
Deliverable
A technical remediation and allegation mapping report, and a ready-to-publish accessibility statement page.
Refund
Full refund if we cannot start or deliver. If the final re-test still finds critical or serious issues in theme code we can change, we fix them free or refund the fix. Claims within 30 days of delivery.
Boundaries
Not a law firm. No legal advice. No statement of compliance. Checkout, third-party apps and Shopify-owned components are outside scope.

What you get, and when

  1. Today

    Send the complaint and store address

    Through the form or by email. We use it only to scope the work.

  2. Within 1 business day

    Free theme scan

    Which allegations appear to sit in theme code, which belong to apps or Shopify, the fixed price and a delivery date.

  3. Usually within 5 business days

    Fix on an unpublished copy

    Counted from payment and collaborator access. The live store is not touched. Rush takes 2 business days, standard themes only, subject to availability.

  4. At delivery

    Mapping report for your file

    Each allegation mapped to the change and the test result, with scope boundaries stated plainly. Your client decides when to publish.

A report written for the file

  1. Allegation-to-change table, paragraph by paragraph.
  2. WCAG 2.1 criteria involved for each item.
  3. Test environment: axe-core, VoiceOver with Safari on macOS, keyboard walk-through.
  4. Explicit boundaries: checkout, apps, and no statement of legal compliance.
  5. A ready-to-publish accessibility statement page for the store.

The sample is dated Oct 28 2026 and is fictional. The case number, store and results are invented, to show the format.

One allegation, one documented change.

The allegation is on the left, in plain English. The code change that addresses it is on the right. This is the mapping you receive for your client’s store.

Slide-out cart trap

Allegation (representative language)

Plaintiff using VoiceOver could not close the slide-out cart drawer or reach checkout using keyboard navigation.

WCAG 2.1.2 No Keyboard Trap, 2.4.3 Focus Order, 4.1.2 Name, Role, Value

What we change

The drawer becomes a real dialog with an accessible name. Focus moves in when it opens, Tab stays inside, Escape closes it, and focus returns to the cart button.

The wording is representative of common complaint patterns, not a quote from a filed case.

snippets/cart-drawer.liquid
<div id="CartDrawer" class="cart-drawer"Removed:      tabindex="-1">Added:      role="dialog" aria-modal="true"Added:      aria-labelledby="CartDrawer-Title" tabindex="-1">Removed:   <h2 class="cart-drawer__title">Your cart</h2>Added:   <h2 id="CartDrawer-Title" class="cart-drawer__title">Your cart</h2>Removed:   <div class="cart-drawer__close" onclick="closeCart()">&times;</div>Added:   <button type="button" class="cart-drawer__close" data-cart-closeAdded:           aria-label="Close cart">&times;</button></div>Added: <script>Added:   drawer.addEventListener('keydown', (e) => {Added:     if (e.key === 'Escape') closeCart();   // returns focus to triggerAdded:     if (e.key === 'Tab') trapFocus(e, drawer);Added:   });Added: </script>
A sample. Simplified code from a fictional store. Your theme’s markup will differ.

Unlabeled variant swatches

Allegation (representative language)

Size and color radio inputs lacked programmatic labels and state announcements.

WCAG 1.3.1 Info and Relationships, 3.3.2 Labels or Instructions, 4.1.2 Name, Role, Value

What we change

Each option set gets a fieldset and legend. Every radio input is tied to a label, and the selected state is announced by the input itself.

The wording is representative of common complaint patterns, not a quote from a filed case.

snippets/product-variant-picker.liquid
Removed: <div class="swatches">Removed:   {% for value in option.values %}Removed:     <input type="radio" name="{{ option.name }}" value="{{ value }}">Removed:     <span class="swatch" style="background: {{ value | handleize }}"></span>Removed:   {% endfor %}Removed: </div>Added: <fieldset class="swatches">Added:   <legend class="visually-hidden">{{ option.name }}</legend>Added:   {% for value in option.values %}Added:     {%- assign id = section.id | append: "-" | append: option.position | append: "-" | append: forloop.index -%}Added:     <input type="radio" id="{{ id }}" name="{{ option.name }}"Added:            value="{{ value | escape }}" {% if option.selected_value == value %}checked{% endif %}>Added:     <label for="{{ id }}" class="swatch">Added:       <span class="visually-hidden">{{ value }}</span>Added:     </label>Added:   {% endfor %}Added: </fieldset>
A sample. Simplified code from a fictional store. Your theme’s markup will differ.

Silent sale price

Allegation (representative language)

Screen reader announced both the crossed-out compare-at price and the sale price as a single unlabeled number.

WCAG 1.3.1 Info and Relationships, 1.4.1 Use of Color

What we change

Visually hidden text labels each price. Sighted shoppers see the same design, and screen reader users hear "Regular price" and "Sale price".

The wording is representative of common complaint patterns, not a quote from a filed case.

snippets/price.liquid
Removed: <s class="price__compare">{{ product.compare_at_price | money }}</s>Removed: <span class="price__sale">{{ product.price | money }}</span>Added: <s class="price__compare">Added:   <span class="visually-hidden">Regular price:</span>Added:   {{ product.compare_at_price | money }}Added: </s>Added: <span class="price__sale">Added:   <span class="visually-hidden">Sale price:</span>Added:   {{ product.price | money }}Added: </span>
A sample. Simplified code from a fictional store. Your theme’s markup will differ.

The same change, on screen

The slide-out cart change above, shown on a fictional demo store that we built broken on purpose.

The cart drawer of a fictional demo store, before and after the fix

Before

Fictional store, broken on purpose
The cart drawer of a fictional demo store, open. No keyboard focus ring is visible anywhere on the page.
  • Keyboard focus is on the Home link in the footer, behind the cart. Nothing on screen shows it.
  • The cart has no name and no role, so a screen reader does not announce it.
  • The close control is not a real button, so the keyboard cannot reach it. Escape does nothing.

After the fix

Same fictional storeFixed
The same fictional demo store after the fix. A blue ring shows keyboard focus on the Close cart button of the open cart.
  • Enter moves focus into the cart. Tab lands on Close cart, and a ring shows where focus is.
  • The cart is a dialog named “Your cart”, so a screen reader announces it.
  • Escape closes the cart and focus goes back to Add to cart.
Fictional demo store, built for this page. The “before” version is broken on purpose to show the kind of problem a complaint describes. It is not a copy of any real store or theme. Both pictures show the same two key presses: Enter on Add to cart, then Tab.

Who is behind ADA Store Fix

Built around the complaint

Every fix starts from the complaint itself: each allegation is read, then matched to the part of your store it describes.

Carried out by engineers

Experienced engineers carry out and test every fix on a copy of your theme, so your live store is never touched.

Not a law firm

We give no legal advice. We are not connected to any plaintiff or plaintiff’s law firm, and we do not act for anyone on the other side of your case.

We ask for Shopify collaborator access limited to the Themes permission. We never need your password.

1202 E Walnut St, Santa Ana, CA 92701
hello@adastorefix.com

Questions from counsel

We are an engineering service, not a law firm. We do not give legal advice, we do not promise any legal outcome, and we do not state that a site is compliant, immune from suit or certified. We fix theme code and document what we did. Third-party apps, Shopify-owned components and Shopify-hosted checkout are outside our scope.

Your client, the merchant, is our customer and pays upfront. We work with you at the client’s direction and share the mapping report with you.

You and your client. We work on an unpublished duplicate of the theme and never publish to the live store. Timing is a decision for counsel.

No. We state what we changed and what we tested, on the test date. Whether that satisfies a claim is your call, not ours.

Shopify-hosted checkout and third-party app code (which runs on the vendor’s servers, outside the theme) are outside our fix and our refund. We do not leave counsel guessing. If an allegation points at a third-party app widget (a reviews carousel, a popup, a subscription box), the report names the app where we can identify it, records what we could isolate or switch off in the copy of the theme to confirm the source, and keeps those items apart from the theme-code fixes, so it is clear which parts belong to the vendor. We recommend a ticket to the vendor.

We are not connected to any plaintiff or plaintiff’s law firm, and we do not act for anyone on the other side of your case.

No. Each store is a standalone fixed-fee engagement ($1,250 for a standard theme), agreed with the merchant. There is no retainer, no minimum volume and no exclusivity.

Send a complaint. Get a scope in 1 business day.

Free and without obligation. Or email hello@adastorefix.com.

$1,250 fixed
Reply within 1 business day

Sample report, fictional case and store

Technical remediation and allegation mapping report

Sample report. The case, the store and the results are invented, to show the format.

Case number
0:00-cv-00000 (sample)
Report date
Oct 28 2026
Store
[Redacted apparel store]
Theme
Sample theme v1.0 (fictional)
Standard
WCAG 2.1 Level AA

Result summary

Before: 11 automated issues (3 critical, 4 serious, 4 moderate).
After: 0 critical or serious issues in theme code we could change.

Allegation to change mapping

Each allegation, the WCAG criteria, the theme file, the change made and the re-test result
# Allegation WCAG File Change Re-test
1 ¶ 14: Plaintiff could not close the slide-out cart or reach checkout by keyboard. 2.1.2, 4.1.2 snippets/cart-drawer.liquid ASF-0001: Added a dialog role and name, a focus trap, Escape to close, and focus return. axe-core clean. VoiceOver: the cart opens, keeps focus, closes, and returns focus.
2 ¶ 15: Size and color options had no programmatic labels or state. 1.3.1, 3.3.2, 4.1.2 snippets/product-variant-picker.liquid ASF-0002: Wrapped options in fieldset and legend, tied each input to a label. axe-core clean. Screen readers announce group, option and selected state.
3 ¶ 16: Sale price and compare-at price read as one unlabeled number. 1.3.1 snippets/price.liquid ASF-0003: Added visually hidden "Regular price" and "Sale price" labels. axe-core clean. Both prices announced with labels.
4 ¶ 17: Product images missing text alternatives. 1.1.1 sections/main-product.liquid ASF-0004: Output product alt text in the gallery, with a fallback to the product title. axe-core clean. Images announced with meaningful text.

Test environment

Automated
axe-core (latest 4.x release at test date), run on every template
Screen reader
VoiceOver with Safari on macOS
Keyboard
Full keyboard-only walk-through of home, collection, product and cart
Standard
WCAG 2.1 Level AA technical criteria

Scope boundaries

  • Shopify-hosted checkout is outside the scope of theme remediation and is not covered by this report.
  • Third-party app output (for example a reviews widget) is outside our scope. Where the app causes an allegation, we name the app where we can identify it, record what we could isolate or switch off in the copy of the theme, keep it apart from the theme-code fixes, and recommend a ticket to the app vendor.
  • This report documents the state of the theme on the test date. It does not state or imply legal compliance or any legal outcome.

Sample report, fictional data, dated Oct 28 2026. Names, case number and results are invented to show the format. ADA Store Fix is an engineering remediation service, not a law firm. We do not provide legal advice or legal representation, and we do not promise any legal outcome. We work alongside your qualified defense counsel.

Open the PDF (opens in a new tab)Open the printable page

Free theme scan

We scan your theme and reply within 1 business day. No sales call. Please do not include passwords or privileged legal advice.

The address your customers use, or your .myshopify.com address.

Your situation (required)
How fast?

We copy them on our reply if you add it here.

Court and case number, if you have it.

Court district, deadlines, or anything else.

How we use your details