🔨 LearnForge
No-Code & AI

n8n Lead Generation Automation: Capture, Score and Notify in One Flow

Sending every form submission straight to sales is the fastest way to burn your team's time and your leads' patience. A VP of Engineering at a 200-person company and a college student experimenting with your free trial both fill out the same contact form — treating them identically is the wrong call. This guide builds a single n8n workflow that separates those two cases automatically: captures leads from any source, validates and enriches the data, scores each lead against your ICP using a concrete point formula, and routes them into three tracks — Hot, Warm, Cold — with different CRM actions, Slack notifications, and email sequences for each. The whole flow runs in under 30 seconds per lead, with no manual triage required.

📅 August 11, 2026 ⏱️ 22 min read ✍️ LearnForge Team 🏷️ n8n · Lead Generation · Automation
n8n lead generation automation — capture, score and notify in one workflow

The full workflow at a glance

Webhook (any form) Deduplicate Email validate Enrich (Clearbit) Score (Code node) IF Hot ≥70 CRM + Slack DM + Task
IF Warm 40–69 CRM + Slack channel + Nurture seq.
Cold <40 Log + Cold email sequence

Each step passes its output to the next — the enrichment data feeds the scoring formula, and the score determines which branch runs. One workflow handles the entire pipeline from raw form submission to sales-ready record.

Steps in this guide

  1. Step 1 — Lead capture: one webhook, every source
  2. Step 2 — Deduplication: check before creating
  3. Step 3 — Email validation: filter junk before enrichment
  4. Step 4 — Enrichment: add company data automatically
  5. Step 5 — Lead scoring: the real point formula
  6. Step 6 — Routing: Hot / Warm / Cold branches
  7. Step 7 — Actions per tier: CRM, Slack, email sequences
  8. What the numbers look like in practice
  9. FAQ
1

Lead Capture — One Webhook, Every Source

Typeform, Webflow, WordPress, Calendly, Tally, custom HTML — all send to the same URL

The Webhook Trigger node generates a unique URL — something like https://your-n8n.com/webhook/lead-capture. Any form or service that can POST to a URL can feed this workflow. Configure each form tool's webhook setting to point here and you have a single entry point for your entire lead pipeline, regardless of how many forms or landing pages you run.

The first node after the webhook is a Set node that normalizes the incoming data. Different form tools name fields differently — Typeform uses form_response.answers, Webflow uses data.fields, a custom HTML form sends whatever you named the inputs. The Set node maps all of these to a consistent internal schema: lead.email, lead.name, lead.company, lead.message, lead.source_page, lead.utm_source. Every downstream node uses these standardized field names — which is why adding a new form source only requires adjusting the Set node mapping, not rebuilding the whole workflow.

Webhook Trigger Set Node (normalize fields)
Works with any form tool No coding needed
2

Deduplication — Check Before Creating

Query your CRM or spreadsheet by email before doing anything else

Without a deduplication step, every time the same person fills out your form — revisiting after a few weeks, trying a different email, submitting from a second device — the workflow creates a new lead record. Your CRM fills with duplicates, your sales team contacts the same person twice, and your lead count metrics become meaningless. The fix is a single query before any write operation.

The Notion Query node (or Google Sheets lookup, or HubSpot Search node) filters your contacts database by the email field. If a result comes back, the lead already exists: the IF node branches to an "Update" path that appends a note to the existing record ("Resubmitted via /pricing page on Aug 11") and refreshes the Next Follow-up date. If no result, it continues to the new lead path. This two-branch structure means returning leads never create duplicates, but they do get their record updated — which matters because a second touchpoint is a strong buying signal worth noting.

Notion / Sheets Query (by email) IF (exists?) Update existing record OR → Continue to new lead flow
Prevents duplicate records Captures return-visit signals
3

Email Validation — Filter Junk Before Enrichment

Saves enrichment API quota by rejecting invalid addresses first

Enrichment APIs cost money (or consume your free tier quota) per lookup. Running them against fake emails, mistyped addresses, and temporary inbox services wastes that quota and pollutes your CRM with uncontactable records. A validation step before enrichment filters the junk out first.

The HTTP Request node calls Hunter.io's Email Verifier endpoint: GET https://api.hunter.io/v2/email-verifier?email={email}&api_key={key}. The response includes a result field: deliverable (valid, continue), risky (might work, continue with caution), or undeliverable (invalid, stop). An IF node checks this field — undeliverable addresses branch to a dead-end path that logs the failed lead to a Google Sheet for review. Deliverable and risky addresses continue to enrichment.

