This workflow corresponds to n8n.io template #16494 — we link there as the canonical source.
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 →
{
"id": "DVnhWJq7PXSjrB5K",
"name": "Find Domain Emails \u2192 AI-Personalized Cold Emails via Gmail",
"tags": [],
"nodes": [
{
"id": "9ab41525-cb47-4118-856f-3db63d62da0f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1280,
-176
],
"parameters": {
"width": 480,
"height": 784,
"content": "## Find Domain Emails \u2192 AI-Personalized Cold Emails via Gmail\n\n### How it works\n\nThis workflow runs on a schedule, reads pending domains from Google Sheets, and processes them one at a time. For each domain, it uses Tomba to find email addresses, filters the results for higher-quality contacts, saves those contacts to an enrichment sheet, and then marks the domain as completed before continuing the loop.\n\n### Setup steps\n\n- Configure the Schedule Trigger with the desired run frequency.\n- Connect Google Sheets credentials and select the sheet/range that contains pending domains.\n- Configure the Tomba credentials and domain lookup settings for finding emails.\n- Set the filtering criteria in the code node, such as confidence score, email type, or required fields.\n- Configure the enrichment Google Sheet destination and the status update fields used to mark each domain as done.\n\n### Customization\n\nAdjust the code filter to change what qualifies as a high-quality email, and update the Google Sheets mappings to match your domain, contact, enrichment, and status columns."
},
"typeVersion": 1
},
{
"id": "9ed9f7b8-ff05-4097-aca3-6a2a7f91d3f3",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-720,
-48
],
"parameters": {
"color": 7,
"width": 640,
"height": 304,
"content": "## Load pending domains\n\nStarts the workflow on a schedule, reads pending domains from Google Sheets, and prepares them for one-by-one processing in a loop."
},
"typeVersion": 1
},
{
"id": "bfbb544a-db85-4541-a78b-344a8ccb5d07",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-176
],
"parameters": {
"color": 7,
"width": 416,
"height": 336,
"content": "## Find and filter emails\n\nLooks up all available email addresses for the current domain using Tomba, then applies custom filtering logic to keep only high-quality contacts."
},
"typeVersion": 1
},
{
"id": "5238ffde-2dd2-467b-8d9d-4d8578548d44",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-176
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Save and mark done\n\nWrites the filtered contacts to the enrichment sheet, then updates the source sheet to mark the processed domain as complete before returning to the loop."
},
"typeVersion": 1
},
{
"id": "aeef9f75-babd-4428-99f6-e53d2be70e71",
"name": "When Scheduled",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-672,
80
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.3
},
{
"id": "8cd7378f-0355-4d55-93a8-5a329353e3ac",
"name": "Read Domains from Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-448,
80
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "Pending",
"lookupColumn": "status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit#gid=0",
"cachedResultName": "Company domains"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit?usp=drivesdk",
"cachedResultName": " Find Domain Emails \u2192 AI-Personalized Cold Emails via Gmail"
}
},
"typeVersion": 4.7
},
{
"id": "1a481b6e-1ca1-4a9f-bdd1-73bdc8cb4d14",
"name": "Loop Over Domain Batches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-224,
80
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "18805bed-8a5c-41a3-9dde-c6ba4d2441ef",
"name": "Fetch Emails by Domain",
"type": "n8n-nodes-tomba.tomba",
"position": [
0,
0
],
"parameters": {
"limit": "50",
"domain": "={{ $json['Company domain'] }}",
"company": "={{ $json['Company name'] }}",
"filters": {},
"returnAll": true,
"onlyEmails": false
},
"credentials": {},
"typeVersion": 1
},
{
"id": "70bcb33b-737a-45c7-9f16-cfc02e212189",
"name": "Identify High Quality Emails",
"type": "n8n-nodes-base.code",
"position": [
224,
0
],
"parameters": {
"jsCode": "const emails = $json.emails || [];\n\nconst filtered = emails.filter(email =>\n email.type === \"personal\" &&\n email.score >= 90\n);\n\nreturn filtered.map(email => ({\n json: {\n company: $json.organization.organization,\n domain: $json.organization.website_url,\n email: email.email,\n first_name: email.first_name,\n last_name: email.last_name,\n full_name: email.full_name,\n position: email.position || \"Professional\"\n }\n}));"
},
"typeVersion": 2
},
{
"id": "75f4e03a-dc35-4ff7-88d2-f3be47fd5d17",
"name": "Append Contacts to Enrichment",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
0
],
"parameters": {
"columns": {
"value": {
"email": "={{ $json.email }}",
"domain": "={{ $json.domain }}",
"company": "={{ $json.company }}",
"position": "={{ $json.position }}",
"full_name": "={{ $json.full_name }}"
},
"schema": [
{
"id": "company",
"type": "string",
"display": true,
"required": false,
"displayName": "company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "domain",
"type": "string",
"display": true,
"required": false,
"displayName": "domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "full_name",
"type": "string",
"display": true,
"required": false,
"displayName": "full_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "position",
"type": "string",
"display": true,
"required": false,
"displayName": "position",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1065649334,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit#gid=1065649334",
"cachedResultName": "Enrichment"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit?usp=drivesdk",
"cachedResultName": " Find Domain Emails \u2192 AI-Personalized Cold Emails via Gmail"
}
},
"typeVersion": 4.7
},
{
"id": "f6d823c3-96f5-4955-97ff-055180fb3493",
"name": "Update Domain Status in Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
672,
80
],
"parameters": {
"columns": {
"value": {
"status": "Done",
"row_number": "={{ $('Loop Over Domain Batches').item.json.row_number }}"
},
"schema": [
{
"id": "Company domain",
"type": "string",
"display": true,
"required": false,
"displayName": "Company domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company name",
"type": "string",
"display": true,
"required": false,
"displayName": "Company name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit#gid=0",
"cachedResultName": "Company domains"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1WiMydtakyZ-csIz2mh0_fgMqOALPMFr2wlyoczU0_Jk/edit?usp=drivesdk",
"cachedResultName": " Find Domain Emails \u2192 AI-Personalized Cold Emails via Gmail"
}
},
"typeVersion": 4.7
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "4b878f02-8abe-4528-8b6c-18cd85344bb6",
"nodeGroups": [],
"connections": {
"When Scheduled": {
"main": [
[
{
"node": "Read Domains from Sheets",
"type": "main",
"index": 0
}
]
]
},
"Fetch Emails by Domain": {
"main": [
[
{
"node": "Identify High Quality Emails",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Domain Batches": {
"main": [
[],
[
{
"node": "Fetch Emails by Domain",
"type": "main",
"index": 0
}
]
]
},
"Read Domains from Sheets": {
"main": [
[
{
"node": "Loop Over Domain Batches",
"type": "main",
"index": 0
}
]
]
},
"Identify High Quality Emails": {
"main": [
[
{
"node": "Append Contacts to Enrichment",
"type": "main",
"index": 0
}
]
]
},
"Append Contacts to Enrichment": {
"main": [
[
{
"node": "Update Domain Status in Sheets",
"type": "main",
"index": 0
}
]
]
},
"Update Domain Status in Sheets": {
"main": [
[
{
"node": "Loop Over Domain Batches",
"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 workflow runs on a schedule, pulls “Pending” company domains from Google Sheets, uses Tomba to find email addresses for each domain, filters for high-scoring personal contacts, logs the results to an enrichment sheet, and marks each processed domain as Done. Runs on a…
Source: https://n8n.io/workflows/16494/ — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
special-day-email-sender. Uses googleSheets, gmail. Scheduled trigger; 43 nodes.
Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google
This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.
This n8n template demonstrates how to build a Auto Lead Gen & Outreach System for Local Businesses specifically designed to help businesses that don’t have a website yet.