AutomationFlowsWeb Scraping › Hubspot Contact Email Validation with Hunter.io

Hubspot Contact Email Validation with Hunter.io

ByAkhil Varma Gadiraju @akhilv7 on n8n.io

This workflow retrieves contacts from HubSpot that have an email address but haven't yet had their email validated by Hunter. It then iterates through each of these contacts, uses Hunter.io to verify their email, updates the contact record in HubSpot with the validation status…

Event trigger★★★★☆ complexity11 nodesHubSpotHunterHTTP RequestEmail Send
Web Scraping Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #4416 — we link there as the canonical source.

This workflow follows the Emailsend → 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "3dbe2e56-9d74-4dfd-849a-9eac65fec4bb",
      "name": "HubSpot",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        240,
        60
      ],
      "parameters": {
        "operation": "search",
        "returnAll": true,
        "authentication": "appToken",
        "filterGroupsUi": {
          "filterGroupsValues": [
            {
              "filtersUi": {
                "filterValues": [
                  {
                    "operator": "HAS_PROPERTY",
                    "propertyName": "email|string"
                  },
                  {
                    "operator": "NOT_HAS_PROPERTY",
                    "propertyName": "hunter_email_validation_status|enumeration"
                  }
                ]
              }
            }
          ]
        },
        "additionalFields": {}
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "567de405-6968-465b-a9f1-87e8bd3b54b5",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        20,
        60
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a8edfdfd-aa93-47a6-8f84-a44846781d35",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        460,
        60
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4399eae5-3e3c-4080-96ef-c13bc388d836",
      "name": "Replace Me",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1340,
        35
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "45794b7b-f92b-43bc-879c-6d5bb16c2c3c",
      "name": "Hunter",
      "type": "n8n-nodes-base.hunter",
      "position": [
        680,
        -140
      ],
      "parameters": {
        "email": "={{ $json.properties.email }}",
        "operation": "emailVerifier"
      },
      "credentials": {
        "hunterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "35c9bd9a-e683-437c-82c7-d70a4a80edb7",
      "name": "Add Hunter Details (Contact)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        900,
        -140
      ],
      "parameters": {
        "url": "=https://api.hubapi.com/crm/v3/objects/contacts/{{ $('Loop Over Items').item.json.id }}",
        "method": "PATCH",
        "options": {},
        "jsonBody": "={\n  \"properties\": {\n    \"hunter_email_validation_status\": \"{{ $json.status }}\",\n    \"hunter_verification_date\": \"{{ $now.format('yyyy-MM-dd') }}\"\n  }\n} ",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "hubspotAppToken"
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "851a4869-0d1a-4b3c-8bb5-a8c1b2c34425",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        1120,
        -140
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "462a0b4a-aa6f-423b-9a5d-56d1d71d917f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        820,
        -300
      ],
      "parameters": {
        "width": 260,
        "height": 140,
        "content": "## \u26a0\ufe0f Customize Fields\nRename the field names to match your preference"
      },
      "typeVersion": 1
    },
    {
      "id": "659dfe01-b6aa-437e-bf72-367e5d34fe6a",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1100,
        -300
      ],
      "parameters": {
        "color": 4,
        "height": 140,
        "content": "## \ud83d\udd5b Wait \nThis node is responsible for halting the workflow for one second to avoid rate limit limitatins."
      },
      "typeVersion": 1
    },
    {
      "id": "bbaf2991-4c66-4f4d-bde8-26b24d2074db",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -80
      ],
      "parameters": {
        "width": 280,
        "height": 120,
        "content": "## \u26a0\ufe0f Customize Fields\nyou can use any field name that suits your preference, make sure you add those properties in hubspot first."
      },
      "typeVersion": 1
    },
    {
      "id": "f1f1581c-b502-4181-a9e2-8d4a57d98b0e",
      "name": "Send Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        680,
        60
      ],
      "parameters": {
        "html": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n  <title>Verification Complete</title>\n  <style>\n    body {\n      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n      background-color: #f9f9fb;\n      margin: 0;\n      padding: 0;\n      color: #333;\n    }\n    .container {\n      max-width: 600px;\n      margin: 40px auto;\n      background-color: #fff;\n      border-radius: 8px;\n      box-shadow: 0 2px 8px rgba(0,0,0,0.05);\n      overflow: hidden;\n    }\n    .header {\n      background-color: #3f84e5;\n      color: #fff;\n      padding: 20px;\n      text-align: center;\n    }\n    .content {\n      padding: 30px;\n    }\n    .footer {\n      text-align: center;\n      font-size: 12px;\n      color: #aaa;\n      padding: 20px;\n    }\n    .btn {\n      display: inline-block;\n      background-color: #3f84e5;\n      color: white;\n      padding: 12px 20px;\n      text-decoration: none;\n      border-radius: 5px;\n      margin-top: 20px;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>\u2705 Email Verification Complete</h1>\n    </div>\n    <div class=\"content\">\n      <p>Hello,</p>\n      <p>We\u2019ve finished verifying all the email addresses pulled from your HubSpot contact list.</p>\n\n      <p>All verified contacts are now ready for further processing or campaign activities.</p>\n    </div>\n    <div class=\"footer\">\n      &copy; {{ new Date().getFullYear() }} Your Company. All rights reserved.\n    </div>\n  </div>\n</body>\n</html>\n",
        "options": {
          "appendAttribution": false
        },
        "subject": "Email Verification Completed for Your HubSpot Contacts",
        "toEmail": "user@example.com",
        "fromEmail": "user@example.com"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    }
  ],
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hunter": {
      "main": [
        [
          {
            "node": "Add Hunter Details (Contact)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HubSpot": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Replace Me": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Hunter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Hunter Details (Contact)": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "HubSpot",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow retrieves contacts from HubSpot that have an email address but haven't yet had their email validated by Hunter. It then iterates through each of these contacts, uses Hunter.io to verify their email, updates the contact record in HubSpot with the validation status…

Source: https://n8n.io/workflows/4416/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

The Sora 2 API allows seamless generation of CGI ads, turning text prompts into stunning videos. This workflow automates the entire process from video generation to upload, notification, and file shar

Form Trigger, HTTP Request, Email Send +1
Web Scraping

This template syncs prospects from ProspectPro into HubSpot. It checks if a company already exists in HubSpot (by ProspectPro ID or domain), then updates the record or creates a new one. Sync results

Execute Workflow Trigger, @Bedrijfsdatanl/N8N Nodes Prospectpro, HTTP Request +1
Web Scraping

Storyboard I2V Pipeline (17 shots) with Retry/Wait/State/Notify. Uses httpTrigger, httpRequest, emailSend. Event-driven trigger; 28 nodes.

Http Trigger, HTTP Request, Email Send
Web Scraping

Create CGI ads effortlessly by integrating the Google Veo3 API for video generation and uploading to Google Drive with seamless email notifications. On form submission: Triggers the workflow when a fo

Form Trigger, HTTP Request, Email Send +1
Web Scraping

This workflow automates the process of generating videos using the Veo 3 Fast API, uploading the video to Google Drive, and notifying the user via email. All tasks are executed seamlessly, ensuring a

Form Trigger, HTTP Request, Email Send +1