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
- Your form posts the lead to the webhook.
- The workflow checks your filtrat balance. If it's empty, it answers with an error instead of breaking your form.
- It verifies the address, resolving catch-all domains.
- It routes by status and answers your form.
Set it up
- Import the lead gate template (⋯ → Import from File in n8n).
- Select your
Filtrat APIcredential in the Check Balance and Verify Email nodes. See Set up n8n credentials. - Activate the workflow. The webhook accepts
POSTrequests on the pathverify-lead. n8n shows its full production URL in the Webhook Trigger node. - Point your form or app at that URL.
What your form sends
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
| Status | Branch | Answer |
|---|---|---|
verified | Accept | {"accepted": true, "status": "verified", "email": "...", "confidence": 98} |
catchall | Accept | {"accepted": true, "status": "catchall", ...} |
invalid | Reject | {"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.
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
verifiedandcatchall, rejectinvalid, 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.