What it does
Every Monday at 9am I get an email with 60 LinkedIn leads, each one scored, color-coded, and paired with a suggested opener — ready to reach out. No tabs, no copy-pasting, no guessing who's worth a message.
Before I built this, I spent ~90 minutes every Monday doing it by hand. Now I open my email, skim the top 10, and start conversations. The rest of the day is mine.
The stack
Phantombuster + n8n + Claude Haiku + Gmail. Six nodes and one Phantombuster phantom. Here's the actual flow:

Phantombuster scrapes 60 leads from a saved LinkedIn or Sales Navigator search URL on a weekly schedule. Monday at 9am, n8n picks up the results, hands each lead to Claude Haiku 4.5 for scoring and enrichment, sorts them by relevance, builds a color-coded HTML email, and sends it to you via Gmail.
Green badge = strong fit. Orange = worth a look. Red = skip.
The prompt
This is the part that makes it useful. Here's the exact Claude prompt — swap the scoring criteria at the bottom for your own ICP:
You are a B2B sales research assistant. For each LinkedIn lead, return a JSON object:
{
"name": "full name",
"title": "job title",
"company": "company name",
"company_description": "1-2 sentence description of the company",
"relevance_score": 1-10,
"talking_points": ["point 1", "point 2", "point 3"],
"suggested_opener": "a personalized conversation opener",
"profile_url": "linkedin url"
}
Scoring criteria (change these to match YOUR ICP):
- Founder/CEO/Co-founder: +3
- Ecommerce/retail/DTC companies: +3
- Netherlands/EU based: +2
- Small/medium companies: +1
- Decision-maker titles (VP, Director, Head of): +1
Return ONLY the JSON object.The suggested_opener field is the thing that makes this more than a spreadsheet. Each lead comes with an opening line tailored to their role and company — that's 80% of the cold-outreach work already done.
What broke the first three times
1. Claude sometimes wraps JSON in a markdown fence. The code node uses a regex to extract just the {...} object, ignoring whatever wrapper the LLM adds. If you use plain JSON.parse() instead, it'll crash once a week.
2. The S3 filename depends on your Phantombuster phantom. Different phantoms write different filenames — rapid-leads-v2.json, result.json, etc. Run yours once manually, check the Files tab, and use that exact filename. A 403 error in n8n almost always means the filename is wrong.
3. Gmail sends blank emails if the HTML field is undefined. If Claude returns nothing parseable, the code falls through. The current setup handles this gracefully — you'll get "Found 0 enriched leads" instead of silence.
What it costs
Phantombuster: ~$56/mo (14-day free trial, no card needed)
n8n: free self-hosted, or ~$20/mo for n8n Cloud
Claude Haiku API: ~$0.02/week
Gmail: free
Your Monday mornings: zero
Phantombuster is the one real cost. It's the piece that safely pulls leads from LinkedIn without risking your account — nothing in pure n8n can do this.
Want the full build guide?
This receipt shows you what the workflow does and gives you the prompt. The paid version ($9/mo) includes the step-by-step build guide: every node configured, the full JavaScript code, the Phantombuster setup walkthrough, and the n8n export file you can import in one click.
Subscribe to Workflow Weekly Pro → every Tuesday, a new receipt with the complete build.
Or stay on the free list — I'll keep sending the best public ones every few weeks.
— The Operator