Your sales team spends three hours every morning trawling through LinkedIn, reading company news, visiting websites, and drafting personalised emails. By noon, they've contacted eight prospects. By end of week, they've spent twenty hours on research and admin work instead of actually selling. Most of those emails never get opened anyway because they're generic enough to fit anyone in a five-mile radius. The problem isn't the work itself; it's the friction between steps. Someone finds a prospect, copies their name into a spreadsheet, reads their profile, visits their company website, then switches to Gmail to write something that sounds vaguely personal. Each handoff introduces delay and makes mistakes more likely. What if you could eliminate those handoffs entirely? This workflow takes a LinkedIn prospect URL, extracts the key information, summarises their company background, and generates a genuinely personalised cold email, all without touching a keyboard after the initial trigger. You'll move from research-to-email taking hours to taking minutes.
The Automated Workflow
We'll use n8n as the orchestration tool because it handles webhooks well, has native integrations for email delivery, and runs self-hosted or cloud-hosted. The workflow follows this path: trigger from a webhook, fetch LinkedIn profile data, summarise company context, generate a personalised email, and send it to your CRM or email tool.
Setting up the n8n workflow
Start a new workflow in n8n. Add a Webhook node to receive incoming requests. This becomes your entry point whenever your sales team finds a prospect they want to email.
Webhook trigger configuration:
- HTTP Method: POST
- Authentication: Basic auth (use a strong password)
- Expected incoming data: LinkedIn_URL, prospect_email, your_name, your_company
Step 1: Extract prospect information
Use a ChatGPT Writer node or a standard HTTP node to call the OpenAI API and extract structured data from the LinkedIn profile. You'll send the LinkedIn URL and ask GPT-4o mini to pull out the prospect's current role, company, how long they've been there, previous roles, and notable achievements mentioned in their headline or summary.
POST https://api.openai.com/v1/chat/completions { "model": "gpt-4o-mini", "messages": [ { "role": "user", "content": "Visit this LinkedIn profile: {{$node.Webhook.json.linkedin_url}}\n\nExtract and return ONLY valid JSON:\n{\n \"prospect_name\": \"\",\n \"current_title\": \"\",\n \"current_company\": \"\",\n \"years_in_role\": \"\",\n \"previous_roles\": [],\n \"key_achievements\": \"\"\n}" } ], "temperature": 0.3
}
Alternatively, if you want to avoid asking GPT to browse (which adds latency), you can use a dedicated LinkedIn scraper API or ColdConvert AI's data enrichment features. ColdConvert returns structured prospect data directly.
Step 2: Summarise company context
Next, add another HTTP node to fetch company information. Use Smmry's API (or Claude Opus 4.6 via the API) to summarise the prospect's company website or recent news. This gives the email generator actual context to work with, not just guesses.
POST https://api.smmry.com/summarise { "sm_api_input": "{{$node.HTTPRequest.json.company_website}}", "sm_api_input_type": "webpage", "sm_api_length": 5
}
Smmry returns key points from the company website. Store these in a variable for the next step.
Step 3: Generate the personalised email
Now pass all this context, plus your sales rep's details, to either ColdConvert AI or GPT-4o to generate the email. Use a code node to format the prompt properly, then call the LLM.
POST https://api.openai.com/v1/chat/completions { "model": "gpt-4o", "messages": [ { "role": "system", "content": "You are an expert B2B sales email writer. Write short, specific, and genuine cold emails that mention something real about the prospect and their company. Keep it under 150 words. Include a single, clear call to action. Do not use generic phrases like 'add value' or 'let's touch base'." }, { "role": "user", "content": "Write a cold email for:\n\nProspect: {{$node.ProspectData.json.prospect_name}}, {{$node.ProspectData.json.current_title}} at {{$node.ProspectData.json.current_company}}\n\nContext: {{$node.Smmry.json.summary}}\n\nTheir background: {{$node.ProspectData.json.key_achievements}}\n\nSender: {{$node.Webhook.json.your_name}}, {{$node.Webhook.json.your_company}}\n\nKey insight to mention: {{$node.Webhook.json.unique_angle}}" } ], "temperature": 0.7
}
GPT-4o strikes the right balance between creativity and consistency for email copy. It won't sound robotic, but it also won't hallucinate false details about the prospect.
Step 4: Send or save the email
At this point, you have options. You can send directly via Gmail API, save it to Pipedrive or HubSpot for manual review before sending, or log it in Airtable. Most teams prefer a review step for the first week or two, then move to fully automated sending once they trust the quality.
If using Airtable as a holding area:
POST https://api.airtable.com/v0/YOUR_BASE_ID/Prospects { "records": [ { "fields": { "Prospect Name": "{{$node.ProspectData.json.prospect_name}}", "Email Address": "{{$node.Webhook.json.prospect_email}}", "Generated Email": "{{$node.EmailGeneration.json.email_body}}", "Status": "Ready to Send" } } ]
}
The complete n8n workflow looks like this: Webhook → Extract Prospect Data → Summarise Company → Generate Email → Save to CRM. No manual copy-paste. No tab switching.
Rate limiting and cost control
Both OpenAI and Smmry have rate limits. n8n has built-in rate limiting; set it to 3 requests per second. If you're running high volume (more than 100 emails per day), stagger the requests using a Queue node. For cost, use GPT-4o mini for prospect data extraction (cheaper, faster) and GPT-4o only for email generation (where quality matters most).
The Manual Alternative
If you're not ready to fully automate, use ColdConvert AI directly. Paste a prospect's LinkedIn URL into ColdConvert, it enriches the data and generates an email in seconds. You review it, tweak the call to action, and send. This cuts research time from thirty minutes to two minutes per prospect, which is still a huge win. For even lighter touch, open ChatGPT Writer in Gmail, paste your prospect notes into the compose field, and let it draft something based on what you've already researched. Not automatic, but faster than writing from scratch.
Pro Tips
Email personalisation depth matters more than volume.
An email that mentions one specific detail from their LinkedIn about a recent company announcement will outperform a generic template every time.
Make sure your prompt to GPT-4o includes something genuinely personal, not just their name and job title.
Monitor reply rates week by week.
If your email open and reply rates drop after the first two weeks, the model probably needs retraining. Add a feedback loop: log which emails got replies, analyse what worked, update your system prompt.
Use Claude Opus 4.6 for high-stakes outreach.
If you're targeting C-suite or very senior prospects, Claude Opus tends to produce more sophisticated, less "salesy" emails. GPT-4o is faster and cheaper; Claude is better at nuance.
Implement a duplicate detection step.
Before sending, check your CRM to ensure you're not emailing someone you've already contacted in the past six months. Add a simple database query in n8n before the send step.
Handle API failures gracefully.
If the LinkedIn scrape fails or Smmry times out, don't break the whole workflow. Add error handlers in n8n that flag the prospect for manual review instead of sending a broken email or silently failing.
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| OpenAI (GPT-4o mini + GPT-4o) | Pay-as-you-go | £15–40 | Depends on email volume; mini is ~£0.01 per request, GPT-4o ~£0.03 |
| ColdConvert AI | Pro plan | £29 | If using instead of building custom extraction |
| Smmry | API credits | £10–20 | Optional; skip if company info is already in your CRM |
| n8n | Cloud plan or self-hosted | £0 or £50+ | Cloud starts free; self-hosted has no recurring cost |
| Gmail or Outlook API | Included with Microsoft/Google | £0 | Already in your stack |