ChaosQA · Guides

Double submit testing

Updated October 30, 2026

People click buttons twice, out of habit or because nothing seemed to happen after the first click. If a form creates an order, a payment or a record, each of those habits can create two. The bug is old and well known, and it still ships, because a calm tester on a fast connection never triggers it.

How to trigger it

How to see the result

The screen often hides the duplicate: it shows one confirmation, the last one. Look underneath:

What protection looks like

Knowing the fix helps you test it properly, because each layer fails differently.

LayerWhat it doesHow it fails
Disable the button on the first clickStops most double-clicks on the page Enter still submits; the button is re-enabled too early; a direct request skips the page
Show a pending stateStops the "nothing happened, click again" reflex Not shown on slow networks, which is when it matters
A one-time token sent with the order (an idempotency key)The server accepts each token once, so a repeat is recognised as the same orderThe token is regenerated on every click, so it never repeats
A server-side check for duplicatesCatches repeats from any source Too narrow (only identical requests) or too wide (blocks real repeat purchases)

Page-level protection alone is not enough: anything sent from outside the page, including a retry from a flaky network, goes straight to the server. If you can resend a request from the developer tools (see the guide on what the server trusts), resend the order and see whether a second one appears.

Reporting it

A good report names the trigger precisely ("double-click on Place order, normal network"), the evidence (two requests, two order numbers, or one number used twice) and the effect on the user (two charges). "Clicking twice sometimes makes two orders" is true but hard to act on.

Try it on a live form. The TicketBox practice form places orders and returns order numbers. In some sessions a fast double-click creates two orders, and sometimes they share a number.
Open the practice form

More guides: checkout totals · what the server trusts · REST API test cases · all guides