Hunter.io's free plan includes 25 verifications per month. For higher volume, ZeroBounce ($0.008/verification) or NeverBounce ($0.008/verification) give accurate results at low cost — at 1,000 leads per month, that's $8, far less than the enrichment waste from skipping validation.

HTTP Request (Hunter verify) IF (deliverable?) Continue OR Log + stop
Hunter free: 25/month Saves enrichment quota
4

Enrichment — Add Company Data Automatically

Free: Clearbit Reveal (100/month). Paid: Apollo, Clearbit Enrichment, RocketReach

The enrichment step transforms a name and email into a full lead profile. The scoring formula in step 5 needs company size, industry, and seniority to work — without enrichment, you're scoring blind. The HTTP Request node calls Clearbit's free Enrichment API using the lead's email domain (everything after the @), which returns company name, industry, employee count, estimated revenue, headquarters country, and tech stack.

HTTP Request config — Clearbit Company API
GET https://company.clearbit.com/v1/domains/find
Query param: domain = {{ $json.lead.email.split('@')[1] }}
Auth: Basic — username: YOUR_CLEARBIT_KEY, password: (empty)

The response gives you fields like metrics.employeesRange, category.industry, and geo.country. A Set node after the HTTP Request merges these into the lead object alongside the original form data. From this point on, $json.lead contains both what the person submitted and what the API returned — everything the scoring formula needs in one place.

For personal email domains (gmail.com, yahoo.com, outlook.com), Clearbit returns no company data. The Set node should default these fields to empty strings so the scoring formula doesn't throw errors — it simply assigns zero points for the firmographic signals it can't evaluate, which naturally pushes personal-email leads to a lower score.

HTTP Request (Clearbit company) Set Node (merge lead + enrichment)
Clearbit free: 100/month Apollo paid: $49/month (fuller data)

Build This Workflow Step by Step

The LearnForge AI Apps course teaches n8n from first workflow to full production systems — lead automation, AI agents, CRM integration. Module 1 is completely free.

Start Free Module →
5

Lead Scoring — The Real Point Formula

Code node · JavaScript · Firmographic + behavioral signals · 0–100 scale

This is where most guides go vague. "Add points for good signals" isn't a scoring system — it's a description of one. Below is a concrete scoring formula you can paste into n8n's Code node and adapt to your ICP. The formula covers firmographic signals (who they are) and behavioral signals (what they did), with negative points for disqualifying attributes.

SignalPointsSource
Company size 51–500 employees+20Clearbit enrichment
Company size 501–5000 employees+15Clearbit enrichment
Industry matches your target list+20Clearbit enrichment
Title contains: Director, VP, Head, Chief, Founder, Owner+20Form field
Title contains: Manager, Lead, Senior+10Form field
Submitted from /pricing or /demo page+25source_page field
Submitted from /contact or /about page+10source_page field
UTM source = paid (google, linkedin, facebook)+10UTM params
HQ country in your target market+10Clearbit enrichment
Message length > 80 characters+10Form field
Personal email domain (gmail, yahoo, hotmail…)−15Email field
Title contains: intern, student, junior, assistant−20Form field
Company size 1–10 (solo or micro)−10Clearbit enrichment
Known competitor domain−50Email domain
n8n Code Node — Lead Scoring Formula (JavaScript)
const lead = $input.item.json.lead;
const enrichment = $input.item.json.enrichment || {};
let score = 0;

// --- Firmographic signals ---
const employees = enrichment.employeesRange || '';
if (['51-250','251-1000','1001-5000'].some(r => employees.includes(r.split('-')[0]))) score += 20;
else if (['5001-10000','10001+'].some(r => employees.includes(r.split('-')[0]))) score += 15;
else if (['1-10','11-50'].some(r => employees.includes(r.split('-')[0]))) score -= 10;

const targetIndustries = ['Software','SaaS','Technology','Marketing','E-Commerce','Finance'];
if (targetIndustries.some(i => (enrichment.industry || '').includes(i))) score += 20;

const country = enrichment.country || '';
if (['United States','Canada','United Kingdom','Australia'].includes(country)) score += 10;

