Holiday sales, countdown timers, pop-ups and time limits: an accessibility check for small business sites
How to run a Black Friday or holiday sale on a small business website without locking customers out: plain-text deadlines, a countdown people can hide, cart and booking time limits that warn and extend, keyboard-friendly pop-ups, announced cart messages, platform notes and a 10-minute check.
Holiday shopping starts earlier every year, and many small business sites now add a countdown timer, a sale pop-up, a sticky announcement bar and a "your cart is reserved for 10 minutes" message in November. Each of these can quietly lock some customers out. A timer that ticks every second interrupts screen readers and distracts people who find movement hard to ignore. A cart or booking hold that expires without warning pushes out people who type slowly, use a switch device or need longer to read. A pop-up that grabs the screen and can't be closed with the keyboard ends the visit. None of this means dropping your sale. It means a few small changes so every customer can actually buy.
1. Write the deadline as plain text
A ticking timer is the least useful way to tell someone when a sale ends. Put the end date and time in a normal sentence first, so screen reader users, people using translation and anyone who reads slowly all get it. The timer, if you keep one, is extra.
2. If you keep a countdown, let people hide it and keep it quiet
Content that moves or updates on its own for more than 5 seconds next to other content needs a way to pause, stop or hide it (2.2.2 Pause, Stop, Hide). A countdown updating every second counts. Keep the timer out of live announcements, or screen readers will try to read it every second.
<div class="sale-bar">
<p><strong>Holiday sale: 20% off everything.</strong>
Ends Monday, November 30 at 11:59 pm Central.</p>
<p id="sale-timer" aria-hidden="true">Ends in <span id="sale-left"></span></p>
<button type="button" id="sale-hide">Hide countdown</button>
</div>
<script>
const end = new Date("2026-12-01T05:59:00Z"); // Nov 30, 11:59 pm Central
const left = document.getElementById("sale-left");
const timer = document.getElementById("sale-timer");
const hide = document.getElementById("sale-hide");
function tick() {
const ms = end - Date.now();
if (ms <= 0) { timer.textContent = "This sale has ended."; return; }
const d = Math.floor(ms / 86400000), h = Math.floor(ms / 3600000) % 24,
m = Math.floor(ms / 60000) % 60;
left.textContent = d + " days " + h + " hours " + m + " minutes";
}
tick();
const id = setInterval(tick, 60000); // once a minute, not every second
hide.addEventListener("click", () => {
clearInterval(id); timer.hidden = true; hide.hidden = true;
});
</script>
The offer, date and time are example details; use your own. The sentence above the timer carries the real information, the timer is hidden from screen readers with aria-hidden, it updates once a minute instead of every second, and the button stops and hides it. A countdown that also blinks or flashes needs to go.
3. Time limits on carts, bookings and forms: warn and extend
If your shop, booking tool or checkout holds an item or a session for a set time, people must be able to turn the limit off, adjust it, or extend it with a simple action when warned at least 20 seconds before it runs out (2.2.1 Timing Adjustable). The end of a real sale is a real-world deadline, so the sale itself can end when it ends; it's the hidden timers inside your site that need fixing.
- Show the hold time in text at the start ("We'll hold your order for 15 minutes. You can add more time.").
- Before it runs out, show a warning with a "Give me more time" button that works with the keyboard and is announced to screen readers.
- If it does run out, keep what people typed so they don't have to start again.
- Ask your shop, booking or ticketing platform whether its holds can be extended. If not, offer a phone or email way to order during the sale.
<div role="alertdialog" aria-modal="true" aria-labelledby="hold-title" aria-describedby="hold-text"> <h2 id="hold-title">Need more time?</h2> <p id="hold-text">Your cart is held for 2 more minutes.</p> <button type="button" id="hold-extend">Give me 15 more minutes</button> </div>
This is the shape of a warning, with example times. Move keyboard focus to the button when it opens and back to where the person was when it closes. Most shop and booking platforms build this for you, so check theirs before adding your own.
4. Sale pop-ups and sticky bars
- Closable with the keyboard. The close button must be a real button with a name ("Close"), reachable with Tab and Escape, and focus must not get stuck inside (2.1.2 No Keyboard Trap).
- Not covering what people are using. Sticky announcement bars and chat bubbles must not hide the link or field that has keyboard focus (2.4.11 Focus Not Obscured (Minimum)). Tab through your checkout with the bar showing to check.
- Not on a timer. Pop-ups that appear after a few seconds, or on every page, interrupt screen reader users mid-sentence. Show one once, and remember when someone closed it.
- Honest wording. Write the offer and any conditions as text, not only in a banner image. See flyers, promo graphics and images of text.
Our cookie banners, pop-ups and chat widgets guide has the full pop-up checklist.
5. "Added to cart" and "Code applied" messages
When someone adds a gift to the cart or applies a discount code, the page often updates a small number or shows a message without moving focus. Screen reader users hear nothing. Put these messages in a status region so they're announced (4.1.3 Status Messages).
<p role="status" id="cart-status"></p>
<script>
// after the item is added or the code is accepted:
document.getElementById("cart-status").textContent =
"Added to cart: Gift card, $50. Cart total: 2 items.";
</script>
The product and amount are example text. Keep the status region on the page from the start and only change its text. If a code is rejected, say why in text ("This code expired on November 30") next to the field.
6. Where to change this on common platforms
- WordPress and WooCommerce: countdown and pop-up plugins vary a lot. Test each one with the keyboard, and choose one with a close button, a hide option and no auto-refresh every second. See WordPress fixes.
- Shopify: countdown and urgency apps are added as app blocks; check the app's settings for update frequency and a dismiss option, and put sale details in the announcement bar text. Shopify's own cart and checkout messages are worth testing with a screen reader too. See Shopify fixes.
- Squarespace, Wix and GoDaddy: use the built-in announcement bar and promotional pop-up settings, write the deadline in the text, and avoid adding third-party timer embeds you can't control. See Squarespace, Wix and GoDaddy.
- Webflow and AI-built sites: check any timer script for a hide button and the update interval, and make sure modals use a real button to close. AI builders often add a ticking timer and an auto-opening pop-up by default. See Webflow fixes and AI-built sites.
Settings and app names change often, so check your platform's or app's own help pages for the current option.
Common mistakes
- The sale end date appears only inside a ticking timer or a banner image.
- A timer that updates every second inside an
aria-liveregion, so screen readers chatter non-stop. - A cart or booking hold that expires with no warning and empties the cart.
- A pop-up that opens after 5 seconds on every page and has an "X" that isn't a real button.
- A sticky sale bar that covers the "Checkout" button or the focused field on a phone.
- "Added to cart" shown only as a changing number on a cart icon.
- Relying on an overlay widget's "stop animations" toggle instead of fixing the timer. See overlays vs real fixes.
A 10-minute check before your sale goes live
- Read the sale page without looking at the timer or banner images. Is the offer and the end date clear in text?
- If there's a countdown, can you hide or stop it? Does it blink?
- Close the sale pop-up using only the keyboard (Tab to the close button, Enter, or Escape). Does focus land somewhere sensible?
- Tab through the cart and checkout with the sticky bar showing. Can you always see where focus is?
- Add an item and apply a code with a screen reader on (VoiceOver or TalkBack). Do you hear a confirmation? See our screen reader test.
- Start a checkout or booking and wait. Do you get a warning and a way to add time before the hold runs out?
What a scan can and can't check here
Our scan is automated, so it finds only part of the barriers on the pages it visits. It can flag a pop-up close button with no name, buttons and fields without labels, and low contrast in text on announcement bars. It can't tell whether a timer can be paused, whether a cart hold warns people, whether a pop-up traps the keyboard, or whether "Added to cart" is announced, which is why the 10-minute check above matters. Our Fix-Pack reports include copy-paste fixes for your platform for what the scan finds.
Related: online store checkout, cookie banners, pop-ups and chat widgets, animation and motion, website accessibility checklist.
This is general technical guidance, not legal advice, and it doesn't certify compliance with the ADA or any law, or protect against claims.
Want the fixes written for you?
Start with a free homepage snapshot. The $149 Fix-Pack scans up to 10 pages and gives copy-paste fixes for your platform within 48 hours, with a 14-day refund promise. See a sample report first.
This is general technical guidance, not legal advice, and it does not certify compliance with the ADA or any law.
Listing events or selling tickets? See events calendar, registration and ticket pages.
Have an "Are you 21?" pop-up? See age gate accessibility.
Posting holiday hours or a closure notice? See announcement bars, holiday hours and closure notices.
Adding a newsletter or text-message signup box? See email newsletter and SMS signup forms.
Running a Black Friday or holiday sale? See promo codes, sale prices and sale banners.
Related guides
- Don't rely on colour alone: swatches, sale prices, stock status and form errors
- Tooltips, info icons and hover pop-ups: showing fees, sizes and help text to everyone
- Drag, swipe and slider controls: price filters, before-and-after photos and galleries everyone can use
- Site search that everyone can use: search boxes, suggestions and results pages
This guide is general technical information, not legal advice. Following it does not certify ADA or any legal compliance. Automated checks find only part of accessibility barriers.
Check your own site, then decide
- Free homepage snapshot. Your top 3 issues in about a minute. No signup, no card.
- $149 Fix-Pack, if you want the full list. Up to 10 pages scanned, issues ranked by impact, copy-paste fixes for your platform, delivered within 48 hours, plus one re-scan after you apply them.
Get my free snapshot Order the Fix-Pack – $149
14-day refund promise. See a sample report first. A technical report, not legal advice; automated checks find only part of accessibility barriers.