AutomationFlowsEmail & Gmail › Find and Log High-quality Domain Contacts with Tomba and Google Sheets

Find and Log High-quality Domain Contacts with Tomba and Google Sheets

ByZain Khan @zain on n8n.io

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…

Cron / scheduled trigger★★★★☆ complexity11 nodesGoogle SheetsN8N Nodes Tomba
Email & Gmail Trigger: Cron / scheduled Nodes: 11 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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
          }
        ]
      ]
    }
  }
}
Pro

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 →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.

Gmail, Google Drive, Google Sheets +1
Email & Gmail

special-day-email-sender. Uses googleSheets, gmail. Scheduled trigger; 43 nodes.

Google Sheets, Gmail
Email & Gmail

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

Google Sheets, HTTP Request, WhatsApp +1
Email & Gmail

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.

Google Sheets, HTTP Request, Gmail
Email & Gmail

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.

Google Sheets, HTTP Request, Google Drive +1