Skip to main content
Back to Blog
β€’Rafael Gonzalez

B2B lead gen as a pipe: scrape, enrich, filter, mail, follow up

Apify scrapes, ChatGPT or Claude enriches, n8n qualifies and sends. Why a chatbot is not a pipeline, and which tools on aifeatures.ai actually own each step.

Use this stack as a page: the B2B lead enricher.

Cold outreach that β€œjust uses GPT” is a form letter with extra tokens. The template that keeps showing up is a five-step B2B lead pipe: scrape a list, research each row, filter the junk, send mail, then schedule follow-ups.

The named scraper on those cards is Apify. We do not have an Apify tool page. Do not invent /tools/apify. Apify is a crawler platform; treat it as the scrape job, then come back to the matrix for the model and the orchestrator.

The stack that maps to what we actually track:

  1. Scrape β€” Apify (or any crawler you already pay for). Not ChatGPT.
  2. ChatGPT or Claude β€” research and enrich. One model, not both on the same row.
  3. Filter β€” a real rule (ICP, geo, headcount), not β€œthe AI will know.”
  4. n8n / Zapier / Make β€” send Gmail, wait, follow up.
  5. Perplexity β€” optional second pass when the enrich step needs a cited web answer, not a vibe.

This is not a lead-gen SaaS we sell. It is the handoff list so you do not ask one chatbot to scrape LinkedIn, invent a job title, and press send.

Why one prompt is not a pipeline

Scraping is a fetch-and-parse problem. Models are a language problem. Mixing them in one ChatGPT thread is how you get a confident email to a company that never existed.

ChatGPT has a free row and paid from $20/month. It is good at turning a messy company blurb into a one-line ICP fit and a first sentence that is not β€œI hope this email finds you well.” It cannot legally or reliably browse a thousand directory pages as your crawler.

Claude is the long-context cousin, also paid from $20/month on our matrix, with a context window we mark at 1M+ tokens. That is useful when the enrich step is β€œhere is the last ten pages of their blog, tell me if they buy this category.” It is wasted if you only have a name and a domain.

Perplexity is the research engine we already wrote up against Google in Perplexity Comet vs Google AI Mode. Use it when the question is β€œwhat does this company actually sell,” and you want sources. Do not use it as the mail merge.

Gmail is not on the matrix. Neither is HubSpot. The orchestrator is.

The five jobs (and what each must not do)

Scrape owns the list

Apify (or similar) returns rows: name, title, domain, maybe a LinkedIn URL. Cap the run. Deduplicate. Drop personal gmail.com catch-alls if your ICP is corporate.

Do not ask ChatGPT to β€œfind 500 CTOs in Berlin.” That is not a scrape. That is a hallucination with a spreadsheet costume.

The model owns enrich, not send

For each surviving row, the model gets a short packet: site title, about blurb, last blog post, job title. It returns structured fields you defined: icp_fit (yes/no/maybe), reason, first_line, unsubscribe_risk.

Use ChatGPT if that is already your API key. Use Claude if the packet is long. Compare them as writing/reasoning tools in ChatGPT vs Claude for coding if you need a side-by-side β€” the coding post is the honest pair page; the job here is the same models, different output schema.

Do not let the model choose the recipient. Do not let it send. Do not skip the filter because the first_line sounded clever.

Filter owns the kill switch

A Filter node in n8n is a boolean. icp_fit == yes and email looks corporate and not in suppression list. That is the whole product.

If you cannot write the rule in one sentence, you are not ready to automate send.

n8n owns mail and time

n8n is free to self-host; cloud is about $22/month on our matrix. Zapier is free at 100 tasks, then $19.99/month for Professional. Make is the third visual option; we do not quote an invented paid price.

The Gmail node sends the template. A scheduler waits three days, then sends follow-up one only if there was no reply. That last clause is the one people skip, and it is how you become the spam the filter was supposed to stop.

CRM is a write, not a personality

If you log to HubSpot, log the source URL of the scrape, the model’s reason, and the exact email body. When someone asks β€œwhy did you email me,” you need that row. The model will not remember next week.

One batch, seven steps

  1. Apify run against a directory or map you are allowed to crawl. Export JSON.
  2. n8n drops rows that fail basic hygiene.
  3. For each row, fetch the homepage (or a cached extract). Optional: Perplexity for a sourced one-liner.
  4. ChatGPT or Claude fills the enrich schema.
  5. Filter keeps yes. maybe goes to a human sheet. no is dropped.
  6. Gmail send with an unsubscribe path that actually works.
  7. Scheduler follow-up, then stop. Two touches, not twelve.

What this stack is not

It is not β€œAI does my SDR job.” The SDR job includes knowing when the scrape was junk.

It is not Copy.ai as a crawler. Copy.ai is a writing workspace. If you already live there for copy, you can generate the first_line there β€” still do not let it scrape.

It is not unlimited volume. Mail providers will kill the domain before the model runs out of tokens.

The page with the three matrix slots is the B2B lead enricher. Apify and Gmail stay infra. Swap Make for n8n or Zapier if that is already the house orchestrator.