Verifyre

WordPress form spam: stop fake sign-ups with real-time validation

CAPTCHAs and honeypots test behaviour, not the address. Real-time email validation stops typos, disposable domains and dead mailboxes on WordPress forms, with plugin setup steps.

WordPress form spam and fake sign-ups get past CAPTCHAs and honeypots because those tools test how a visitor behaves, not whether the email address they typed is real. Real-time email validation checks the address itself at the moment it is entered: it catches typos, disposable domains, dead mailboxes and role accounts before the submission is saved, so junk never reaches your list, your CRM or your notification inbox. On WordPress that takes a plugin, an API key and about ten minutes.

Why do CAPTCHAs and honeypots still let fake sign-ups through?

A CAPTCHA asks one question: is there a human-like session on the other end? A honeypot asks a narrower one: did something fill in a field a human could not see? Both are worth having, but neither looks at the data being submitted.

That leaves three gaps that show up on almost every WordPress site:

  • Fake-but-human sign-ups. A visitor who wants your gated PDF and does not want your newsletter types a ten-minute disposable address, or simply mashes the keyboard. They pass the CAPTCHA because they are a person.
  • Bots with real-looking addresses. Spam tooling no longer submits asdf@asdf.com. It pulls plausible names and domains from breach dumps and scraped pages, solves invisible challenges through cheap solving services, and waits the few seconds a honeypot timer expects.
  • Honest typos. jhon@gmial.com is a real person who wanted your email and will never get it. No bot filter has an opinion about that address.

The cost lands on your sending domain. Typically around 15% of addresses collected through forms are invalid at the moment of capture, and every one of them hard bounces when your welcome email or order confirmation goes out. That pushes a welcome-email stream well past the 2% hard-bounce line where mailbox providers start throttling. Recovering from that is covered in how to reduce email bounce rate, but it is far cheaper to stop the addresses at the form.

What does real-time email validation actually catch?

A real-time check runs the full verification pipeline on one address in under a second, while the visitor is still on the page. On a WordPress form that means:

  • Typos. The response includes a did_you_mean field, so gmial.com becomes a suggestion for gmail.com that the visitor can accept with one click.
  • Disposable addresses. More than 10,000 throwaway domains, from the well-known ones to this week's newly registered clones, are flagged with disposable: true. See why to block disposable addresses.
  • Dead mailboxes. The domain's mail server is asked, over a real SMTP conversation and without sending a message, whether the mailbox exists. A 550 5.1.1 reply means the address is undeliverable no matter how human the visitor was.
  • Role addresses. info@, sales@ and admin@ are flagged with role: true and scored risky, so you can decide whether a shared inbox belongs on a personal newsletter.
  • Catch-all domains. Domains that accept every address are marked risky rather than deliverable, so you know the 250 reply proved nothing.

The verdict comes back as deliverable, undeliverable, risky or unknown with a 0 to 100 score, and the form acts on it before the row is written.

Which defence layer stops what?

LayerStopsMisses
Honeypot fieldNaive bots that fill every inputScripted bots that read the DOM, every human
CAPTCHA or TurnstileBulk automated submissionsSolver farms, fake-but-human sign-ups, typos
Rate limit per IPFloods from one sourceSlow bots, rotating proxies, single bad addresses
Real-time email validationTypos, disposable, dead mailboxes, role accountsBots using one real, deliverable address

Each layer's blind spot is covered by another, and validation is the only layer that improves the quality of the addresses you keep rather than just reducing the number you reject.

How do you set up the Verifyre WordPress plugin?

  1. In WordPress admin go to Plugins, Add New, search for Verifyre, then Install and Activate. The WordPress integration page has the direct download if your host blocks the directory.
  2. Create an API key in your Verifyre dashboard. New accounts get 100 free verifications. Paste the key into Settings, Verifyre; it stays on the server.
  3. Choose which forms to protect. The plugin hooks into WPForms, Gravity Forms, Contact Form 7, Elementor forms and WooCommerce checkout and registration. Tick each one individually.
  4. Choose block or warn for each verdict. Block rejects the submission with an inline message and the did_you_mean suggestion when there is one. Warn lets the submission through and stores the verdict and score in the entry meta so you can filter later. A sensible default is block on undeliverable, warn on risky, allow on unknown.
  5. Decide what happens when credits run out. The plugin fails open: if your balance hits zero the forms keep working and validation is simply skipped, so a billing lapse can never take your contact form down. Turn on the low-balance email in the dashboard so you top up before that happens.
  6. Test with a typo address, a disposable address and a real one. You should see a suggestion, a block and a clean pass, in that order.

Repeat checks of the same address within 24 hours are free and return cached: true, so a visitor who corrects a typo and resubmits does not cost a second credit.

What if your theme uses a custom form?

Bespoke themes often render forms outside the five supported plugins. For those, drop in the JavaScript widget from the JavaScript integration. It is a single script tag:

<script src="https://verifyre.co/widget.js"
  data-key="vfy_live_YOUR_API_KEY"
  data-selector="input[type=email]"
  data-block="true" async></script>

It attaches to every email input matching the selector, verifies when the field loses focus, and fires a verifyre DOM event carrying status, reason, reason_text, did_you_mean and score. Listen for it when you want your own messaging:

document.addEventListener("verifyre", (e) => {
  const { status, did_you_mean } = e.detail;
  if (did_you_mean) showHint("Did you mean " + did_you_mean + "?");
  if (status === "undeliverable") disableSubmit();
});

For anything that matters, such as account creation, also verify server-side with a GET https://verifyre.co/api/v1/verify?email=... call from your PHP handler. The widget stops honest mistakes; the server call stops anyone who disables JavaScript. The form validation widget page covers styling, and the signup form validation guide covers the UX in depth.

How much friction does this add for real visitors?

Almost none, if you follow three rules: validate when the field loses focus rather than on every keystroke, show suggestions as a tap-to-accept hint rather than an error, and never block on an unknown verdict, because a greylisting server that would not answer in time is not the visitor's fault. The only people who then see a hard stop are typing addresses that could never receive your mail.

Key takeaways

  • CAPTCHAs and honeypots test behaviour, not the address; fake-but-human sign-ups and bots with real-looking addresses pass both.
  • Real-time validation catches typos, disposable domains, dead mailboxes and role accounts before the submission is saved.
  • Layer the defences: honeypot, rate limit and email validation together cover each other's blind spots.
  • The plugin supports WPForms, Gravity Forms, Contact Form 7, Elementor forms and WooCommerce, and fails open if credits run out.
  • Block undeliverable, warn on risky, allow unknown, and verify server-side for anything that creates an account.

Frequently asked questions

Does real-time validation replace my CAPTCHA?

Not entirely. It covers list quality, but a flood of submissions using one real address still needs a rate limit or an invisible challenge. Many sites keep the invisible challenge and drop the visible puzzle.

Will it slow down my forms?

A check typically completes in well under a second and runs while the visitor moves to the next field. The submission itself is not delayed unless the verdict comes back undeliverable.

What happens if the Verifyre API is unreachable?

The plugin treats a timeout like an unknown verdict and lets the submission through. It never blocks a visitor because of a network problem on our side.

Does it send an email to the address being checked?

No. Verification stops before the SMTP DATA command, so no message is ever sent and the visitor's inbox sees nothing.

Put it into practice.

100 free verifications on signup. Clean a list, add the widget, or call the API.

Start free See pricing