This workflow follows the Gmail → 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 →
{
"name": "bulk-email-sender",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "start-campaign",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-976,
48
],
"id": "4ba2e004-486b-425f-9b48-a285438255ac",
"name": "Webhook"
},
{
"parameters": {
"respondWith": "allIncomingItems",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
240,
-224
],
"id": "b6b378f8-3e60-419d-80ed-8e4e0c286cbf",
"name": "Respond to Webhook"
},
{
"parameters": {
"jsCode": "// Function Item\nconst now = new Date();\n\nconst formatter = new Intl.DateTimeFormat('tr-TR', {\n timeZone: 'Europe/Istanbul',\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n});\n\nconst formatted = formatter.format(now);\n\nreturn {\n date: formatted,\n};"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-768,
48
],
"id": "1678f08b-0278-478b-af1c-2b9424d30a18",
"name": "Get Date"
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg",
"mode": "list",
"cachedResultName": "bulk-email",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 451757871,
"mode": "list",
"cachedResultName": "sent-campaigns",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit#gid=451757871"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"campaign_id": "={{ $('Webhook').item.json.body.campaign_id }}",
"email_subject": "={{ $('Webhook').item.json.body.email_subject }}",
"email_body": "={{ $('Webhook').item.json.body.email_body }}",
"email_signature": "={{ $('Webhook').item.json.body.email_signature }}",
"CC": "={{ $('Webhook').item.json.body.CC }}",
"BCC": "={{ $('Webhook').item.json.body.BCC }}",
"total_sent": "0",
"date_started": "={{ $json.date }}"
},
"matchingColumns": [],
"schema": [
{
"id": "campaign_id",
"displayName": "campaign_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "email_subject",
"displayName": "email_subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "email_body",
"displayName": "email_body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "email_signature",
"displayName": "email_signature",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "CC",
"displayName": "CC",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "BCC",
"displayName": "BCC",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "total_audience",
"displayName": "total_audience",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "total_sent",
"displayName": "total_sent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "date_started",
"displayName": "date_started",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-544,
48
],
"id": "a78fcd9f-0de7-4d33-8580-bd1ec788faaa",
"name": "Save Campaign",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-32,
48
],
"id": "ab4d2e2a-ddbe-41a3-aead-b00c4215d26d",
"name": "Loop Over Items"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg",
"mode": "list",
"cachedResultName": "bulk-email",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "main",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit#gid=0"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-336,
48
],
"id": "47aad9ec-9051-40e9-89ee-ddadcb6aadbd",
"name": "Get Emails",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "={{ $('Loop Over Items').item.json['Email Address '] }}",
"subject": "={{ $('Webhook').item.json.body.email_subject }}",
"message": "={{ $('Replace Variables and Generate Signatured Body').item.json.fullBody }}",
"options": {
"appendAttribution": false,
"bccList": "={{ $json.BCC }}",
"ccList": "={{ $json.CC }}"
}
},
"id": "3341fa46-11ef-4aac-9d7e-5662e23cf959",
"name": "Send Email",
"type": "n8n-nodes-base.gmail",
"position": [
704,
64
],
"typeVersion": 2.1,
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// De\u011ferleri bir \u00f6nceki node'dan al (\u00f6rnek node ad\u0131: \"Get Data\")\nconst name = $input.first().json.Name || \"\";\n\n// Mail g\u00f6vdesi (\u00f6rnek)\nlet mailBody = $('Webhook').first().json.body.email_body ;\n\n// \u0130mza (\u00f6rnek)\nlet signature = $('Webhook').first().json.body.email_signature;\n\n// De\u011fi\u015fkenleri mailBody'de de\u011fi\u015ftir\nmailBody = mailBody\n .replace(/{{name}}/g, name);\n\n// G\u00f6vde ve imzay\u0131 alt alta birle\u015ftir\nconst fullBody = `${mailBody}\\n\\n${signature}`;\n\nreturn [\n {\n json: {\n name,\n fullBody\n }\n }\n];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
64
],
"id": "b9e9032f-a88e-4422-a5b8-3a10728746f7",
"name": "Replace Variables and Generate Signatured Body"
},
{
"parameters": {
"jsCode": "// \"Get Settings\" node'undan al\nconst CC_raw = $('Webhook').first().json.body.CC;\nconst BCC_raw = $('Webhook').first().json.body.BCC;\n\nfunction toCommaString(input) {\n let arr = [];\n\n // 1) Dizi ise direkt kullan\n if (Array.isArray(input)) {\n arr = input;\n } else if (typeof input === 'string') {\n const s = input.trim();\n\n // 2) Stringle\u015ftirilmi\u015f JSON dizi mi? => parse et\n if ((s.startsWith('[') && s.endsWith(']')) || (s.startsWith('[\"') && s.endsWith('\"]'))) {\n try {\n const parsed = JSON.parse(s);\n if (Array.isArray(parsed)) arr = parsed;\n else arr = [s];\n } catch {\n // JSON parse ba\u015far\u0131s\u0131zsa CSV gibi b\u00f6l\n arr = s.split(/[,\\s;]+/);\n }\n } else {\n // 3) Normal CSV / bo\u015fluk / ; ile b\u00f6l\n arr = s.split(/[,\\s;]+/);\n }\n } else if (input == null) {\n arr = [];\n } else {\n arr = [String(input)];\n }\n\n // 4) Her bir girdiden email'i \u00e7\u0131kar (Name <mail@host> format\u0131n\u0131 da destekler)\n const emails = arr\n .map(v => String(v).trim())\n .map(v => {\n // <mail@host> varsa i\u00e7ini al\n const mAngle = v.match(/<([^>]+)>/);\n if (mAngle) return mAngle[1].trim();\n return v.replace(/^\"+|\"+$/g, ''); // \u00e7evredeki \u00e7ift t\u0131rnaklar\u0131 temizle\n })\n // basit e-posta regex do\u011frulamas\u0131\n .map(v => {\n const m = v.match(/([A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,})/i);\n return m ? m[1] : '';\n })\n .filter(Boolean);\n\n // 5) Tekrars\u0131zla\u015ft\u0131r + virg\u00fcl ile ve BO\u015eLUKSUZ birle\u015ftir\n const unique = Array.from(new Set(emails));\n return unique.join(',');\n}\n\nconst CC = toCommaString(CC_raw);\nconst BCC = toCommaString(BCC_raw);\n\nreturn [{ json: { CC, BCC } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
480,
64
],
"id": "0cacb08f-c049-4cd4-9566-0a9dc16bf240",
"name": "Include CC and BCC Emails"
},
{
"parameters": {
"amount": 3
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
912,
64
],
"id": "d89a0871-b601-47af-8d2c-b54b8511e4f9",
"name": "Wait"
},
{
"parameters": {
"jsCode": "// Function\nconst n = $input.first().json.total_sent || 0; // \u00f6rn: 5\nconst inc = Number(n) + 1;\n\nreturn [\n {\n json: {\n number: inc,\n },\n },\n];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1328,
64
],
"id": "c60d5863-9fae-412e-b810-69c2d3ccaad5",
"name": "Code in JavaScript"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg",
"mode": "list",
"cachedResultName": "bulk-email",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 451757871,
"mode": "list",
"cachedResultName": "sent-campaigns",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit#gid=451757871"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"campaign_id": "={{ $('Webhook').item.json.body.campaign_id }}",
"total_sent": "={{ $json.number }}"
},
"matchingColumns": [
"campaign_id"
],
"schema": [
{
"id": "campaign_id",
"displayName": "campaign_id",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "email_subject",
"displayName": "email_subject",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "email_body",
"displayName": "email_body",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "email_signature",
"displayName": "email_signature",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "CC",
"displayName": "CC",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "BCC",
"displayName": "BCC",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "total_audience",
"displayName": "total_audience",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "total_sent",
"displayName": "total_sent",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "date_started",
"displayName": "date_started",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1536,
64
],
"id": "ff9d9a09-1abf-4526-8348-c7913fa18bfb",
"name": "Update row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg",
"mode": "list",
"cachedResultName": "bulk-email",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 451757871,
"mode": "list",
"cachedResultName": "sent-campaigns",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/14vaFJk4IuqMNP4KCQTepGrYbsNuYV5xkqLOu__52Jdg/edit#gid=451757871"
},
"filtersUI": {
"values": [
{
"lookupColumn": "campaign_id",
"lookupValue": "={{ $('Save Campaign').item.json.campaign_id }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
1120,
64
],
"id": "6df5c02d-c0a2-4de8-abab-0de332db551e",
"name": "Get row(s) in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Get Date",
"type": "main",
"index": 0
}
]
]
},
"Get Date": {
"main": [
[
{
"node": "Save Campaign",
"type": "main",
"index": 0
}
]
]
},
"Save Campaign": {
"main": [
[
{
"node": "Get Emails",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
],
[
{
"node": "Replace Variables and Generate Signatured Body",
"type": "main",
"index": 0
}
]
]
},
"Get Emails": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Send Email": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Replace Variables and Generate Signatured Body": {
"main": [
[
{
"node": "Include CC and BCC Emails",
"type": "main",
"index": 0
}
]
]
},
"Include CC and BCC Emails": {
"main": [
[
{
"node": "Send Email",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Update row in sheet": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "8ef52a12-ce00-43c4-9a6b-2e67ade78fb8",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "ws89f3JWZFNuaZo6",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
bulk-email-sender. Uses googleSheets, gmail. Webhook trigger; 13 nodes.
Source: https://github.com/octaworksofficial/n8n/blob/20a248338297da94c67a12b0db3035f88d91a82f/TEYMUR/bulk-email-sender.json — 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.
Automate WhatsApp communication for recruitment agencies with an interactive, structured customer experience. This workflow handles pricing inquiries, request submissions, tracking, complaints, and hu
Code. Uses googleSheets, gmail, supabase, stickyNote. Webhook trigger; 51 nodes.
This template turns Podium's conversation inbox into a full sales CRM with a custom funnel, AI message classification, automated drip follow-ups, daily admin reports, and a live Kanban dashboard. Six
Ticketing Backend automates registration, QR-ticket generation, email delivery, and check-in validation using Google Sheets, Gmail, and a webhook scanner — reducing manual ticket prep from ~3 hours to
> n8n + Gmail + Google Sheets + Typeform