// --- Title / persona signals ---
const title = (lead.title || lead.job_title || '').toLowerCase();
if (/director|vp |head of|chief|founder|owner|ceo|cto|coo/.test(title)) score += 20;
else if (/manager|lead|senior|principal/.test(title)) score += 10;
else if (/intern|student|junior|assistant|coordinator/.test(title)) score -= 20;

// --- Behavioral signals ---
const page = (lead.source_page || '').toLowerCase();
if (page.includes('/pricing') || page.includes('/demo')) score += 25;
else if (page.includes('/contact') || page.includes('/about')) score += 10;

const utm = (lead.utm_source || '').toLowerCase();
if (['google','linkedin','facebook','twitter'].includes(utm)) score += 10;

if ((lead.message || '').length > 80) score += 10;

// --- Negative signals ---
const personalDomains = ['gmail','yahoo','hotmail','outlook','icloud','proton','mail.ru'];
const emailDomain = (lead.email || '').split('@')[1] || '';
if (personalDomains.some(d => emailDomain.includes(d))) score -= 15;

const competitorDomains = ['competitor1.com','competitor2.io']; // add your own
if (competitorDomains.includes(emailDomain)) score -= 50;

// Clamp score to 0–100
score = Math.max(0, Math.min(100, score));

const tier = score >= 70 ? 'Hot' : score >= 40 ? 'Warm' : 'Cold';

return [{ json: { ...lead, enrichment, score, tier } }];

The formula is intentionally transparent — every point value is explicit, so when it gives the wrong result you know exactly why and can adjust. Adapt the targetIndustries, targetCountries, and competitorDomains arrays to match your ICP. After 2–3 weeks of running, compare your Hot leads against which ones actually converted — the scoring weights are your first calibration target.

Code node — JavaScript Fully customizable Runs in <100ms
6

Routing — Three Branches, Three Tracks

Two IF nodes create three paths: Hot ≥70, Warm 40–69, Cold <40

Two chained IF nodes handle the routing. The first checks {{ $json.score >= 70 }} — true goes to the Hot branch. The false output feeds a second IF node that checks {{ $json.score >= 40 }} — true goes to Warm, false goes to Cold. The tier field already set by the Code node in step 5 serves as a readable label in all downstream messages and CRM records.

70–100
🔥 Hot — SQL
Sales-qualified. Fits your ICP, showed high-intent behavior. Contact within 1 hour. Assign a rep and create a task immediately.
40–69
🌡️ Warm — MQL
Marketing-qualified. Good fit but lower intent, or high intent with unknown fit. Add to CRM and nurture sequence. Sales reviews weekly.
0–39
❄️ Cold
Poor fit or no intent signals. Log only — no sales contact. Add to educational email drip. Re-score if they re-engage.
Two IF nodes No code — node conditions only
7

Actions Per Tier — CRM, Slack, Email Sequences

Different urgency and depth of action for each track

Hot branch: Three parallel nodes run simultaneously. (1) Notion or HubSpot creates a new contact with Status = "Hot / SQL", assigns the rep from your routing table, and sets Next Follow-up to today. (2) A Slack node sends a direct message to the assigned rep — not a channel message, a DM — with the lead's name, company, title, score, the page they came from, and their message verbatim. The rep receives this in Slack and can respond within minutes. (3) A task gets created in their task manager (Asana, Linear, or a Notion task database) with a due time of today at 3 PM. The combination of DM + task means no Hot lead gets missed even when the rep is in meetings.

Warm branch: Two parallel nodes. (1) Notion or HubSpot creates the contact with Status = "Warm / MQL" — no rep assignment yet, goes into a shared pipeline view that the sales team reviews weekly. (2) The lead gets added to a Warm nurture email sequence in Mailchimp, ConvertKit, or Brevo — 4–6 emails over 3 weeks covering use cases, customer stories, and a soft CTA. If they engage with the emails or visit your site again, a new webhook submission re-runs the scoring and potentially moves them to Hot.

