On this page
Know which spam you have
Two very different problems get called "form spam", and the fixes barely overlap.
Automated spam is bots submitting your form, usually thousands of times, usually with links in every field. It's indiscriminate — they found your form by crawling, not by choosing you.
Manual spam is a human, often an outsourced agency, filling in your contact form to pitch SEO services. Low volume, plausible-looking, and no technical measure will stop it because a real person is genuinely typing.
Almost everything below addresses the first. If you're getting five hand-typed pitches a week, the fix is a filter in your inbox, not a captcha on your form — and adding one will cost you real enquiries while changing nothing about the pitches.
The measures, worst-cost-first
Honeypot — best default
A hidden field real people never see and bots fill in reflexively. If it has a value on submit, discard the submission.
Webflow documents this technique directly, and it's the right starting point for almost every marketing site: zero user-facing friction, no third-party script, no accessibility cost when implemented properly, and it removes the large majority of bot traffic.
<!-- Positioned off-screen rather than display:none — some bots skip
display:none fields specifically. -->
<div style="position:absolute;left:-9999px" aria-hidden="true">
<label for="company-website">Leave this empty</label>
<input type="text" id="company-website" name="company-website" tabindex="-1" autocomplete="off">
</div>
Three details that matter:
tabindex="-1" keeps keyboard users from tabbing into it.
aria-hidden="true" keeps screen readers from announcing it. Without this, a blind visitor is asked to fill in a field they're told to leave empty — the accessibility failure that gives honeypots a bad name, and it's entirely avoidable.
A plausible field name. company-website gets filled by bots; honeypot-field-do-not-fill does not.
Then discard on the server, or if you're using Webflow's native submission handling, block the submit client-side:
form.addEventListener('submit', e => {
if (form.elements['company-website'].value !== '') {
e.preventDefault(); // silently drop; don't tell the bot why
}
});
Silence is deliberate. An error message teaches whoever's tuning the bot exactly what tripped it.
Time trap — free, and nearly as effective
Humans take several seconds to fill a form. Bots submit in under one. Record when the form was rendered and reject implausibly fast submissions.
const rendered = Date.now();
form.addEventListener('submit', e => {
if (Date.now() - rendered < 3000) e.preventDefault();
});
Three seconds is a reasonable floor for anything with more than one field. Keep it conservative — a returning visitor with autofill can legitimately be quick, and blocking real submissions is far more expensive than letting spam through.
Combined with a honeypot, this handles most of what's left.
Turnstile / native bot protection — good when the first two aren't enough
Webflow offers site-level bot protection built on Cloudflare Turnstile, which scores signals like mouse movement and input patterns rather than making people identify traffic lights. Most visitors pass invisibly.
Reach for this when honeypot and time trap have been in place and spam still gets through — which does happen if you've been specifically targeted rather than crawled.
It's a third-party check in the submission path, so there's a small failure surface: privacy extensions, restrictive corporate networks, and some VPNs occasionally cause challenges. That's a much smaller cost than reCAPTCHA, but it isn't zero.
reCAPTCHA — last resort
Effective, and the most expensive option for your real visitors.
The v2 checkbox adds a decision and often an image challenge, which measurably reduces completion — and disproportionately for people using screen readers, older devices, or slow connections. v3 is invisible but scores in the background and requires you to decide a threshold, which means quietly discarding real submissions that scored badly, with no way for that person to know or retry.
Both load a third-party script on the page carrying the form, which costs performance and, in Europe, drags the form into your consent story.
Use it when you're under sustained targeted abuse and cheaper measures have failed. Not as a default.
Required-field tricks — mostly theatre
"What is 3 + 4?" style questions stop naive bots and are trivially defeated by anything that parses the label. They also fail for anyone with dyscalculia and translate badly. The honeypot achieves more with no user cost.
The measure nobody mentions: don't publish the address
A meaningful share of contact-form spam exists because the form is the easiest machine-readable route to your inbox. Two things reduce the incentive:
Don't expose the submission endpoint in obvious ways. Standard Webflow forms are fine here; custom endpoints in inline JavaScript are worth a second look.
Don't publish your email as plain text next to the form. Harvesters take both.
Set the threshold where it belongs
The decision people get wrong: they treat spam as the thing to minimise, when the thing to maximise is real enquiries received.
A honeypot plus time trap might let 3% of bot submissions through and block essentially no humans. reCAPTCHA v2 might block 99% of bots and 2–5% of real people. If your form generates fifty genuine enquiries a month, that trade costs one or two real leads to avoid a handful of junk entries you could have deleted in ten seconds.
Junk in your inbox is annoying. A lost enquiry is revenue. Price them accordingly.
What I'd actually ship
- Honeypot with a plausible name, off-screen,
aria-hidden,tabindex="-1". - Three-second time trap.
- Route submissions somewhere with a filter — Slack channel, CRM, shared inbox — so residual junk is triaged rather than dumped on one person.
- Only if spam persists at volume: enable native bot protection.
- reCAPTCHA only under sustained targeted abuse.
Then stop. Time spent tuning anti-spam past this point is better spent making the form shorter, which reliably increases the number of real submissions — the actual goal.
Sources: Webflow: honeypot technique · Webflow: prevent spam in form submissions