Confirmation
Ask for confirmation only when an action is hard to undo, and make the dialog state exactly what will happen.
6 states5 edge casesDesktop + Mobile
01The problem
Products confirm too much or too little. Confirming every action trains users to click “OK” without reading, so the one confirmation that matters gets ignored. Confirming nothing means a single misclick deletes a customer's data. The decision isn't “should we confirm?” but “can this be undone?”.
02When to use
Use when
- Permanent deletion of data that can't be restored
- Actions that notify or charge other people: sending, publishing, billing
- Bulk actions on many records at once
- Actions whose consequences aren't visible from where the user is
Avoid when
- The action can be undone — offer Undo after it instead.
- The action is frequent and low-risk, like archiving one email.
- The user just configured exactly what will happen on the previous screen.
03Recommended UX
Statecraft recommendation
Prefer undo over confirmation. When an action truly can't be undone, use a dialog whose title names the action and object with counts, whose body states the consequence, and whose confirm button repeats the verb — “Delete 24 customers”, never “OK”.
Undo keeps the user moving and handles mistakes after the fact, which is when people actually notice them.
A specific title (“Delete 24 customers?”) is read; a generic one (“Are you sure?”) is dismissed by habit.
A button labelled with the verb lets users confirm without reading the body — and still know what they're agreeing to.
04Interaction flow
- 01
User triggers action
Delete, send, publish, bulk change.
- 02
Reversible?
Yes → act immediately and offer Undo.
- 03
Irreversible → dialog
Title, consequence, verb button; focus on Cancel for severe cases.
- 04
High severity
Type the name to confirm for workspace-level deletion.
- 05
Execute
Button shows progress; dialog closes on success.
Result
- Done
- Undone
- Cancelled
05Desktop behaviour
On desktop, confirmation is a small modal centred over the page. It should be readable in one glance and operable from the keyboard.
Desktop rules
- Title: verb + count + object (“Delete 24 customers?”).
- Body: one or two sentences of consequence — what's lost, who's affected, whether it can be recovered.
- Buttons: Cancel and the destructive verb; destructive styling only on genuinely destructive actions.
- Enter confirms only when focus is on the confirm button; Escape always cancels.
06Mobile behaviour
On mobile, confirmations work best as action sheets anchored to the bottom, where thumbs already are.
Mobile rules
- Use a bottom sheet with the consequence text and stacked full-width buttons.
- Put the destructive action first in red and Cancel separated below it.
- Prefer undo toasts for swipe-to-delete gestures rather than a sheet on every swipe.
07States
Undo toast
Action done; toast with Undo for 5–10 seconds.
Standard confirm
Dialog with title, consequence and verb button.
Type to confirm
For catastrophic actions; button enabled when the name matches.
Processing
Confirm button shows progress; dialog can't be dismissed mid-request.
Failed
Error shown inside the dialog with Retry; nothing changed.
Blocked
The action isn't allowed yet — explain why instead of confirming.
08Edge cases
EC-01
Confirmation fatigue
Users see a confirm dialog every time they archive a ticket.
Recommendation
Remove it, archive immediately and offer Undo. Save confirmations for actions that are actually irreversible.
EC-02
Consequences beyond the object
Deleting a project also deletes 340 tasks and 12 integrations.
Recommendation
List the dependent data with counts in the body. Users can't weigh consequences they can't see.
EC-03
Blocked deletion
A customer can't be deleted because they have unpaid invoices.
Recommendation
Don't show a confirm button at all. Explain the blocker and link to resolving it.
EC-04
Accidental double-click
The user double-clicks Delete; the second click lands on the dialog's confirm button.
Recommendation
Put initial focus on Cancel for destructive dialogs and ignore clicks within ~300 ms of opening.
EC-05
Undo after navigation
The user deletes an item and immediately navigates away before seeing the toast.
Recommendation
Keep the undo toast alive across in-app navigation for its full duration, or offer restore from trash.
09Microcopy
Title
Avoid
“Are you sure?”
Prefer
“Delete 24 customers?”
Body
Avoid
“This action cannot be undone.”
Prefer
“Their 312 invoices and contact history will be permanently deleted.”
Confirm button
Avoid
“OK”
Prefer
“Delete 24 customers”
Type to confirm
Prefer
“Type acme-production to confirm”
Undo toast
Prefer
“Ticket archived. Undo”
10Accessibility
- Use role="alertdialog" with aria-labelledby (title) and aria-describedby (consequence).
- Trap focus inside the dialog and return it to the triggering control on close.
- Initial focus on Cancel for destructive actions, on the primary button otherwise.
- Undo toasts must stay long enough to reach by keyboard and pause while focused or hovered.
11Developer notes
- 01
Implement deletion as soft delete with a restore window wherever possible; it makes Undo nearly free.
- 02
Generate dialog copy from the action and the actual counts returned by the server, not hardcoded strings.
- 03
Check whether the action is blocked before opening the dialog.
- 04
Make the confirmed request idempotent so a retry can't apply the action twice.
12Implementation prompt
For Claude Code, Codex or Cursor
Implement a confirmation system for destructive and irreversible actions.
Requirements:
- Decide per action: reversible → execute immediately with an Undo toast (soft delete); irreversible → confirmation dialog.
- Reusable dialog: title = verb + count + object, body = concrete consequence with dependent data counts, buttons = Cancel + verb ("Delete 24 customers").
- Destructive styling only for destructive actions; initial focus on Cancel for them; ignore clicks within 300 ms of opening.
- Type-to-confirm variant for catastrophic actions (workspace/project deletion).
- Processing state on the confirm button; errors shown inside the dialog with Retry.
- Check blockers before opening; show an explanation instead of a confirm button when blocked.
- role="alertdialog" with labelled title and description; focus trap; focus returns to the trigger.
- Undo toast persists across in-app navigation and pauses on hover/focus.
- Mobile: bottom action sheet with stacked full-width buttons.
Do not redesign the existing interface.