Step-by-step tutorial for building an automated outbound lead generation system that finds, enriches, and contacts prospects on autopilot.
In this tutorial we walk through the exact outbound lead generation pipeline we build for B2B clients — the one that turns "I need more meetings" into a system that runs in the background and produces qualified replies every week. It is not magic; it is roughly six n8n nodes and an OpenAI call, and you can have a first version live in under a day.
What You Will Need
- An n8n instance (self-hosted or cloud) - An OpenAI API key - A LinkedIn-style data source — Apollo, Clay, or your own scraper - An email-sending service with reply tracking (Smartlead, Instantly, or similar) - A CRM you actually use (HubSpot in our examples)
Step 1: Set Up the Source
The first node pulls your target list. Define your ICP narrowly — title, company size, industry, recent funding event, and ideally one trigger (new hire, new tech in the stack, recent expansion). The narrower the trigger, the higher your reply rate.
We pull batches of 50 prospects per run, twice a day. Smaller batches keep the rest of the pipeline calmer and avoid burning through your enrichment credits when you make a mistake.
Step 2: Enrich the Contact Data
A name and a company are not enough. You need a verified work email, role context, and ideally a recent signal — a job change, a published article, a recent product launch. We chain two enrichment services so that anything missed by the first pass is filled by the second. Anything still missing after the second pass is dropped, not guessed at; bad emails kill deliverability faster than anything else.
Step 3: Personalise with AI
This is where most outbound systems get lazy and most replies disappear. The lazy version inserts the first name and the company. The version that works writes a single, specific opener that references the prospect's actual situation.
We feed each prospect's recent LinkedIn activity, company news, and role context into an OpenAI call with a tightly scoped prompt: "Write the opening sentence of an email from a B2B automation agency to this person. Reference one concrete recent event from their company. No platitudes. No 'I came across your profile.' Maximum 24 words."
Output goes into a custom field on the prospect record. Everything else in the email — the value prop, the CTA — is templated and unchanged across the campaign.
Step 4: Send and Track
The enriched, personalised prospects flow into your sending tool of choice. Schedule the campaign across business days, throttle volume per sender to under 50 per day, and route replies through a webhook back into n8n.
Any positive reply triggers an instant Slack alert to the AE, the HubSpot record is updated, and the rest of the campaign for that prospect is paused so they never get follow-up emails after they have already replied.
Step 5: Tune the Loop
The first version will get a reply rate somewhere between 1% and 4%. The version you will be running six months later will be at 8–12%, and the difference is almost entirely down to two things: tighter ICP filters and better personalisation prompts. Review reply data weekly. Note which trigger types convert. Re-run the prompt against your top-performing replies and ask the model to extract what they have in common; feed that back into the prompt.
A well-tuned pipeline of this shape consistently produces 10–20 qualified meetings a month from a list of 1,000 prospects. The first version takes a day to build. The mature version takes six months to evolve into. Both are worth it.