This workflow corresponds to n8n.io template #13347 — 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": "Chat & Demo Request Enrichment with Lusha",
"nodes": [
{
"id": "508ce848-f505-4914-8631-51d0214ee142",
"name": "\ud83d\udccb Chatbot & Demo Request Enrichment",
"type": "n8n-nodes-base.stickyNote",
"position": [
-100,
-580
],
"parameters": {
"width": 900,
"height": 560,
"content": "## Enrich Chatbot and Demo Request Leads with Lusha\n\n**Who it's for:** SDRs handling inbound chatbot & demo request leads\n\n**What it does:** Enriches leads from chatbots or demo request flows with Lusha, scores them by ICP fit, creates/updates the HubSpot contact, and sends priority-based Slack alerts. High-priority demo requests get an urgent SDR alert.\n\n### How it works\n1. Webhook receives a chatbot message or demo request with an email\n2. Email is validated and the contact is enriched with Lusha\n3. A lead priority score is calculated based on seniority and company size\n4. HubSpot contact is created/updated with enriched data\n5. High-priority leads get an urgent Slack alert; others get a standard notification\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 chatbot or demo form webhook to the n8n endpoint\n4. Customize the priority scoring logic and Slack channels"
},
"typeVersion": 1
},
{
"id": "fbeac099-47da-4fae-bbec-382c9cc74544",
"name": "\u26a1 1. Receive & Validate",
"type": "n8n-nodes-base.stickyNote",
"position": [
-30,
50
],
"parameters": {
"color": 7,
"width": 420,
"height": 270,
"content": "Webhook receives the chatbot/demo form POST. A code node validates the email and extracts form fields.\n\n**Nodes:** Webhook \u2192 Validate & Clean Input\n\n\ud83d\udca1 Customize the expected payload fields to match your chatbot."
},
"typeVersion": 1
},
{
"id": "0d80e304-4b5e-4c8d-982c-de6246bf0a71",
"name": "\ud83d\udd0d 2. Enrich & Score",
"type": "n8n-nodes-base.stickyNote",
"position": [
450,
50
],
"parameters": {
"color": 7,
"width": 560,
"height": 270,
"content": "Lusha enriches the contact by email. A code node builds a lead summary and calculates a priority score based on seniority, company size, and request type.\n\n**Nodes:** Lusha Enrich \u2192 Build Summary & Score \u2192 Is High Priority? (IF)\n\n\ud83d\udcd6 [Lusha API docs](https://www.lusha.com/docs/)"
},
"typeVersion": 1
},
{
"id": "9ab621a9-79c7-49fb-b48c-e0475a2b0ca5",
"name": "\ud83d\udcbe 3. CRM + Priority Routing",
"type": "n8n-nodes-base.stickyNote",
"position": [
1060,
50
],
"parameters": {
"color": 7,
"width": 700,
"height": 270,
"content": "HubSpot contact is created/updated with all enriched fields. High-priority leads trigger an urgent Slack alert; standard leads get a normal notification.\n\n**Nodes:** Upsert HubSpot \u2192 Priority Routing \u2192 Urgent Alert / Standard Alert\n\n\ud83d\udca1 Customize the Slack channels and priority thresholds."
},
"typeVersion": 1
},
{
"id": "06e7ba98-ae4a-4cf4-a268-1bc025e7971b",
"name": "Chatbot/Demo Request Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
0,
400
],
"parameters": {
"path": "chat-demo-enrichment",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "b13a5021-f4b0-445a-8466-07cc36c33152",
"name": "Validate & Clean Input",
"type": "n8n-nodes-base.code",
"position": [
280,
400
],
"parameters": {
"jsCode": "// Validate and clean chatbot/demo request input\nconst body = $json.body || $json;\nconst email = (body.email || '').trim().toLowerCase();\nif (!email || !email.includes('@')) {\n throw new Error('Invalid or missing email in demo request');\n}\nreturn { json: {\n email,\n firstName: (body.firstName || '').trim(),\n lastName: (body.lastName || '').trim(),\n company: (body.company || '').trim(),\n requestType: body.requestType || 'demo',\n message: body.message || '',\n source: body.source || 'chatbot',\n receivedAt: new Date().toISOString()\n} };"
},
"typeVersion": 2
},
{
"id": "add17b65-e184-47d9-9945-022ea08dfb49",
"name": "Enrich with Lusha",
"type": "@lusha-org/n8n-nodes-lusha.lusha",
"position": [
560,
400
],
"parameters": {
"email": "={{ $json.email }}",
"searchBy": "email",
"operation": "enrichSingle",
"contactEnrichAdditionalOptions": {}
},
"credentials": {
"lushaApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5a0d1abf-52f1-405e-98ad-d1163aea53b2",
"name": "Build Summary & Score",
"type": "n8n-nodes-base.code",
"position": [
840,
400
],
"parameters": {
"jsCode": "// Build enriched lead summary with priority score\nconst form = $('Validate & Clean Input').first().json;\nconst lusha = $json;\n\n// Priority scoring\nlet priority = 0;\nconst seniority = (lusha.seniority || '').toLowerCase();\nif (['c-suite', 'founder', 'owner', 'cxo'].some(s => seniority.includes(s))) priority += 40;\nelse if (['vp', 'vice president', 'director'].some(s => seniority.includes(s))) priority += 30;\nelse if (seniority.includes('manager')) priority += 15;\n\nconst empMax = Array.isArray(lusha.companySize) ? lusha.companySize[1] : 0;\nif (empMax >= 500) priority += 25;\nelse if (empMax >= 100) priority += 15;\nelse if (empMax >= 20) priority += 5;\n\nif (form.requestType === 'demo') priority += 15;\nif (lusha.primaryPhone) priority += 10;\n\nconst isHighPriority = priority >= 50;\n\nreturn { json: {\n email: form.email,\n firstName: form.firstName || lusha.firstName || '',\n lastName: form.lastName || lusha.lastName || '',\n phone: lusha.primaryPhone || '',\n verifiedEmail: lusha.primaryEmail || '',\n jobTitle: lusha.jobTitle || '',\n seniority: lusha.seniority || '',\n linkedinUrl: lusha.linkedinProfile || '',\n company: form.company || lusha.companyName || '',\n companyDomain: lusha.companyDomain || '',\n industry: lusha.companyMainIndustry || '',\n companySize: empMax,\n revenueRange: lusha.revenueRange || '',\n requestType: form.requestType,\n message: form.message,\n source: form.source,\n priorityScore: priority,\n isHighPriority,\n enrichedAt: new Date().toISOString()\n} };"
},
"typeVersion": 2
},
{
"id": "7168c764-0918-409c-8b7e-ebbad3f41da4",
"name": "Create/Update HubSpot Contact",
"type": "n8n-nodes-base.hubspot",
"position": [
1120,
400
],
"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": "74c57ddb-e9e4-4af5-8324-58784383251d",
"name": "Is High Priority?",
"type": "n8n-nodes-base.if",
"position": [
1400,
400
],
"parameters": {
"conditions": {
"combinator": "and",
"conditions": [
{
"id": "9770171f-1afb-4e14-a007-b7e11694baa9",
"operator": {
"type": "boolean",
"operation": "true"
},
"leftValue": "={{ $('Build Summary & Score').item.json.isHighPriority }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "4240b5cc-afae-4160-bcb5-eb8ac316eb39",
"name": "Urgent SDR Alert",
"type": "n8n-nodes-base.slack",
"position": [
1700,
280
],
"parameters": {
"text": "=\ud83d\udd25 *URGENT Demo Request (Score: {{ $('Build Summary & Score').item.json.priorityScore }})*\n\n*{{ $('Build Summary & Score').item.json.firstName }} {{ $('Build Summary & Score').item.json.lastName }}*\n{{ $('Build Summary & Score').item.json.jobTitle }} ({{ $('Build Summary & Score').item.json.seniority }})\n\ud83c\udfe2 {{ $('Build Summary & Score').item.json.company }} ({{ $('Build Summary & Score').item.json.companySize }} employees)\n\ud83d\udce7 {{ $('Build Summary & Score').item.json.verifiedEmail || $('Build Summary & Score').item.json.email }}\n\ud83d\udcf1 {{ $('Build Summary & Score').item.json.phone || 'N/A' }}\n\n\ud83d\udcac {{ $('Build Summary & Score').item.json.message || 'No message' }}\n_Source: {{ $('Build Summary & Score').item.json.source }}_",
"channel": "#urgent-leads",
"otherOptions": {}
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "ab309a15-5f4d-40b1-b9eb-7bdc2e1222b0",
"name": "Standard SDR Notification",
"type": "n8n-nodes-base.slack",
"position": [
1700,
520
],
"parameters": {
"text": "=\ud83d\udce5 *New {{ $('Build Summary & Score').item.json.requestType }} Request*\n\n*{{ $('Build Summary & Score').item.json.firstName }} {{ $('Build Summary & Score').item.json.lastName }}*\n{{ $('Build Summary & Score').item.json.jobTitle }} at {{ $('Build Summary & Score').item.json.company }}\n\ud83d\udce7 {{ $('Build Summary & Score').item.json.verifiedEmail || $('Build Summary & Score').item.json.email }}\n\ud83d\udcf1 {{ $('Build Summary & Score').item.json.phone || 'N/A' }}\nScore: {{ $('Build Summary & Score').item.json.priorityScore }}",
"channel": "#inbound-leads",
"otherOptions": {}
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
}
],
"connections": {
"Enrich with Lusha": {
"main": [
[
{
"node": "Build Summary & Score",
"type": "main",
"index": 0
}
]
]
},
"Is High Priority?": {
"main": [
[
{
"node": "Urgent SDR Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Standard SDR Notification",
"type": "main",
"index": 0
}
]
]
},
"Build Summary & Score": {
"main": [
[
{
"node": "Create/Update HubSpot Contact",
"type": "main",
"index": 0
}
]
]
},
"Validate & Clean Input": {
"main": [
[
{
"node": "Enrich with Lusha",
"type": "main",
"index": 0
}
]
]
},
"Chatbot/Demo Request Webhook": {
"main": [
[
{
"node": "Validate & Clean Input",
"type": "main",
"index": 0
}
]
]
},
"Create/Update HubSpot Contact": {
"main": [
[
{
"node": "Is High Priority?",
"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 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, company size, and request type The lead is upserted into HubSpot; high-priority…
Source: https://n8n.io/workflows/13347/ — 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 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
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