Free Shipping Threshold Messages: Progress Bars Nobody Can Hear
The free shipping threshold bar is the hardest working element in the modern cart. It nudges the basket up, it explains itself at a glance, and for a screen reader user it frequently does not exist. The bar is a div with a width percentage. The you are close message is often rendered the same way, a visual trick with no text underneath.
That is an information equity problem before it is a compliance one. Sighted shoppers get a live incentive with a number attached. Non visual shoppers get silence, then pay shipping that a $12 addition would have erased. WCAG has names for this: Information and Relationships (1.3.1), Use of Color (1.4.1) when the bar's meaning is colour alone, and Status Messages (4.1.3) for the updates that never announce.
Put the number in words, in the DOM
The remaining amount and the unlocked state both need to be real text in the page, updated as the cart changes. You have $12 to go for free shipping. Free shipping unlocked. Two sentences. They should be readable with styles off, findable by a screen reader's text navigation, and placed near the cart total where the decision happens.
Decorative bars can stay. Bars are good at showing proportion at a glance. The failure is only ever the bar instead of text. Build the text first, style the bar as its visual twin, and the two will stay honest with each other through redesigns.
Announce changes without nagging
Every quantity change near the threshold is a status update. Use a polite live region and announce threshold crossings and the remaining amount at sensible intervals, not every cent of a long climb. A shopper adding three items does not need three interruptions. They need one clear message when the state changes and an updated figure they can query.
Test the removal direction too. Dropping below the threshold after removing an item is the message users most need and implementations most often forget. Losing free shipping silently, then discovering it at payment, feels like a trick even when it is only an unannounced state change.
Do not let colour carry the meaning
Bars love to turn green at the threshold. Green is not a message. A user with colour vision deficiency gets a bar that changed somehow, and a screen reader user gets nothing at all if the text is missing. The unlocked state needs an icon with a text label, a wording change, or both. Some signal that survives greyscale.
While you are there, check the bar's contrast and its label association in your accessibility tree. Progressbar roles with no accessible name are a common audit finding on exactly this component. If you use the role, name it. If you cannot maintain the role properly, plain text plus a decorative bar is the more honest build.
The business case writes itself
Threshold messages lift average order value. That lift is currently only offered to shoppers who can see the bar. Making the message accessible is not charity work on a conversion feature; it is switching the feature on for the customers it was skipping.
Measure it the way you measure any cart change. Announce the message properly, then watch basket behaviour for assistive technology users as far as your analytics allow, and watch support contacts about unexpected shipping charges. Both numbers move in the direction you want. Compliance and conversion are rarely this aligned. Let them be.
Related reading
These earlier guides go deeper on connected questions: Cart Error Messages a Screen Reader Can Actually Use, Accessible Promo Code Fields: The Cart Step Everyone Fails Quietly, and Cart Drawer Focus: Where Focus Goes When the Drawer Opens and Closes.
Frequently asked questions
Is a visual progress bar alone enough for accessibility?
No. A bar conveys the amount through position and often colour, which fails users who cannot see it or cannot perceive the colour change. The remaining amount and the unlocked state must also exist as programmatic text, updated as the cart changes, so every shopper gets the same offer.
How often should threshold updates be announced?
Announce state changes, threshold crossed in either direction, and update the persistent text amount on every cart change so it is correct when queried. Constant live announcements for every small addition create noise and teach users to ignore the region. Polite, state focused updates are the working pattern.
Where should the threshold message sit in the cart?
Next to the totals, where the shipping cost itself is shown, and in a logical reading order close to the items that affect it. A message stranded at the top of a mini cart drawer, far from the total it changes, gets missed by keyboard and screen reader users moving through the page in order.
Does the threshold bar need a progressbar role?
Only if you can maintain its name and values correctly. A progressbar role with aria values that lag the real cart is worse than no role. Many strong implementations use live text for the message and treat the bar as decorative, hidden from assistive technology. That is a legitimate, often safer, build.