← All articles
Spam PreventionSecurityUX

Honeypot vs CAPTCHA: which is better for form spam prevention?

FormsFort Team ·

Form spam prevention comes down to distinguishing humans from bots. Two primary techniques exist: honeypot fields and CAPTCHA challenges. Each has different tradeoffs between effectiveness and user experience.

This guide compares them in detail and explains when to use each.

What is a honeypot field?

A honeypot is a hidden form input that legitimate users never see or interact with. Automated bots that crawl the web and fill in every field they find will populate the honeypot, revealing themselves.

<input
type="text"
name="botcheck"
style="position: absolute; left: -9999px; opacity: 0;"
tabindex="-1"
autocomplete="off"
/>

When the form is submitted, the server checks if the honeypot field has a value. If it does, the submission is from a bot and is rejected.

How bots find honeypots

Sophisticated bots can detect honeypots by:

  • Checking for CSS properties that hide elements (opacity: 0, left: -9999px)
  • Checking if the element is visible in the viewport
  • Checking tabindex="-1" which removes the field from tab order
  • Checking for common honeypot field names (botcheck, honeypot, website_url)

Making honeypots harder to detect

Use multiple hiding techniques and non-obvious field names:

<input
type="text"
name="company_website"
style="position: absolute; left: -9999px; opacity: 0; height: 0; width: 0; overflow: hidden;"
tabindex="-1"
autocomplete="off"
aria-hidden="true"
/>

The field name company_website looks like a legitimate field that bots would fill in.

What is a CAPTCHA?

A CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) presents a challenge that humans can solve but bots cannot.

Types of CAPTCHA

TypeExampleUser friction
InvisibleTurnstile, reCAPTCHA v3None (background check)
Managed challengeTurnstile managed modeLow (only when suspicious)
Image puzzlereCAPTCHA v2, hCaptchaHigh (select images)
Text challengeType distorted textHigh
Math problemSolve 3 + 5Medium

Cloudflare Turnstile

Turnstile is the recommended CAPTCHA for modern forms:

<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
  • Privacy-friendly (no cross-site tracking)
  • Often resolves without showing any challenge
  • No Google account required
  • Free for all sites

Google reCAPTCHA v3

reCAPTCHA v3 assigns a score to each visitor based on behavior:

<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute("YOUR_SITE_KEY", { action: "submit" }).then(function (token) {
document.getElementById("recaptchaToken").value = token;
});
});
</script>
<input type="hidden" id="recaptchaToken" name="g-recaptcha-response" />
  • Invisible (no user interaction)
  • Score-based (0.0 = bot, 1.0 = human)
  • Requires Google tracking
  • Requires server-side token verification

Google reCAPTCHA v2

The familiar “I’m not a robot” checkbox with image puzzles:

<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
  • High friction (image puzzles frustrate users)
  • Very effective against bots
  • Requires Google tracking

Head-to-head comparison

FactorHoneypotCAPTCHA
User frictionNoneLow to high (depends on type)
Effectiveness vs basic botsHigh (70-80%)Very high (95%+)
Effectiveness vs sophisticated botsLow to mediumHigh
Effectiveness vs human spammersNoneHigh
Implementation complexityVery lowLow to medium
External dependenciesNoneRequires external service
Accessibility impactNoneCan be problematic
Privacy impactNoneVaries (Turnstile: none, reCAPTCHA: high)
MaintenanceNoneService may change API
CostFreeFree to paid

When to use a honeypot

Use a honeypot on every form, always. It costs nothing in user experience and catches the majority of basic bot submissions.

Best for:

  • Low-traffic forms (contact, newsletter signup)
  • Forms where user friction must be absolutely zero
  • First line of defense on any form

When to use a CAPTCHA

Add a CAPTCHA when:

  • Your form receives more than 100 submissions per day
  • You notice spam getting through the honeypot
  • The form is on a high-visibility page (homepage, pricing page)
  • You need to block human spammers (not just bots)

Best CAPTCHA choice by scenario:

ScenarioRecommended CAPTCHA
Most formsCloudflare Turnstile (managed mode)
Privacy-sensitive sitesCloudflare Turnstile
Maximum bot protectionreCAPTCHA v2 (accept the friction)
Invisible protectionTurnstile or reCAPTCHA v3

Combining both for maximum protection

The optimal setup uses both techniques together:

<form action="https://api.formsfort.com/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<!-- Honeypot: catches basic bots -->
<input
type="text"
name="company_website"
style="position: absolute; left: -9999px; opacity: 0;"
tabindex="-1"
autocomplete="off"
/>
<!-- Form fields -->
<label for="name">Name</label>
<input type="text" id="name" name="name" required />
<label for="email">Email</label>
<input type="email" id="email" name="email" required />
<label for="message">Message</label>
<textarea id="message" name="message" required></textarea>
<!-- CAPTCHA: catches sophisticated bots and humans -->
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_KEY"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<button type="submit">Send message</button>
</form>

This layered approach catches:

  • Basic bots (honeypot)
  • Sophisticated bots (CAPTCHA)
  • Human spammers (CAPTCHA)

Add domain restriction and rate limiting on the server side for a complete defense.

Accessibility considerations

Honeypot accessibility

A properly implemented honeypot does not affect accessibility:

  • tabindex="-1" removes it from keyboard navigation
  • aria-hidden="true" hides it from screen readers
  • Off-screen positioning means it is not announced

CAPTCHA accessibility

CAPTCHAs can be problematic for users with disabilities:

  • Image puzzles are difficult for visually impaired users
  • Audio alternatives exist but are often poor quality
  • Time limits can be challenging for users with motor disabilities

Turnstile and reCAPTCHA v3 are preferred because they often resolve without any user interaction. When a challenge is shown, provide alternative contact methods (email, phone) for users who cannot complete it.

Summary

Honeypots and CAPTCHAs serve different roles in spam prevention. Honeypots are a zero-friction first line of defense that catches basic bots. CAPTCHAs provide stronger protection against sophisticated bots and human spammers but add some user friction. Use a honeypot on every form. Add Cloudflare Turnstile for medium and high-traffic forms. Combine with domain restriction and rate limiting for comprehensive protection.

Frequently asked questions

What is the difference between a honeypot and a CAPTCHA?

A honeypot is a hidden form field that bots fill in but humans never see. A CAPTCHA is a visible challenge (or invisible check) that humans can pass but bots cannot. Honeypots have zero user friction; CAPTCHAs are more effective against sophisticated bots.

Should I use both honeypot and CAPTCHA?

Yes. Use a honeypot on every form as a baseline defense. Add a CAPTCHA for medium and high-traffic forms where sophisticated bots are more likely to target you. Together they provide layered protection.

Which CAPTCHA is the most privacy-friendly?

Cloudflare Turnstile is the most privacy-friendly CAPTCHA. It does not track users across sites, does not require a Google account, and often resolves without showing any challenge to the user.

Can bots detect honeypot fields?

Basic bots cannot detect honeypot fields. Sophisticated bots can check for CSS hiding techniques, off-screen positioning, and fields not visible in the viewport. Using multiple hiding techniques makes detection harder.

Does a honeypot affect form accessibility?

A properly implemented honeypot does not affect accessibility. Use tabindex='-1' to remove it from the tab order, and position it off-screen rather than using display:none or aria-hidden which some screen readers may still announce.

Get started free

Ready to add forms to your static site?

No backend required. Point your HTML form at FormsFort and start receiving submissions in minutes.