WCAG 3.3.4 · Level AA · ADA Title II

Review and undo before submitting, under the ADA

Filings, payments, deletions and exams need undo, error checking or a review step before they become final.

When a mistake costs money, rights or data

Most typing errors are cheap. Some are not: a court filing sent with the wrong case number, a utility payment for the wrong amount, a permit application deleted for good, an online exam submitted with questions unanswered. WCAG 2.1 success criterion 3.3.4 (Level AA) applies to pages that cause legal commitments or financial transactions, that modify or delete user-controllable data, or that submit test responses. For those pages, at least one of three safeguards must hold:

  • Reversible: the submission can be undone.
  • Checked: the data is checked for input errors and the user can correct them.
  • Confirmed: there is a way to review, confirm and correct information before finalizing.

You need one, not all three. The criterion applies by category, not by severity. Routine saves usually satisfy it through the Checked or Reversible safeguard, so each save of a profile page does not need a confirmation, and logs or analytics are not "user-controllable data".

Where this bites on public sites (ADA angle)

E-filing, tax and fee payments, benefit applications, school district enrollment and assessments sit squarely in scope. A person who transposes digits, whose assistive technology submits a form early, or who presses Enter in the wrong place has the most to lose. The Title II rule expects these services to meet WCAG 2.1 AA, which includes this criterion. Where a third-party vendor runs the payment step, see vendors and third-party content.

Web code: filing, deletion, payment, exam

Court e-filing with no review

Incorrect
<form action="/efile/submit" method="post">
  <!-- every field -->
  <button type="submit">Submit filing</button>
</form>
Correct
<!-- Step 3 of 3 -->
<h2>Review your filing</h2>
<dl>
  <dt>Case number</dt><dd>2026-CV-04412</dd>
  <dt>Document</dt><dd>Motion to continue.pdf</dd>
</dl>
<a href="/efile/edit">Change details</a>
<form action="/efile/submit" method="post">
  <input type="checkbox" id="ok" required>
  <label for="ok">I have checked the details above.</label>
  <button type="submit">Submit filing</button>
</form>

Deleting an uploaded permit document

Incorrect
delBtn.addEventListener("click", () => {
  fetch(`/api/documents/${id}`, { method: "DELETE" });
});
Correct
<dialog id="confirm-del">
  <p>Delete "site-plan.pdf"? This cannot be undone.</p>
  <button type="button" id="cancel-del">Keep file</button>
  <button type="button" id="really-del">Delete file</button>
</dialog>
<script>
  const dlg = document.getElementById("confirm-del");
  delBtn.onclick = () => dlg.showModal();
  document.getElementById("cancel-del").onclick = () => dlg.close();
  document.getElementById("really-del").onclick = () => {
    fetch(`/api/documents/${id}`, { method: "DELETE" });
    dlg.close();
  };
</script>

Online exam submitted with blanks

Incorrect
<button type="button" id="finish">Finish exam</button>
<script>finish.onclick = () => submitAnswers();</script>
Correct
<button type="button" id="finish">Review and finish</button>
<script>
  finish.onclick = () => {
    const blank = answers.filter(a => !a.value).length;
    reviewText.textContent = blank
      ? `${blank} questions are unanswered. Go back or submit anyway.`
      : "All questions answered. Submit when ready.";
    reviewDialog.showModal();     // contains Go back and Submit exam buttons
  };
</script>

Mobile code: SwiftUI and Jetpack Compose

Incorrect
// SwiftUI
Button("Pay $84.20") { Task { await pay(amount) } }
Correct
// SwiftUI
Button("Review payment") { showReview = true }
  .confirmationDialog("Pay $84.20 to Acme Water?", isPresented: $showReview) {
    Button("Pay $84.20") { Task { await pay(amount) } }
    Button("Change amount", role: .cancel) {}
  }
Incorrect
// Jetpack Compose
Button(onClick = { submitFiling() }) { Text("Submit filing") }
Correct
// Jetpack Compose
Button(onClick = { showConfirm = true }) { Text("Review filing") }

if (showConfirm) {
  AlertDialog(
    onDismissRequest = { showConfirm = false },
    title = { Text("Submit filing?") },
    text = { Text("Case 2026-CV-04412, Motion to continue.") },
    confirmButton = { TextButton(onClick = { submitFiling() }) { Text("Submit") } },
    dismissButton = { TextButton(onClick = { showConfirm = false }) { Text("Go back") } }
  )
}

Test pass for high-stakes flows

  1. List every action that spends money, creates a legal commitment, deletes data or submits answers.
  2. Walk each flow. Can you review what you are about to send? Is there a way to undo it? Does the system check the data and let you correct it?
  3. Confirm at least one safeguard holds for each action, and that it works with the keyboard and a screen reader.
  4. Test the confirmation step itself for 3.3.1 and 2.1.1 problems. A confirm button that is mouse-only defeats the safeguard.
  5. Tools cannot recognize which pages are high stakes. The inventory has to come from the team.

Mistakes seen

  • A generic "Are you sure?" dialog that does not say what will happen.
  • A confirmation page that does not allow corrections.
  • An undo window that is announced only visually or disappears after a few seconds.
  • Treating bulk delete the same as editing a single record.

Ship it when

  • Each high-stakes action offers undo, error-checked correction, or a review-and-confirm step.
  • The safeguard is keyboard operable and announced to screen readers.
  • The review step shows what will actually be submitted.

Sources

Standard version: WCAG 2.1 (W3C Recommendation, 5 June 2018), as named in the Title II web rule. This page is for informational purposes only and is not legal advice. For binding requirements, refer to the official ADA statute and regulations, and ask a lawyer how they apply to you.

Corpowid is recognized by Gartner

Corpowid has been recognized by Gartner, a leading global research and advisory firm, for our innovation and performance in digital accessibility. These badges reflect our commitment to creating inclusive, AI-powered web experiences.

Have questions about Corpowid?

Let’s connect.

We will get back to you as soon as possible.