This workflow corresponds to n8n.io template #13342 — we link there as the canonical source.
This workflow follows the HubSpot → Slack 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 →
{
"name": "Form Enrichment with Lusha",
"nodes": [
{
"id": "4f9de608-f4c4-4205-9713-6cb9ea3d6e4d",
"name": "\ud83d\udccb Form Lead Enrichment + CRM Sync",
"type": "n8n-nodes-base.stickyNote",
"position": [
-100,
-520
],
"parameters": {
"width": 900,
"height": 500,
"content": "## Enrich New Form Leads with Lusha\n\n**Who it's for:** Marketing & Growth teams capturing inbound leads\n\n**What it does:** Enriches web form submissions in real time with Lusha, checks for duplicates in HubSpot, creates or updates the CRM record, sends an SDR alert to Slack, and returns the enriched data to your form.\n\n### How it works\n1. Receives form submission via webhook\n2. Validates the email and checks for duplicates in HubSpot\n3. Enriches the contact with Lusha (phone, title, seniority, company data)\n4. Merges form + Lusha data and creates/updates the HubSpot contact\n5. Sends an SDR notification to Slack with the enriched lead summary\n6. Returns the enriched record to the form as a JSON response\n\n### Setup\n1. Install the [Lusha community node](https://www.npmjs.com/package/@lusha-org/n8n-nodes-lusha)\n2. Add your Lusha API, HubSpot OAuth2, and Slack credentials\n3. Point your web form's action URL to the webhook endpoint\n4. Customize the Slack channel and CRM field mapping"
},
"typeVersion": 1
},
{
"id": "56996914-f394-4427-bbb8-74ce3bb477f4",
"name": "\u26a1 1. Receive & Validate",
"type": "n8n-nodes-base.stickyNote",
"position": [
-30,
50
],
"parameters": {
"color": 7,
"width": 500,
"height": 270,
"content": "Webhook receives a POST with the form submission. A code node validates the email format and checks for duplicates in HubSpot before enrichment.\n\n**Nodes:** Webhook \u2192 Validate Email \u2192 Check HubSpot Duplicate\n\n\ud83d\udca1 Customize the duplicate-check field to match your CRM setup."
},
"typeVersion": 1
},
{
"id": "7b118fc5-e00d-43a9-8808-3550f6070501",
"name": "\ud83d\udd0d 2. Enrich with Lusha",
"type": "n8n-nodes-base.stickyNote",
"position": [
520,
50
],
"parameters": {
"color": 7,
"width": 500,
"height": 270,
"content": "Lusha enriches the contact by email, returning verified phone, job title, seniority, LinkedIn, and full company firmographics.\n\n**Nodes:** Lusha Contact Enrich \u2192 Merge Form + Lusha Data\n\n\ud83d\udcd6 [Lusha API docs](https://www.lusha.com/docs/)"
},
"typeVersion": 1
},
{
"id": "8225080f-13b9-4930-8625-9e3fd18484b1",
"name": "\ud83d\udcbe 3. CRM + Slack + Response",
"type": "n8n-nodes-base.stickyNote",
"position": [
1070,
50
],
"parameters": {
"color": 7,
"width": 700,
"height": 270,
"content": "Creates or updates the HubSpot contact record, sends an SDR alert to Slack with the full enriched lead summary, and returns the enriched data to the form.\n\n**Nodes:** Upsert HubSpot Contact \u2192 Slack SDR Alert \u2192 Webhook Response\n\n\ud83d\udca1 Customize the Slack channel (#inbound-leads) and message format."
},
"typeVersion": 1
},
{
"id": "e5592344-331a-4a18-a0d9-8094309901ed",
"name": "Receive Form Submission",
"type": "n8n-nodes-base.webhook",
"position": [
0,
400
],
"parameters": {
"path": "form-enrichment",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "c965c082-776e-4242-8a8c-b3874a894a80",
"name": "Validate Email",
"type": "n8n-nodes-base.code",
"position": [
280,
400
],
"parameters": {
"jsCode": "// Validate email format from form submission\nconst body = $json.body || $json;\nconst email = (body.email || '').trim().toLowerCase();\n\nif (!email || !email.includes('@') || !email.includes('.')) {\n throw new Error('Invalid or missing email address');\n}\n\n// Pass through cleaned form data\nreturn {\n json: {\n email,\n firstName: (body.firstName || '').trim(),\n lastName: (body.lastName || '').trim(),\n company: (body.company || '').trim(),\n source: body.source || 'web-form',\n message: body.message || '',\n submittedAt: new Date().toISOString()\n }\n};"
},
"typeVersion": 2
},
{
"id": "05a787b5-bf87-4f65-a1b0-5b4c362b1350",
"name": "Check HubSpot Duplicate",
"type": "n8n-nodes-base.hubspot",
"position": [
560,
400
],
"parameters": {
"resource": "contact",
"operation": "search",
"filterGroups": {
"values": [
{
"filters": {
"values": [
{
"value": "={{ $json.email }}",
"operator": "EQ",
"propertyName": "email"
}
]
}
}
]
}
},
"credentials": {
"hubspotOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "ddf4f1cf-bc14-4553-98d2-a02d9e1c8510",
"name": "Enrich with Lusha",
"type": "@lusha-org/n8n-nodes-lusha.lusha",
"position": [
840,
400
],
"parameters": {
"email": "={{ $('Validate Email').first().json.email }}",
"searchBy": "email",
"operation": "enrichSingle",
"contactEnrichAdditionalOptions": {}
},
"credentials": {
"lushaApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "03a3c74a-fc94-4536-8c08-49441d8ea3fe",
"name": "Merge Form + Lusha Data",
"type": "n8n-nodes-base.code",
"position": [
1120,
400
],
"parameters": {
"jsCode": "// Merge original form data with Lusha enrichment\nconst form = $('Validate Email').first().json;\nconst lusha = $json;\nconst hubspotResults = $('Check HubSpot Duplicate').first().json;\nconst isExisting = hubspotResults.total > 0;\nconst existingId = isExisting ? hubspotResults.results?.[0]?.id : null;\n\nreturn {\n json: {\n // Identity\n email: form.email,\n firstName: form.firstName || lusha.firstName || '',\n lastName: form.lastName || lusha.lastName || '',\n\n // Lusha enrichment\n jobTitle: lusha.jobTitle || '',\n seniority: lusha.seniority || '',\n phone: lusha.primaryPhone || '',\n phoneType: lusha.primaryPhoneType || '',\n verifiedEmail: lusha.primaryEmail || '',\n linkedinUrl: lusha.linkedinProfile || '',\n\n // Company data\n company: form.company || lusha.companyName || '',\n companyDomain: lusha.companyDomain || '',\n companySize: lusha.companySize || '',\n industry: lusha.companyMainIndustry || '',\n revenueRange: lusha.revenueRange || '',\n companyLocation: lusha.companyLocation || '',\n\n // Metadata\n isExistingContact: isExisting,\n existingContactId: existingId,\n source: form.source,\n message: form.message,\n enrichedAt: new Date().toISOString(),\n enrichmentSource: 'lusha'\n }\n};"
},
"typeVersion": 2
},
{
"id": "e2ed8337-59be-455f-ae17-4d9c30022ed7",
"name": "Create/Update HubSpot Contact",
"type": "n8n-nodes-base.hubspot",
"position": [
1400,
300
],
"parameters": {
"email": "={{ $json.email }}",
"resource": "contact",
"operation": "upsert",
"additionalFields": {
"phone": "={{ $json.phone }}",
"company": "={{ $json.company }}",
"website": "={{ $json.companyDomain }}",
"industry": "={{ $json.industry }}",
"jobtitle": "={{ $json.jobTitle }}",
"lastName": "={{ $json.lastName }}",
"firstName": "={{ $json.firstName }}"
}
},
"credentials": {
"hubspotOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "618fbf17-0565-4d0f-b19a-a901987e7ca4",
"name": "Alert SDR on Slack",
"type": "n8n-nodes-base.slack",
"position": [
1400,
500
],
"parameters": {
"text": "=\ud83d\udce5 *New Enriched Form Lead*\n\n*{{ $('Merge Form + Lusha Data').item.json.firstName }} {{ $('Merge Form + Lusha Data').item.json.lastName }}*\n{{ $('Merge Form + Lusha Data').item.json.jobTitle }} ({{ $('Merge Form + Lusha Data').item.json.seniority }})\n\ud83c\udfe2 {{ $('Merge Form + Lusha Data').item.json.company }}\n\ud83d\udce7 {{ $('Merge Form + Lusha Data').item.json.verifiedEmail || $('Merge Form + Lusha Data').item.json.email }}\n\ud83d\udcf1 {{ $('Merge Form + Lusha Data').item.json.phone || 'N/A' }}\n\ud83d\udd17 {{ $('Merge Form + Lusha Data').item.json.linkedinUrl || 'N/A' }}\n\n{{ $('Merge Form + Lusha Data').item.json.isExistingContact ? '\u267b\ufe0f Existing contact updated' : '\u2728 New contact created' }}",
"channel": "#inbound-leads",
"otherOptions": {}
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "96c30ef4-4f5e-4cd8-8339-2be03a72f39f",
"name": "Return Enriched Lead",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1700,
400
],
"parameters": {
"options": {
"responseCode": 200
},
"respondWith": "json",
"responseBody": "={{ $('Merge Form + Lusha Data').item.json }}"
},
"typeVersion": 1
}
],
"connections": {
"Validate Email": {
"main": [
[
{
"node": "Check HubSpot Duplicate",
"type": "main",
"index": 0
}
]
]
},
"Enrich with Lusha": {
"main": [
[
{
"node": "Merge Form + Lusha Data",
"type": "main",
"index": 0
}
]
]
},
"Check HubSpot Duplicate": {
"main": [
[
{
"node": "Enrich with Lusha",
"type": "main",
"index": 0
}
]
]
},
"Merge Form + Lusha Data": {
"main": [
[
{
"node": "Create/Update HubSpot Contact",
"type": "main",
"index": 0
},
{
"node": "Alert SDR on Slack",
"type": "main",
"index": 0
},
{
"node": "Return Enriched Lead",
"type": "main",
"index": 0
}
]
]
},
"Receive Form Submission": {
"main": [
[
{
"node": "Validate Email",
"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.
hubspotOAuth2ApilushaApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
A webhook receives form submissions with an email address The email is validated and checked against HubSpot for duplicates Lusha enriches the lead with phone number, job title, seniority, and company data Enriched data is merged with form fields and upserted into HubSpot CRM An…
Source: https://n8n.io/workflows/13342/ — 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.
A webhook receives a new lead with an email address, which is validated Lusha enriches the lead with seniority, company size, industry, and phone data A lead score is calculated based on ICP fit (seni
A webhook receives a form submission with an email address The email is validated, then Lusha enriches the contact If phone or email is missing, a fallback provider fills the gaps via HTTP request Dat
A webhook receives a chatbot message or demo request form with an email address The email is validated and cleaned, then Lusha enriches the lead A priority score is calculated based on seniority, comp
This is ideal for agencies, freelancers, SaaS founders, and small sales teams who want every lead recorded and followed up automatically within seconds. The workflow supports two storage options: HubS
Real-Time Lead Processing - Captures and processes leads instantly from website forms with zero delay Intelligent Fit Scoring - Automatically scores leads 0-100 based on company size, seniority, and r