This workflow corresponds to n8n.io template #6992 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request 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": "CbuL77uh6tA3fVsy",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "06 - Lead Email Validation Workflow",
"tags": [],
"nodes": [
{
"id": "5722ab46-2a4a-4f51-97ca-e5dc97a58fa1",
"name": "\ud83d\udce5 Fetch Emails from Source Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-40,
-20
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{YOUR_INPUT_SHEET_ID}}/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "{{YOUR_INPUT_SHEET_ID}}",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{YOUR_INPUT_SHEET_ID}}/edit?usp=drivesdk",
"cachedResultName": "Emails"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "84ba1906-ec77-4890-8499-81521c215ddf",
"name": "\ud83e\uddf9 Clean & Prepare Email Data",
"type": "n8n-nodes-base.code",
"position": [
180,
-20
],
"parameters": {
"jsCode": "// Process email data and prepare for verification\nconst items = [];\n\nfor (const item of $input.all()) {\n const email = item.json.Email || item.json.email;\n\n if (email && email.includes('@')) {\n items.push({\n json: {\n email: email,\n originalRowIndex: item.json.row_number || items.length + 2,\n firstName: item.json.FirstName || '',\n lastName: item.json.LastName || '',\n company: item.json.Company || ''\n }\n });\n }\n}\n\nreturn items;"
},
"typeVersion": 2
},
{
"id": "330e8cf0-dfc3-49d7-bcad-8343fa329740",
"name": "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Hunter.io Email Verifier",
"type": "n8n-nodes-base.httpRequest",
"position": [
400,
-20
],
"parameters": {
"url": "https://api.hunter.io/v2/email-verifier",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "email",
"value": "={{ $json.email }}"
},
{
"name": "api_key",
"value": "{{HUNTER_API_KEY}}"
}
]
}
},
"typeVersion": 4
},
{
"id": "0b103e51-5df5-4825-8e4d-28498fa127b2",
"name": "\ud83e\udde0 Format Hunter Response",
"type": "n8n-nodes-base.code",
"position": [
620,
-20
],
"parameters": {
"jsCode": "// Process Hunter.io verification results\nconst originalData = $('\ud83e\uddf9 Clean & Prepare Email Data').all();\nconst hunterResults = $('\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Hunter.io Email Verifier').all();\n\nconst results = [];\n\nfor (let i = 0; i < originalData.length; i++) {\n const original = originalData[i].json;\n const hunter = hunterResults[i]?.json?.data || {};\n\n const result = {\n email: original.email,\n firstName: original.firstName,\n lastName: original.lastName,\n company: original.company,\n rowIndex: original.originalRowIndex,\n\n // Key Hunter.io verification fields\n status: hunter.status || 'unknown',\n score: hunter.score || 0,\n smtpCheck: hunter.smtp_check || false,\n acceptAll: hunter.accept_all || false,\n sourceCount: Array.isArray(hunter.sources) ? hunter.sources.length : 0,\n\n // Optional extras if needed later\n regex: hunter.regex || false,\n gibberish: hunter.gibberish || false,\n disposable: hunter.disposable || false,\n webmail: hunter.webmail || false,\n mxRecords: hunter.mx_records || false,\n smtpServer: hunter.smtp_server || false,\n block: hunter.block || false,\n\n // Human-friendly summary\n statusSummary: `${hunter.status || 'unknown'} (${hunter.score || 0}% confidence)`\n };\n\n results.push({ json: result });\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "b999f5c9-9001-435d-bf33-05861d891b54",
"name": "\ud83d\udce4 Write Results to Output Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
840,
-20
],
"parameters": {
"columns": {
"value": {
"email": "={{ $json.email }}",
"score": "={{ $json.score }}",
"status": "={{ $json.status }}",
"company": "={{ $json.company }}",
"lastName": "={{ $json.lastName }}",
"firstName": "={{ $json.firstName }}",
"smtp_check": "={{ $json.smtpCheck }}",
"statusSummary": "={{ $json.statusSummary }}"
},
"schema": [
{
"id": "firstName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "firstName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "lastName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "lastName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "smtp_check",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "smtp_check",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "statusSummary",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "statusSummary",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{YOUR_OUTPUT_SHEET_ID}}/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "{{YOUR_OUTPUT_SHEET_ID}}",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/{{YOUR_OUTPUT_SHEET_ID}}edit?usp=drivesdk",
"cachedResultName": "Email Verifier"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "d6d80276-4911-455a-b0c5-4196aec824e5",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
-320
],
"parameters": {
"width": 420,
"height": 560,
"content": "## Start & Input Source\n\n**Workflow begins manually using the trigger.\n\nEmails are read from the source Google Sheet (Sheet1).\n\nInput data is expected to include columns like Email, FirstName, LastName, and Company.**"
},
"typeVersion": 1
},
{
"id": "3472c014-1657-4f35-92fd-b6b6775cbb6b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
-320
],
"parameters": {
"width": 420,
"height": 560,
"content": "## Clean & Verify Emails\n\n**Filters out invalid or malformed emails.\n\nExtracts fields for each contact.\n\nSends each email to Hunter.io for verification using /v2/email-verifier.\n\nReturns rich metadata: status, score, smtp_check, disposable, etc.**"
},
"typeVersion": 1
},
{
"id": "51f38886-34e7-418e-b655-4a2b0a3b8eb7",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
580,
-320
],
"parameters": {
"width": 400,
"height": 560,
"content": "## Post-Processing & Output\n\n**Parses Hunter.io API results and maps them to a clean format.\n\nAdds a readable statusSummary (like: valid (96% confidence)).\n\nAppends or updates the output Google Sheet (Email Verifier \u2192 Sheet1) using email as the match key.**\n\n"
},
"typeVersion": 1
},
{
"id": "9ce17c7f-221c-4268-8438-f95c99c39e09",
"name": "\u23ef\ufe0f Triggers Everyday",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-260,
-20
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "16b71444-6e2f-4b01-8714-b5669a5c6d56",
"connections": {
"\u23ef\ufe0f Triggers Everyday": {
"main": [
[
{
"node": "\ud83d\udce5 Fetch Emails from Source Sheet",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\udde0 Format Hunter Response": {
"main": [
[
{
"node": "\ud83d\udce4 Write Results to Output Sheet",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\uddf9 Clean & Prepare Email Data": {
"main": [
[
{
"node": "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Hunter.io Email Verifier",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udce5 Fetch Emails from Source Sheet": {
"main": [
[
{
"node": "\ud83e\uddf9 Clean & Prepare Email Data",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Hunter.io Email Verifier": {
"main": [
[
{
"node": "\ud83e\udde0 Format Hunter Response",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This project automatically verifies lead email addresses stored in Google Sheets using Hunter.io. It checks each email’s validity and writes back the results—including confidence scores, verification status, and metadata—so your outreach lists are always clean and reliable.
Source: https://n8n.io/workflows/6992/ — 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.
This workflow transforms your Meta Ads creatives into a rich dataset of actionable insights. It's designed for data-driven marketers, performance agencies, and analysts who want to move beyond basic m
I created this workflow with great care to help you simplify your daily reporting routine. If you manage Meta Ads campaigns, you know how time-consuming it can be to open Ads Manager, filter data, and
I built this workflow to remove the daily pain of Meta Ads reporting. If you manage multiple ad accounts, you know how time-consuming it is to open Ads Manager, export campaign data, clean spreadsheet
This workflow monitors Meta Ads and Google Ads campaigns on a daily schedule to detect performance drops. It fetches yesterday’s campaign data, standardizes metrics, and calculates CTR and ROAS agains
Pulls targeted leads from Apollo using predefined ICP filters Enriches each lead with Apollo people enrichment Filters verified contacts and formats lead data Creates or updates contacts inside MeldFl