Skip to content
easeweb
Search topics

Checkouts that take payment with no review or undo

A booking form charges a saved card the moment Pay is pressed, and the tickets can't be refunded, so a slip in the date or the number of tickets is paid for with nothing to check it before or undo it after.

WCAG 2.2
SC 3.3.4AA
Required by
Section 508 · EN 301 549 (EU)
Broken
The accessibility problem illustrated: Reach, strength:I wanted 1 ticket. How do I undo this?
01

The problem

People who slip when they type, tap or speak pay for tickets they didn't mean to buy, with no chance to see the mistake first or take it back after.

02

Try it

Book 1 ticket for Friday, but let your hand slip: set Tickets to 2. Then pay.

Does anything show you the slip before the money goes, or let you take it back after?

Broken Can you fix this?

Book tickets

Paid with your saved card ending 4242. Tickets can't be refunded or exchanged.

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Read the order back before the charge, or let people cancel it within a stated time.

  1. 1Never let one press place an order, take a payment or sign an agreement with no way to check it first or cancel it after.
  2. 2Read the choices back in words, with a way to change each one, or state how long people have to cancel.
  3. 3Name what the final button commits to, with the total.
Before Pay now charges the card at once
<form method="post" action="/book">  <label for="night">Performance</label>  <select id="night" name="night">    <option>Friday 13 November, 7:30 pm</option>    <option>Saturday 14 November, 7:30 pm</option>  </select>  <label for="tickets">Tickets ($24 each)</label>  <input id="tickets" name="tickets" type="number" value="1">  <p>Paid with your saved card ending 4242. Tickets can't be refunded or exchanged.</p>  <button type="submit">Pay now</button></form>
After

A step to check the booking before paying

<!-- Step 1: the same form, but Continue only saves the choices --><form method="post" action="/book/review">  <label for="night">Performance</label>  <select id="night" name="night">    <option>Friday 13 November, 7:30 pm</option>    <option>Saturday 14 November, 7:30 pm</option>  </select>  <label for="tickets">Tickets ($24 each)</label>  <input id="tickets" name="tickets" type="number" value="1">  <p>Paid with your saved card ending 4242. Tickets can't be refunded or exchanged.</p>  <button type="submit">Continue</button></form>

Fixing this with an AI coding assistant? Get this guide as Markdown, or get every guide in your coding agent.

04

Verify the fix

5 checks, no mouse.

Test with: Keyboard, Screen reader, Zoom, Touch

0 of 5 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the checkout's steps or its payment provider change.

Limits

This is a starting pattern, not a guarantee for every process. The example is a ticket booking; shops, subscriptions, loans, applications and tests need the same check at the step that commits. 3.3.4 doesn't ask for a confirmation every time someone saves or edits their own data, only where a mistake would be costly or hard to undo. Test the complete process, including the emails it sends, with the people and tools your users rely on.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work