Cold email open rates are dying. Video messages cut through — a personalized 60-second video from a real (or AI) person gets replied to at 3–5x the rate of a text email. The problem is that recording 50 individual videos a week is not a job anyone wants. This pipeline does it automatically.
I built a system in n8n that reads a prospect list from Google Sheets, writes a personalized script for each contact using Claude, generates an AI avatar video via HeyGen's API, and sends the video link by email — all without touching it after the initial setup. One run. Fifty personalized videos. Twenty minutes.
Why HeyGen Over Synthesia
Both work. HeyGen's API is easier to call from n8n — the video generation endpoint accepts a script and avatar ID and returns a video URL when rendering is done. Synthesia has tighter enterprise controls but more friction for API-first use cases. For outreach pipelines, HeyGen is the faster path.
The Full Pipeline
Step 1 — Reading and Looping Prospects
Use a Google Sheets node to read all rows where the status column is empty — that's your unsent batch. A Split In Batches node processes them one at a time to avoid hitting the HeyGen API rate limit.
Step 2 — Writing the Script with Claude
Each script is personalised using the prospect's name, company, and one specific detail you've noted (a recent product launch, a LinkedIn post, a pain point). Pass these to Claude via the HTTP Request node with a structured prompt:
The prompt asks for a 60-second script (roughly 150 words), conversational tone, one specific reference to the contact's situation, and a clear CTA. Claude returns the script text directly — no parsing needed if you prompt it cleanly.
Keep the script tight
Under 150 words. One problem mentioned. One thing you can help with. One ask. HeyGen renders faster on shorter scripts and viewers drop off after 90 seconds regardless.
Step 3 — Generating the Video via HeyGen API
HeyGen's video generation endpoint is a simple POST request. Pass your avatar ID, the script text, voice ID, and optionally a background. The API returns a video_id immediately — the actual video takes 2–5 minutes to render.
To wait for the render without blocking n8n, use a Wait node set to 3 minutes, followed by a polling loop that calls the HeyGen status endpoint until status === "completed". Then extract the video_url.
Step 4 — Sending the Email
Use the Gmail node to send the outreach email. The subject line includes the prospect's first name. The body is 3 sentences: context for the video, the video link (HeyGen generates a shareable page), and the ask. Keep it short — the video does the selling.
Write the email body in n8n using an expression that pulls from the same row data used for the script. Consistent personalisation across the subject, email body, and video makes the whole thing feel human.
Step 5 — Logging Back to Sheets
After each send, update the prospect row in Sheets: set status to "sent", log the video URL, and record the timestamp. This prevents duplicate sends on re-runs and gives you a record for follow-up sequencing.
Results in Practice
For a B2B SaaS company targeting HR managers in Germany, this pipeline generated 50 personalised videos in under 25 minutes of active setup time. The outreach campaign achieved a 31% reply rate in the first week — compared to a 6% baseline on their previous text email sequences. Three meetings booked from the first batch.
What This Costs
HeyGen API pricing is per video credit — roughly €0.50–1.00 per video depending on your plan. For 50 videos: €25–50. Claude API costs are negligible (a few cents for 50 scripts). Gmail is free. Total cost per campaign of 50 videos: under €60, including infrastructure.