I build lead pipelines with n8n because it lets me glue scraping, enrichment and cold emailing into a repeatable workflow. This guide shows a practical flow you can run on a single n8n instance. I keep examples concrete so you can copy the parts that matter: data scraping, simple enrichment, verification, and low-risk cold emailing. Expect clear node names and what each node does. No theory.
Start with data scraping and capture. Use n8n’s HTTP Request node to fetch a target page or an API endpoint that lists prospects. If you must scrape rendered pages, run a headless scraper elsewhere and push JSON into n8n via a webhook. Use the HTML Extract node or a Function node that runs Cheerio to pull names, titles, emails and company URLs. Map fields to a normalised schema: givenname, familyname, title, email, company, source_url. Write results into a datastore you control: Google Sheets, Airtable, or Postgres. I keep a unique ID per row to avoid duplicates.
Enrich and filter. Call an enrichment API from n8n with the HTTP Request node. Ask for company size, industry and LinkedIn profile when available. Don’t enrich every record. Use an If node that checks title keywords and company size before spending API credit. Add a simple scoring rule with a Function node: +2 for senior titles, +1 when company size is 50+, -1 for generic emails like info@. Send high-score rows to a “qualified” sheet. Keep low-score rows for later review.
Verify contact quality. Run a lightweight validation step. Use a syntax check on the email string. Call a verification API where you have an account; send only addresses that pass an MX check or verification result. Track verification status on the sheet. For open tracking, create a webhook in n8n and include a 1×1 image tag in the HTML email that points to that webhook. The webhook updates the prospect row when hit. Use the Wait node or a Delay node to space follow-ups. Make sure your sending domain has proper SPF and DKIM set before sending any volume.
Cold emailing with safety. Use the SMTP node or a Gmail node if you send from a personal account. Personalise heavily. Build templates in a Set node that insert given_name, company and a short value statement no longer than two sentences. Add a plain-text fallback. Use an If node to split follow-ups: send a second message only if the open webhook did not fire and no reply field exists. Throttle sends with a Delay or Cron node to avoid bursts. Start at a small daily volume that feels safe for your domain. Monitor bounces and move bad addresses to a suppression list automatically.
Operations and monitoring. Add a summary webhook that runs daily and writes counts to a dashboard sheet: sent, delivered, opened, replied, bounced. Add an on-fail path to capture errors into a log sheet so you can fix selectors or API keys quickly. Back up raw scraped JSON regularly. Rotate API keys for enrichment services if you hit rate limits.
A few practical caveats. Treat scraping as brittle; change in page structure breaks parsing. Test selectors against several pages before automating. Keep templates short to avoid spam triggers. Don’t send to purchased lists without verification. Track and remove bounces fast.
If you follow this flow you get a repeatable n8n lead generation automation that captures prospects, enriches selectively, verifies quality, and runs measured cold email sequences. The pieces are small and composable. Build one block, test it with real rows, then add the next. That approach catches errors early and keeps your sending reputation intact.







