Anti-spam teardown · Trap

Time-traps and submit-delay heuristics

Stamp the form when it renders, check the clock when it submits, and drop anything that arrived impossibly fast. It is free, it works on the laziest automation, and the version most people implement quietly punishes their best leads.

Corey Haines · San Diego · Aug 2026

One of 12 anti-spam teardowns. Bypass techniques change; this page states its date so you can judge how stale it is.

The short answer

As a gate it is defeated by one line of code. As a stored signal it is one of the most useful things on the submission — time-to-submit correlates with intent, exposes which field people stall on, and costs nothing to keep.

What it stops

Scripted botsMass submitters that never render your page.
Yes
Targeted automationHeadless browsers, solver services, residential proxies — aimed at you.
No
Paid humansPeople doing it by hand, cheaply.
No
Real people, bad leadsGenuine humans who were never going to buy.
No
Cost to the real buyerWhat it asks of the person you actually wanted.
None

How it works

The form carries a signed timestamp from render. On submit, the server compares it to now. Under a threshold — two seconds, five, whatever you picked — the submission is treated as automated and discarded.

Some implementations add an upper bound as well, on the theory that a form sitting open for an hour is a stale or replayed session. That second rule is where the damage is.

What it actually stops

Single-shot scripts that fetch the page and POST in the same breath, and replay attacks that reuse a captured payload. Both are common, both are cheap to run, and both disappear under a lower bound of a few seconds.

It is the second-best zero-friction defense after a honeypot, and for the same reason: the real visitor never knows it exists.

How it’s defeated

await sleep(9000). That is the entire bypass, and it is one line in any automation framework.

The cost to the attacker is throughput, not capability — and throughput has not been the constraint for a long time. Someone submitting 665 forms in seventy-six minutes is running roughly one every seven seconds; a nine-second delay per worker and four workers in parallel puts them back where they started, on a laptop.

The upper bound fails in a more expensive way. Consider who takes twenty minutes on your quote form: someone who opened it in a tab, went to find last year’s invoice, checked a number with a colleague, came back and finished. That is not a stale session. That is the most qualified person who touched your form today, and an expiry rule rejects them with a message they will read as “this site is broken.”

After reviewing plenty of user screen recordings most users scroll down to see the size of the form before starting
u/Henningway18 · r/cro · Nov 2015

People treat forms as a task to prepare for. Timing rules assume they treat them as a reflex.

When it’s still worth using

Keep a lower bound of two or three seconds. It is free and it removes the crudest traffic. Drop the upper bound entirely, or set it in hours and log what it catches before you trust it.

Then do the thing almost nobody does: store the timing rather than only enforcing it. Time-to-submit, and ideally time-per-field, is a genuinely rich signal and it is sitting there for free.

  • Per-field dwell time is a drop-off analysis you did not have to instrument separately — the field people stall on is visible before anyone abandons.
  • The distribution is bimodal when you are being hit, and the shape of it tells you whether you are looking at automation or at a click farm.
  • Once submissions carry a verdict, you can check whether the fast ones close. Our guess is that they do not, and that is checkable rather than assertable.

What to pair it with

No single method on this site is sufficient. These are the ones that fail differently enough to be worth running alongside it.

Honeypot fields
The other free trap. Run both; they catch different mistakes.
reCAPTCHA v3
Also better as a stored score than as a gate. Two independent signals you can grade against outcomes later.

Concepts on this page