Heygen email verification with BillionVerify
HeyGen is an AI video generation platform that lets teams create personalized, avatar-driven videos at scale. BillionVerify integrates with HeyGen workflows to validate recipient email addresses before personalized video messages are dispatched, ensuring your AI-generated content reaches real inboxes.
Why verify before the send
Personalized AI video campaigns are resource-intensive to produce and send. Delivering them to invalid, disposable, or catch-all addresses wastes generation costs and risks your sending domain's reputation. BillionVerify ensures every video email goes to a verified, reachable address.
Ready-to-use n8n workflow
Import this workflow into n8n — it verifies every address with BillionVerify before Heygen sends, so only deliverable contacts are emailed. Install the BillionVerify community node first, then add your API key. Adapted from this n8n template
{
"name": "Create AI personalized video & voice outreach with HeyGen, ElevenLabs & Perplexity + BillionVerify",
"nodes": [
{
"id": "657bc2dd-01f2-4292-acd1-d447c3a63283",
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-288,
0
],
"parameters": {
"event": "rowAdded",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "REPLACE_WITH_YOUR_SHEET_TAB",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/REPLACE_WITH_YOUR_SHEET_ID/edit#REPLACE_WITH_YOUR_SHEET_TAB",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "REPLACE_WITH_YOUR_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/REPLACE_WITH_YOUR_SHEET_ID/edit",
"cachedResultName": "Leads"
}
},
"typeVersion": 1
},
{
"id": "bba9b597-557a-49b5-9eb5-09fe7cc0b9f9",
"name": "Research Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
240,
0
],
"parameters": {
"text": "=Full Name:{{ $json.Name }}\nEmail Address:{{ $json['Email Address'] }}\nPhone Number: {{ $json['Phone Number'] }}\nCompany:{{ $json.Company }}\nIndustry: {{ $json.Industry }}\nLinkedIn Profile: {{ $json['LinkedIn URL'] }}\n",
"options": {
"systemMessage": "=You are Outbound Research Agent for Purple Unicorn, an influencer marketing agency.\nYour mission: Use Preplexity Tool to research the assigned prospect and return insights that equip the sales team to personalize highly relevant outreach.\n\nYou will be given the following input about the lead:\nFull Name, Email Address, Phone Number, Company Name, Industry, Linked URL\n\nYour responsibilities:\n\nUsing Perplexity Tool: \n\nResearch the PERSON\n\nCurrent role & main responsibilities\n\nRecent achievements, interviews, social activity, thought-leadership topics\n\nInterests related to content, influencers, social media, brand building\n\nResearch the COMPANY\n\nWhat they sell, who they serve, and main value propositions\n\nRecent news, campaigns, marketing strategy insights (especially digital/influencer)\n\nGrowth signals: funding, hiring trends, product launches\n\nCurrent presence on Instagram / TikTok / YouTube / LinkedIn if available\n\nIdentify OPPORTUNITIES\n\nWhere influencer marketing could help:\n\nIncrease brand awareness\n\nImprove social engagement & conversions\n\nModernize outdated marketing approach\n\nExample influencers or campaign angles aligned to their industry/customer base\n\nExtract TRIGGERS\n\nWhat makes this lead worth contacting right now\n\nTie insights directly to Purple Unicorn’s value (high-ROI influencer campaigns)\n\nTone & Format Requirements:\n\nBe accurate, concise, and compelling\n\nNo fluff, no generic statements\n\nUse bullet points and short actionable sentences\n\nInclude 3–5 customized outreach hooks that the SDR can directly use\n\nKeep strict data integrity — state only verifiable insights\n\nOutput Format (always follow this structure)\n\nProspect Overview\n\nName: …\n\nRole: …\n\nKey interests: …\n\nCompany Overview\n\nWhat they do: …\n\nTarget customers: …\n\nMarketing status: …\n\nOpportunities for Influencer Marketing (Purple Unicorn)\n\n…\n\nSales Triggers\n\n…\n\n3–5 Personalized Outreach Hooks\n\n…\n\n…\n\n…"
},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "9452861e-a74c-45bf-8ef5-905c04172888",
"name": "Message a model in Perplexity",
"type": "n8n-nodes-base.perplexityTool",
"position": [
304,
208
],
"parameters": {
"model": "sonar-pro",
"options": {},
"messages": {
"message": [
{
"content": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('message0_Text', ``, 'string') }}"
}
]
},
"simplify": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Simplify_Output', ``, 'boolean') }}",
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "a191cb19-4d54-4ccf-8489-733acbbb6a96",
"name": "Scripting Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
672,
0
],
"parameters": {
"text": "={{ $json.output }}",
"options": {
"systemMessage": "=You are Script Writing Agent for Marc from Purple Unicorn, an influencer marketing agency. \n\nYou will receive research insights about a single prospect and their company.\nYour job is to write a personalized 30-second outreach script for narration by an AI video avatar.\n\nRequirements:\n\nTone & Voice\n\nCasual, confident, and friendly\n\nSounds like a real human talking — no corporate jargon\n\nPersonalized references based on the provided research (THIS IS CRITICAL)\n\nFocus on building curiosity and interest, not hard selling\n\nContent Rules\n\nIntro with the prospect’s name and what caught our attention about their work or company\n\nBriefly connect Purple Unicorn’s influencer marketing expertise to their goals or current marketing status\n\nMention 1–2 specific opportunities or triggers discovered in research\n\nEnd with a light, non-pushy call to chat (“worth a quick convo?”)\n\nOutput Format\n\nOnly return the script as plain text (no bullet points or explanations)\n\n4–6 short conversational paragraphs\n\nTotal read time: ~30 seconds (80–110 words)\n\nProhibited\n\nNo email-style formatting (no subject lines, no signatures)\n\nNo emojis\n\nNo generic filler like “I hope you’re well”\n\nNo unverified claims\n\nExample structure (for reference — do not include in output)\n\nHi [Name], loved your work on…\nNoticed your company is pushing into…\nAt Purple Unicorn, we help brands like yours…\nThought we could explore…\nUp for a quick chat?\n\nStay focused on making the prospect feel seen, understood, and excited enough to respond.\n\n##Output rule\nOutput only valid text format without special characters to make sure that it will be a valid JSON input in the next node"
},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "4cb305d9-0838-4d74-8665-4f948e11b626",
"name": "Heygen Clone AI Creation",
"type": "n8n-nodes-base.httpRequest",
"position": [
1232,
0
],
"parameters": {
"url": "https://api.heygen.com/v2/video/generate",
"method": "POST",
"options": {},
"jsonBody": "={{\n {\n \"video_inputs\": [\n {\n \"character\": {\n \"type\": \"avatar\",\n \"avatar_id\": \"c84a546eb24e496da33673c336624d1c\",\n \"avatar_style\": \"normal\"\n },\n \"voice\": {\n \"type\": \"text\",\n \"input_text\": $json.output,\n \"voice_id\": \"e690edf698c043409a59fbfc5175c4b1\",\n \"speed\": 1.1\n }\n }\n ],\n \"dimension\": { \"width\": 720, \"height\": 1280 }\n }\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.3
},
{
"id": "2526777e-d184-4ffa-96df-581a3899cf24",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
2304,
0
],
"parameters": {
"sendTo": "user@example.com",
"message": "={{ $json.output.body }}\n\nListen my quick assessment of your business:\n{{ $('GET Result').item.json.data.video_url }}",
"options": {
"appendAttribution": false
},
"subject": "={{ $json.output.title }}",
"emailType": "text"
},
"typeVersion": 2.1
},
{
"id": "76a46ccd-e1f9-4022-a18e-9f760436dff9",
"name": "Send an SMS/MMS/WhatsApp message",
"type": "n8n-nodes-base.twilio",
"position": [
1584,
336
],
"parameters": {
"to": "REPLACE_PHONE",
"from": "REPLACE_PHONE",
"message": "={{ $json.webContentLink }}",
"options": {}
},
"typeVersion": 1
},
{
"id": "f0741d59-b5d6-4578-b24f-7ddf91527788",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
-96,
0
],
"parameters": {
"jsCode": "// \"items\" is an array of all rows coming from Google Sheets\n// We only want the latest one (usually the last item in the array)\n\nif (items.length === 0) {\n\treturn [];\n}\n\n// Take the last item (most recently added row)\nconst lastItem = items[items.length - 1];\n\n// Return it as a single-item array so n8n can continue as usual\nreturn [lastItem];\n"
},
"typeVersion": 2
},
{
"id": "f75ff906-4b9f-4cc8-8384-60bc6f2d4e6d",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
112,
208
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5.1",
"cachedResultName": "gpt-5.1"
},
"options": {
"timeout": 6000000
}
},
"typeVersion": 1.2
},
{
"id": "55a89042-e5ac-4c20-bb54-60e0400ab684",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
640,
208
],
"parameters": {
"model": "openai/gpt-5.1",
"options": {}
},
"typeVersion": 1
},
{
"id": "b9cab21d-8851-4e36-90fb-9f8bdc5d3d71",
"name": "Convert text to speech",
"type": "@elevenlabs/n8n-nodes-elevenlabs.elevenLabs",
"position": [
1152,
336
],
"parameters": {
"text": "={{ $json.output }}",
"voice": {
"__rl": true,
"mode": "id",
"value": "UEKYgullGqaF0keqT8Bu"
},
"resource": "speech",
"requestOptions": {},
"additionalOptions": {}
},
"typeVersion": 1
},
{
"id": "d27df0a6-1151-443a-86c0-28592890c5a4",
"name": "Upload file",
"type": "n8n-nodes-base.googleDrive",
"position": [
1360,
336
],
"parameters": {
"name": "Audio",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "REPLACE_WITH_YOUR_FOLDER_ID",
"cachedResultUrl": "https://drive.google.com/drive/folders/REPLACE_WITH_YOUR_FOLDER_ID",
"cachedResultName": "n8n Folder"
}
},
"typeVersion": 3
},
{
"id": "54f9ad85-bc0d-4f02-9c30-8168060bba3f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1056,
-80
],
"parameters": {
"color": 6,
"width": 1536,
"height": 288,
"content": "Intro Video Generation + Send to Email"
},
"typeVersion": 1
},
{
"id": "7c816c51-b4fe-47e7-8b50-a6ba687ff359",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1056,
240
],
"parameters": {
"color": 4,
"width": 752,
"height": 288,
"content": "Voice Generation and Text"
},
"typeVersion": 1
},
{
"id": "70dcb589-3e92-41f7-9208-1c3afd6a7f71",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
-96
],
"parameters": {
"color": 4,
"width": 960,
"height": 624,
"content": "Research & Script"
},
"typeVersion": 1
},
{
"id": "0f2d716c-7aa0-441c-936c-c4f3cc1674d3",
"name": "Wait 30s",
"type": "n8n-nodes-base.wait",
"position": [
1440,
0
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "9364537a-8917-43ab-b9c2-12ceec88d1c0",
"name": "GET Result",
"type": "n8n-nodes-base.httpRequest",
"position": [
1648,
0
],
"parameters": {
"url": "https://api.heygen.com/v1/video_status.get",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "video_id",
"value": "={{ $json.data.video_id }}"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "aa799380-8601-4d87-a2a2-f8e47fee29cb",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1856,
0
],
"parameters": {
"text": "={{ $('Research Agent').item.json.output }}",
"options": {
"systemMessage": "You are the Outreach Email Copywriter Agent for Purple Unicorn Marketing Agency.\nYour task is to generate one short and personalized outbound email for each prospect.\n\nRequirements:\n\nYou will receive prospect details in the user input\n\nUse their company information or recent updates to personalize the message\n\nThe email must reference a personalized intro video included in the outreach\n\nMarc from Purple Unicorn Agency is the sender\n\nTone: friendly, clear, and value-led\n\nKeep it short and impactful (no long paragraphs)\n\nSTRICT Output Format\n\nYou must output valid JSON only, with exactly two properties:\n\n{\n \"title\": \"A short, attention-grabbing subject line\",\n \"body\": \"Email body text here. Keep paragraphs short and include a reference to the personalized video.\"\n}\n\n\nMandatory rules\n\nNo additional text outside the JSON\n\nNo markdown formatting\n\nNo emojis\n\nNo explanations or annotations\n\nIf the required information is insufficient, use placeholders rather than adding commentary\n\nIf your output does not strictly match the JSON structure above, it will be considered incorrect."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "f236ceb1-bb32-4058-af83-0b079263f7cf",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1824,
224
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "06c9c350-5107-45dc-bf89-8df081dda40f",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2032,
208
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n \"title\": \"…\",\n \"body\": \"…\"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "a7abfece-d384-40f7-8c1a-a48609a6ce73",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1968,
416
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "64bb87e2-5094-44b9-a0e3-a9c4d0805f66",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-96
],
"parameters": {
"color": 7,
"width": 368,
"height": 624
},
"typeVersion": 1
},
{
"id": "7f7bc175-94e8-4a40-9b58-c875fd196c8d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1200,
-96
],
"parameters": {
"width": 800,
"height": 816,
"content": "What this Workflow Does\n\nAutomates the creation of hyper-personalized outreach videos, voice notes, and emails whenever a new lead is added to Google Sheets.\n\nWatch step-by-step tutorial of this build here: https://www.youtube.com/watch?v=q9AAh9zRou4\n\nIt performs:\nLead Intake (Google Sheets Trigger → Latest Row Extractor)\nDeep AI Research (Perplexity + Research Agent)\nPersonalized Scriptwriting (Script Agent)\nHeyGen Video Generation\nElevenLabs Voice Note Generation\nUpload Audio to Google Drive\nEmail Delivery (video + voice note + personalized email)\nOptional SMS/WhatsApp Message via Twilio\n\nHigh-Level Flow\nGoogle Sheets → Research → Script → Video → Voice → Drive → Email/SMS\n\nNode Lane Explanations\n\nResearch & Script Lane\nCode Node: grabs latest lead from the sheet\nResearch Agent: uses Perplexity to gather insights\nScript Agent: creates a 30-sec personalized outreach script\nOpenAI/OpenRouter models: support research + script consistency\nVideo Generation Lane\nHeyGen Request: creates avatar video based on script\nWait → GET Result: polls until video is ready\nAI Email Agent: generates JSON email (subject + body referencing video)\nVoice & Upload Lane\nElevenLabs: converts script or summary to voice note\nGoogle Drive Upload: stores voice file\nTwilio (optional): sends voice note link via SMS/WhatsApp\nEmail Output\nGmail Node: sends the outreach email + video link + voice note link to your inbox\n\nPurpose\nCreate SDR-ready, highly-personalized outreach assets using AI — end-to-end automated."
},
"typeVersion": 1
},
{
"id": "8eaee9ef-0431-40e6-8ddb-6937d0fa05a2",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-496
],
"parameters": {
"width": 688,
"height": 368,
"content": "@[youtube](q9AAh9zRou4)"
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.email || $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
1944,
0
],
"name": "Verify Email (BillionVerify)",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
2124,
0
],
"name": "IF deliverable"
}
],
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Wait 30s": {
"main": [
[
{
"node": "GET Result",
"type": "main",
"index": 0
}
]
]
},
"GET Result": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Upload file": {
"main": [
[
{
"node": "Send an SMS/MMS/WhatsApp message",
"type": "main",
"index": 0
}
]
]
},
"Research Agent": {
"main": [
[
{
"node": "Scripting Agent",
"type": "main",
"index": 0
}
]
]
},
"Scripting Agent": {
"main": [
[
{
"node": "Heygen Clone AI Creation",
"type": "main",
"index": 0
},
{
"node": "Convert text to speech",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Research Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Research Agent",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model2": {
"ai_languageModel": [
[
{
"node": "Structured Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Sheets Trigger": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "Scripting Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Convert text to speech": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Heygen Clone AI Creation": {
"main": [
[
{
"node": "Wait 30s",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Message a model in Perplexity": {
"ai_tool": [
[
{
"node": "Research Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"executionOrder": "v1"
}
}Workflow templates with Heygen
Ready-to-use workflows that verify emails before Heygen sends.
How it works
- 1
Integrate BillionVerify into your HeyGen outreach pipeline using the n8n community node, Integrately, or the REST API.
- 2
Before a video is generated or scheduled for a contact, pass their email address to BillionVerify for validation.
- 3
BillionVerify checks the address for syntax errors, domain validity, disposable providers, and SMTP-level deliverability.
- 4
Contacts with verified addresses proceed to video generation and delivery; invalid addresses are skipped or flagged for review.
- 5
Monitor verification results to continuously improve your contact data quality.
When to use this
Verify leads before personalized video outreach
Before generating and sending a personalized HeyGen video to a prospect, run their email through BillionVerify. Confirm the mailbox is real and reachable so your AI content investment isn't wasted on a dead address.
Filter contact lists for video newsletter campaigns
When sending video content to a broad audience via HeyGen, bulk-verify your contact list first. Strip invalid and disposable addresses to keep bounce rates low and your sender domain healthy.
FAQ
Why verify emails before sending AI-generated videos?
Producing personalized video content takes time and compute resources. Sending to invalid or disposable addresses wastes that investment and can trigger spam filters, harming your sender reputation on future campaigns.
Can I verify a large batch of contacts before a HeyGen campaign launch?
Yes. BillionVerify's bulk API lets you verify thousands of addresses in one pass. Clean your list before the campaign kicks off to maximize delivery rates and protect your domain reputation.
What is a catch-all address and should I send to one?
A catch-all domain accepts email for any address, whether or not the mailbox exists. BillionVerify flags these so you can decide whether to include or exclude them — often worth skipping for high-value video sends.
Verify emails in Heygen
Create a free account, grab your API key, and stop bounces before they happen.
Get started free