This workflow corresponds to n8n.io template #16637 — we link there as the canonical source.
This workflow follows the Google Sheets → Googlesheetstrigger 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 →
{
"id": "wZE9MfalhRk9sKDW",
"name": "Tomba - CRM Contact Enrichment",
"tags": [],
"nodes": [
{
"id": "26b9eb2f-3940-4c6b-846d-6098861e9cac",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1056,
-176
],
"parameters": {
"width": 480,
"height": 752,
"content": "## Tomba - CRM Contact Enrichment\n\n### How it works\n\nThis workflow enriches CRM contacts added to a Google Sheet using Tomba. When a new row is detected, it processes contacts one at a time, finds email, company, and phone details, formats the enriched record, and writes it back to the sheet before continuing the loop.\n\n### Setup steps\n\n- Connect Google Sheets credentials for both the trigger and update nodes.\n- Configure the source spreadsheet and sheet/range that contains newly added CRM contacts.\n- Connect Tomba API credentials and verify the email, company enrichment, and phone lookup nodes use the correct input fields from the sheet.\n- Confirm the final Google Sheets node writes to the intended columns for enriched contact data.\n\n### Customization\n\nAdjust the batch size in the loop node, change which Tomba enrichment steps are used, or modify the code node to map and format additional CRM fields."
},
"typeVersion": 1
},
{
"id": "2132c33f-dfce-4c6b-8b1e-fb76ab86069d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-80
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Detect new contacts\n\nStarts the workflow when a new contact row is added in Google Sheets and feeds each contact into the batch loop for processing."
},
"typeVersion": 1
},
{
"id": "aa511dbf-9168-4234-aa40-52a1700bb674",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-128
],
"parameters": {
"color": 7,
"width": 640,
"height": 304,
"content": "## Enrich contact details\n\nUses Tomba in a central processing chain to find the contact email, enrich company information, and look up a phone number."
},
"typeVersion": 1
},
{
"id": "4529a077-e994-442c-96b2-1914668f6f09",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
624,
-176
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Format and update sheet\n\nFormats the enriched contact data with custom code, writes the results back to Google Sheets, and loops back to process the next contact batch."
},
"typeVersion": 1
},
{
"id": "a6511efe-affa-4d92-ba5b-8710618207a7",
"name": "When Contact Added to Sheets",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-448,
80
],
"parameters": {
"event": "rowAdded",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY/edit#gid=0",
"cachedResultName": "contacts"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY/edit?usp=drivesdk",
"cachedResultName": "Tomba - CRM Contact Enrichment"
}
},
"typeVersion": 1
},
{
"id": "43a3cb48-9532-4efc-8f65-dc2e847639cb",
"name": "Loop Over Contacts Batch",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-224,
80
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "5fa8e366-6d03-4f9b-99f7-64802043edc6",
"name": "Retrieve Email via Tomba",
"type": "n8n-nodes-tomba.tomba",
"position": [
0,
0
],
"parameters": {
"domain": "={{ $json.Domain }}",
"company": "={{ $json.Company }}",
"lastname": "={{ $json['Last Name'] }}",
"resource": "email",
"firstname": "={{ $json['First Name'] }}",
"enrichMobile": true
},
"credentials": {},
"typeVersion": 1
},
{
"id": "18fccc45-0bb7-4f18-9ef8-c512325330dd",
"name": "Enrich Data via Tomba",
"type": "n8n-nodes-tomba.tomba",
"position": [
224,
0
],
"parameters": {
"resource": "company",
"companyFilters": {
"company": {
"val": {
"include": "={{ $json.company }}"
}
}
}
},
"credentials": {},
"typeVersion": 1
},
{
"id": "2328c326-cda2-4365-9bfd-a6838bb48614",
"name": "Compile Enriched Contact",
"type": "n8n-nodes-base.code",
"position": [
672,
0
],
"parameters": {
"jsCode": "const emailData = $node[\"Find Email Address\"].json;\nconst companyData = $node[\"Enrich Company Data\"].json;\nconst phoneData = $node[\"Find Phone Number\"].json;\n\n// Get first company match\nconst company = companyData.data?.companies?.[0] || {};\n\n// Get phone number\nconst phone = phoneData.intl_format || \"Not Found\";\n\nreturn [{\n json: {\n // Contact info\n email: emailData.email || \"Not Found\",\n phone: phone,\n first_name: emailData.first_name || \"\",\n last_name: emailData.last_name || \"\",\n full_name: emailData.full_name || \"\",\n score: emailData.score || 0,\n verification_status: emailData.verification?.status || \"unknown\",\n\n // Company info\n company_name: company.name || \"\",\n industry: company.industry || \"Not Found\",\n company_size: company.company_size || \"Not Found\",\n revenue: company.revenue || \"Not Found\",\n country: company.country || emailData.country || \"Not Found\",\n city: company.city || \"\",\n founded: company.founded || \"\",\n\n // Status\n status: emailData.email ? \"Enriched\" : \"Not Found\"\n }\n}];"
},
"typeVersion": 2
},
{
"id": "66558ead-3674-4d66-a97b-707ff5e3d28a",
"name": "Update Enriched Contact in Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
896,
80
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $json.email }}",
"Phone": "={{ $json.phone }}",
"Domain": "={{ $('Loop Over Contacts Batch').item.json.Domain }}",
"Status": "={{ $json.status }}",
"Country": "={{ $json.country }}",
"Revenue": "={{ $json.revenue }}",
"Industry": "={{ $json.industry }}",
"Company Size": "={{ $json.company_size }}"
},
"schema": [
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Domain",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Domain",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Industry",
"type": "string",
"display": true,
"required": false,
"displayName": "Industry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company Size",
"type": "string",
"display": true,
"required": false,
"displayName": "Company Size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Revenue",
"type": "string",
"display": true,
"required": false,
"displayName": "Revenue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Country",
"type": "string",
"display": true,
"required": false,
"displayName": "Country",
"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": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Domain"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY/edit#gid=0",
"cachedResultName": "contacts"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1jbFOvcle029-eb8klxSoi8fuSIEINqX3qnA1Q0gK3eY/edit?usp=drivesdk",
"cachedResultName": "Tomba - CRM Contact Enrichment"
}
},
"typeVersion": 4.7
},
{
"id": "c44d73c7-ebf5-429d-919f-bd73e6b8a2c1",
"name": "Retrieve Phone via Tomba",
"type": "n8n-nodes-tomba.tomba",
"position": [
448,
0
],
"parameters": {
"full": true,
"domain": "={{ $node[\"Loop Over Contacts\"].json[\"Domain\"] }}",
"resource": "phone",
"phoneSearchType": "domain"
},
"credentials": {},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "38640cd0-40ed-4858-8a28-7519cd51e49a",
"nodeGroups": [],
"connections": {
"Enrich Data via Tomba": {
"main": [
[
{
"node": "Retrieve Phone via Tomba",
"type": "main",
"index": 0
}
]
]
},
"Compile Enriched Contact": {
"main": [
[
{
"node": "Update Enriched Contact in Sheets",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Contacts Batch": {
"main": [
[],
[
{
"node": "Retrieve Email via Tomba",
"type": "main",
"index": 0
}
]
]
},
"Retrieve Email via Tomba": {
"main": [
[
{
"node": "Enrich Data via Tomba",
"type": "main",
"index": 0
}
]
]
},
"Retrieve Phone via Tomba": {
"main": [
[
{
"node": "Compile Enriched Contact",
"type": "main",
"index": 0
}
]
]
},
"When Contact Added to Sheets": {
"main": [
[
{
"node": "Loop Over Contacts Batch",
"type": "main",
"index": 0
}
]
]
},
"Update Enriched Contact in Sheets": {
"main": [
[
{
"node": "Loop Over Contacts Batch",
"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 watches a Google Sheets contacts list for new rows and enriches each contact using Tomba to find a likely email address, company firmographics, and a phone number, then writes the enriched fields back to the same spreadsheet. Triggers when a new row is added to a…
Source: https://n8n.io/workflows/16637/ — 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.
Stickynote Workflow. Uses googleTranslate, googleSheetsTrigger, googleDrive, httpRequest. Event-driven trigger; 22 nodes.
Automate IT asset allocation for new hires with an intelligent, AI-powered workflow 🤖. This automation reads employee data from Google Sheets, determines role-based requirements, and intelligently ass
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
This powerful no-code workflow automates plagiarism detection using Plagiarism Checker AI Powered. Users submit text through Google Sheets. The system checks for duplication using the API, sends a det
This n8n workflow automates outbound phone calls to new leads using VAPI, with built-in timezone detection to ensure you're only calling during business hours.