How the cheap signals work
The cheap signals do most of the work, and they are cheap in two senses: they cost nothing to compute and they cost the visitor nothing. Two of the six are frequently implemented in a way that quietly rejects real people, which is worth being careful about.
Key takeaways
- Six signals: honeypot, fill time, field order, link count, field consistency, and repetition.
- The honeypot must be hidden accessibly, or screen reader users fill it in.
- Fill time needs a floor and no ceiling. A slow submission is not suspicious.
- Link count is the strongest single content signal and needs no model.
- Repetition across submissions catches the bots that beat everything else.
The six
| Signal | What it catches | Worth |
|---|---|---|
| Honeypot filled | Naive bots that fill every field | Very strong; near-certain spam |
| Fill time under 2s | Automated submission | Strong, with a floor only |
| Field order | Scripted fills that do not tab naturally | Moderate |
| Links in the message | Almost all commercial spam | Strong |
| Field inconsistency | A name in the phone field, etc. | Moderate |
| Repetition | The same body from many addresses | Very strong, and slow to trigger |
Between them these classify the large majority of submissions confidently in one direction or the other, at a computational cost of essentially zero and a visitor cost of exactly zero.
The two that go wrong
- App integration
- Networking
- Security & identity
- Analytics
- Front-end & mobile
The honeypot and screen readers
A honeypot is a form field that is invisible to people and visible to naive bots. The common implementation hides it with display: none, which is fine, or with type=“hidden”, which most bots skip, or by positioning it off-screen without hiding it from assistive technology — which is where it goes wrong.
A screen reader user encountering an off-screen labelled field will fill it in, because it is announced as a form field like any other. They then get silently classified as a bot, and there is no way for them to know. The fix is one attribute: hide it from the accessibility tree as well as visually, and label it something that discourages autofill.
Fill time needs a floor and no ceiling
Under two seconds is essentially impossible for a person typing a message and is a strong bot signal. The tempting mirror — treating a very long fill time as suspicious — is wrong, because a real person opens the form, gets distracted, comes back forty minutes later and submits.
So the check is a floor only. Any ceiling at all will misclassify somebody’s genuine enquiry, and a business that has ever had a customer fill in a form while on the phone to somebody has already seen the case.
Repetition
- Security & identity
- Management
- Analytics
- Front-end & mobile
The retrospective part matters. When the third copy of a message arrives and reveals the pattern, the first two have already gone to somebody’s inbox. Moving them to quarantine and telling the recipient which ones moved is better than leaving them, and it is the one case where the system reclassifies something after delivery.
Normalising the body before hashing — lowercasing, stripping punctuation and whitespace, removing the parts that vary like a name or a URL — is what makes this work against bots that template their messages.
Next: the narrow model band.
All posts