Cold branch: One action only — log the lead to a Google Sheet with their email, score, and the timestamp. No CRM record (keeps your CRM clean), no sales contact (saves the team's time), but they do enter a long-form educational drip sequence (8–10 emails over 2 months). Some Cold leads convert after 6 months. The sheet gives you visibility without pollution.

Slack DM format for Hot leads: "🔥 Hot lead — Score 84/100 · Sarah Chen, VP Marketing @ Acme Corp (320 employees, SaaS) · Submitted via /pricing · "Looking to automate our lead routing, we have 3 reps and ~200 leads/month" · View in CRM →" — every rep's first question is answered before they open the CRM link.

Hot CRM (assign rep) + Slack DM + Task (due today)
Warm CRM (no assign) + Email nurture (4–6 emails)
Cold Google Sheets log + Long drip (8–10 emails)
Sales sees only Hot leads immediately Warm & Cold fully automated No manual triage

What the numbers look like in practice

For a B2B SaaS team running this workflow with a typical inbound form — roughly 300 submissions per month — the scoring distribution usually looks like: 15–20% Hot (45–60 leads), 35–40% Warm (105–120 leads), 40–50% Cold (120–150 leads). Without scoring, all 300 would go to sales. With scoring, sales focuses on 45–60 truly qualified leads and responds faster — response time is the single biggest driver of conversion rate on inbound leads.

The first scoring model won't be perfect. After running for 3–4 weeks, pull the closed/won deals and check their original scores. If several won deals scored below 40 (Cold), your penalty for personal emails or company size is too aggressive — reduce it. If most Hot leads didn't convert, your positive signals need recalibration — pricing page visits might be less intent-indicating than you assumed, or the page gets too much casual traffic to be a reliable signal. The formula is a starting point, not a final answer.

The full workflow — all 7 steps — takes 3–4 hours to build the first time, including setting up the Clearbit and Hunter credentials and configuring your email sequences. Once it's running, the maintenance work is minimal: adjusting the scoring weights every month or two based on conversion data, and updating the target industries or competitor domains list as your market positioning evolves.

Frequently Asked Questions

How do I automate lead generation with n8n?

Build a single workflow: Webhook trigger receives form submissions → Set node normalizes fields → query CRM to deduplicate → HTTP Request validates email → HTTP Request enriches with company data → Code node runs scoring formula → two IF nodes route into Hot/Warm/Cold branches → each branch creates a CRM record, sends the appropriate Slack notification, and triggers the right email sequence. The full flow runs in under 30 seconds per lead.

How does n8n lead scoring work?

A Code node runs a JavaScript function on enriched lead data. You define point values for firmographic fit (company size, industry, country), persona signals (job title seniority), and behavioral signals (which page they submitted from, message length, UTM source). Negative points apply for disqualifying signals (personal email, junior title, competitor domain). The function sums all points, clamps the result to 0–100, and returns a score and tier label. An IF node downstream routes each tier to a different branch.

Can n8n capture leads from multiple sources?

Yes — one Webhook trigger URL receives POST requests from any source: Typeform, Webflow, WordPress, Tally, Calendly, custom HTML forms. A Set node after the trigger normalizes the different field naming conventions into a consistent internal schema. Adding a new form source means updating only the Set node mapping — the rest of the workflow is unchanged.

What lead enrichment APIs work with n8n?

Free: Clearbit company API (100 lookups/month, company data from email domain), Hunter.io domain search (25/month). Paid with fuller coverage: Apollo.io ($49/month, includes phone + LinkedIn), Clearbit Enrichment ($99/month, full person + company), RocketReach ($80/month). All are called via HTTP Request node with API key auth. For most small teams, Clearbit free covers the firmographic signals the scoring formula needs.

Which is better for lead automation — n8n, Zapier, or HubSpot?

n8n is better for custom scoring logic (Code node runs any formula), multi-branch routing, and keeping lead data off third-party servers when self-hosted. Zapier handles simple single-step notifications but can't run custom scoring without a paid Code step. HubSpot includes lead scoring natively but requires Marketing Hub Professional at $890/month for behavior-based scoring. n8n + Notion or Airtable replicates that capability at $0–20/month.

Related Articles

No-Code & AI

n8n + Notion: How to Build a Full CRM Automation for Free

Exact database schema, 6 automation workflows — lead capture, enrichment, follow-ups, deal pipeline.

No-Code & AI

Automate Slack Notifications with n8n — 7 Practical Examples

Deploy alerts, lead pings, error monitoring, approval buttons — exact node setups for 7 workflows.

No-Code & AI

How to Connect n8n to Any API (No Code Required)

HTTP Request node, cURL import, all auth types, pagination, error handling — 5 real API configs.

Ready to Build Your Lead Generation Flow?

The LearnForge AI Apps course walks you through n8n from zero to production — lead automation, scoring logic, CRM integration, AI agents. Start with the free module today.

Start Free Module →