Real-time lead gate

Updated Oct 20262 min read

The lead gate is an n8n workflow with a webhook. Your sign-up form, landing page or app sends it an email address; it verifies the address with filtrat and answers straight away whether to accept the lead. Bad addresses never enter your database.

How it works

Webhook → Check Balance → Enough credits? → Verify Email → Route by Status → Accept or Reject

  1. Your form posts the lead to the webhook.
  2. The workflow checks your filtrat balance. If it's empty, it answers with an error instead of breaking your form.
  3. It verifies the address, resolving catch-all domains.
  4. It routes by status and answers your form.

Set it up

  1. Import the lead gate template (⋯ → Import from File in n8n).
  2. Select your Filtrat API credential in the Check Balance and Verify Email nodes. See Set up n8n credentials.
  3. Activate the workflow. The webhook accepts POST requests on the path verify-lead. n8n shows its full production URL in the Webhook Trigger node.
  4. Point your form or app at that URL.

What your form sends

Terminal
curl -X POST https://your-n8n-host/webhook/verify-lead \
  -H "Content-Type: application/json" \
  -d '{"email": "john@company.com", "name": "John Doe"}'

Only email is needed. The template ignores other fields; use them in nodes you add.

What it answers

StatusBranchAnswer
verifiedAccept{"accepted": true, "status": "verified", "email": "...", "confidence": 98}
catchallAccept{"accepted": true, "status": "catchall", ...}
invalidReject{"accepted": false, "status": "invalid", "email": "...", "message": "This email address does not exist."}
Balance empty—{"accepted": false, "error": "insufficient_credits", "message": "Email verification unavailable — please try again later."}

Because the template resolves catch-all domains, most catch-all addresses come back as verified or invalid. Only those that can't be resolved stay catchall, and the template accepts them.

Important

The template has no branch for risky and unknown results. Before going live, add a fallback output to the Route by Status node (in its options) and connect it to a response, so every request gets an answer. Accepting these leads with a flag for review is usually the safest choice: an unknown result often means the mail server didn't answer, not that the address is bad.

Choosing what to block

  • Strict: accept only verified. Best when a bounce is costly, for example for transactional email.
  • Balanced (template default): accept verified and catchall, reject invalid, review the rest.
  • Lenient: reject only invalid. Best when you don't want to lose any real lead.

The response also includes disposable and role_account. To block throwaway addresses or shared inboxes like info@, add an If node on those fields before Route by Status.

Speed

Most checks answer in a few seconds. Resolving a catch-all address adds a few seconds more and can take longer on some domains. If your form can't wait, turn off catch-all resolution (resolve_catchall: false in the Verify Email body) and handle catchall in your own system.

What it costs

1 per verified or invalid result, plus 5 when a catch-all is resolved. Risky, unknown and unresolved catch-all results are free. A lead who submits the same address again within 180 days is free when catch-all resolution is off.

Was this helpful?
Still stuck?

Email support@filtrat.io with the list or job name and what you expected to see.

Contact support
MYKHAILO BURIAK · NIP: 8982334042 · REGON: 544788490 · ul. Mieszczańska 18/40, 50-201 Wrocław, Poland© 2026 filtrat.io