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.
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
-
Today
Send the complaint and store address
Through the form or by email. We use it only to scope the work.
-
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.
-
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.
-
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
- Allegation-to-change table, paragraph by paragraph.
- WCAG 2.1 criteria involved for each item.
- Test environment: axe-core, VoiceOver with Safari on macOS, keyboard walk-through.
- Explicit boundaries: checkout, apps, and no statement of legal compliance.
- 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.
<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()">×</div>Added: <button type="button" class="cart-drawer__close" data-cart-closeAdded: aria-label="Close cart">×</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> 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.
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> 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.
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> 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
- 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
- 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.
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 92701hello@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.
