This workflow corresponds to n8n.io template #2452 — we link there as the canonical source.
This workflow follows the Emailsend → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"id": "fded4779-34cd-457f-98f2-ba1127969e16",
"name": "Workflow Description",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
100
],
"parameters": {},
"typeVersion": 1
},
{
"id": "e03330a2-08b2-4872-ba0e-b3b49ad8b9f8",
"name": "Start Campaign Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
1080,
440
],
"parameters": {},
"typeVersion": 1
},
{
"id": "68404c16-140a-46ba-858d-f13db02c39ee",
"name": "Update Recipient Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
3120,
440
],
"parameters": {},
"typeVersion": 4.5
},
{
"id": "bb341dc5-b00d-4804-ab5c-a479fc523e55",
"name": "Process Recipients",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1940,
420
],
"parameters": {},
"typeVersion": 3
},
{
"id": "f4689fc2-3908-42f4-8d43-0a14c775a809",
"name": "Validate Email Addresses",
"type": "n8n-nodes-base.if",
"position": [
1640,
440
],
"parameters": {},
"typeVersion": 2.2
},
{
"id": "5c0ff7a1-ed02-42cd-9e2e-24b95f4666b7",
"name": "Pause Between Emails",
"type": "n8n-nodes-base.wait",
"position": [
3680,
480
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "598f3f66-60e1-413f-9c15-2abc26dc89aa",
"name": "Generate Random Delay",
"type": "n8n-nodes-base.code",
"position": [
3280,
420
],
"parameters": {},
"typeVersion": 2
},
{
"id": "d4afcab6-8603-4fe1-b987-7dddafa29a54",
"name": "Fetch Recipient Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
1360,
440
],
"parameters": {},
"typeVersion": 4.5
},
{
"id": "afa333d4-f54d-4681-b407-67e49a093d2e",
"name": "Send Email",
"type": "n8n-nodes-base.emailSend",
"position": [
2680,
440
],
"parameters": {},
"typeVersion": 2.1
},
{
"id": "1c819407-7502-45f1-86da-b27247643e82",
"name": "Set Status to \"Sent\"",
"type": "n8n-nodes-base.set",
"position": [
2900,
440
],
"parameters": {},
"typeVersion": 3.4
},
{
"id": "57846b02-ec73-44d0-871d-e9d61c7b922d",
"name": "Create Personalized Email",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2320,
440
],
"parameters": {},
"typeVersion": 1.4
}
],
"connections": {
"Send Email": {
"main": [
[
{
"node": "Set Status to \"Sent\"",
"type": "main",
"index": 0
}
]
]
},
"Process Recipients": {
"main": [
null,
[
{
"node": "Create Personalized Email",
"type": "main",
"index": 0
}
]
]
},
"Fetch Recipient Data": {
"main": [
[
{
"node": "Validate Email Addresses",
"type": "main",
"index": 0
}
]
]
},
"Pause Between Emails": {
"main": [
[
{
"node": "Process Recipients",
"type": "main",
"index": 0
}
]
]
},
"Set Status to \"Sent\"": {
"main": [
[
{
"node": "Update Recipient Status",
"type": "main",
"index": 0
}
]
]
},
"Generate Random Delay": {
"main": [
[
{
"node": "Pause Between Emails",
"type": "main",
"index": 0
}
]
]
},
"Start Campaign Trigger": {
"main": [
[
{
"node": "Fetch Recipient Data",
"type": "main",
"index": 0
}
]
]
},
"Update Recipient Status": {
"main": [
[
{
"node": "Generate Random Delay",
"type": "main",
"index": 0
}
]
]
},
"Validate Email Addresses": {
"main": [
[
{
"node": "Process Recipients",
"type": "main",
"index": 0
}
]
]
},
"Create Personalized Email": {
"main": [
[
{
"node": "Send Email",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow demonstrates how to automate a large-scale personalized promotional email campaign, leveraging artificial intelligence to generate unique content for each recipient.
Source: https://n8n.io/workflows/2452/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
My workflow 11. Uses manualTrigger, splitOut, httpRequest, splitInBatches. Event-driven trigger; 14 nodes.
Trending YouTube Videos copy. Uses googleSheets, openAi, httpRequest, stickyNote. Event-driven trigger; 12 nodes.
1. LI Connection Request System: Trigger PhantomBuster Agent. Uses formTrigger, httpRequest, openAi, limit. Event-driven trigger; 8 nodes.
📊 Reads leads list from Google Sheets (Name, Email, Send Status) 🔍 Filters out already-contacted leads (skips "SENT" status) 🎲 Randomly selects email template from template library ✏️ Personalizes sub
Use this template if you’re collecting leads in Google Sheets manually or automatically and need to send them emails daily using any personal or professional email provider. It’s simple yet effective.