This workflow corresponds to n8n.io template #8685 β 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 β
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "8f79216b-2b12-4098-b375-c70bce4e2311",
"name": "Typeform Trigger",
"type": "n8n-nodes-base.typeformTrigger",
"position": [
-432,
-272
],
"parameters": {
"formId": "DJUUTAmq"
},
"credentials": {
"typeformApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "17064ca5-077c-49f4-b2f5-1d8dc8688a3f",
"name": "Search HubSpot Contact",
"type": "n8n-nodes-base.hubspot",
"position": [
-208,
-272
],
"parameters": {
"operation": "search",
"authentication": "appToken",
"filterGroupsUi": {
"filterGroupsValues": [
{
"filtersUi": {
"filterValues": [
{
"value": "={{ $json.Email }}",
"propertyName": "email|string"
}
]
}
}
]
},
"additionalFields": {}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "d9bcd04d-1081-4924-9072-7d3bdd66ba7f",
"name": "Slack Notification",
"type": "n8n-nodes-base.slack",
"position": [
688,
-272
],
"parameters": {
"text": "=\ud83d\ude80 *New Lead Alert!* \n\ud83d\udc64 Name: {{ $json.firstname }} {{ $json.lastname }}\n\ud83d\udce7 Email: {{ $json.email }} \n\ud83c\udfe2 Company: {{ $json.company }} \n\ud83d\udcca Score: {{ $json.leadScore }} \u2014 {{ $json.leadTier }}\n\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09FGEUHVR9",
"cachedResultName": "tf_lead"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "2683bba4-24bf-4829-b3ae-880a810f7fa7",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
16,
-272
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f7b2cddc-e3d3-417e-8976-f885f09d0374",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{ $json.properties.email }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "db204ea8-7e8b-428a-81e4-8dcc427fcb10",
"name": "Update a contact",
"type": "n8n-nodes-base.hubspot",
"position": [
240,
-176
],
"parameters": {
"email": "={{ $json.properties.email }}",
"options": {},
"authentication": "appToken",
"additionalFields": {
"lastName": "={{ $('Set Field').item.json['Last name'] }}",
"firstName": "={{ $('Set Field').item.json['First name'] }}",
"companyName": "={{ $('Set Field').item.json.Company }}",
"phoneNumber": "={{ $('Set Field').item.json['Phone number'] }}"
}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "0072205b-5bba-4501-8e4c-640e45eb39d8",
"name": "Create a contact",
"type": "n8n-nodes-base.hubspot",
"position": [
240,
-368
],
"parameters": {
"email": "={{ $('Typeform Trigger').item.json.Email }}",
"options": {},
"authentication": "appToken",
"additionalFields": {
"lastName": "={{ $('Typeform Trigger').item.json['Last name'] }}",
"firstName": "={{ $('Typeform Trigger').item.json['First name'] }}",
"companyName": "={{ $('Typeform Trigger').item.json.Company }}",
"phoneNumber": "={{ $('Typeform Trigger').item.json['Phone number'] }}"
}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "20280495-5d1a-449b-9da0-7043a25ec7c1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-416
],
"parameters": {
"color": 7,
"width": 176,
"height": 96,
"content": "Typeform trigger: Gets trigger after capturing lead data"
},
"typeVersion": 1
},
{
"id": "eb29d7a5-0452-4d2e-b475-6f6e1ecf9071",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-256,
-64
],
"parameters": {
"color": 7,
"width": 176,
"height": 112,
"content": "Checks and deduplicate data before creating a new contact"
},
"typeVersion": 1
},
{
"id": "d6169b09-8f12-4356-8a1b-fd94c2830a24",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-464
],
"parameters": {
"color": 7,
"width": 192,
"height": 112,
"content": "If contact isn't available in Hubspot CRM, a contact is created"
},
"typeVersion": 1
},
{
"id": "2b3c10a7-a9f8-4d82-b598-d47d4696d150",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-80
],
"parameters": {
"color": 7,
"width": 192,
"height": 112,
"content": "If contact is available in Hubspot CRM, it updates existing contact"
},
"typeVersion": 1
},
{
"id": "a86fb201-a389-4234-8377-daf6729ea4f3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
432,
-448
],
"parameters": {
"color": 7,
"width": 192,
"height": 112,
"content": "Function code checks and assigns a score based on defined rules"
},
"typeVersion": 1
},
{
"id": "aa203c82-8227-4778-9a6a-2f47bf856c9c",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
928,
-288
],
"parameters": {
"color": 7,
"width": 192,
"height": 112,
"content": "Finally, it triggers new lead alert with status as - Cold, Warm, & Hot "
},
"typeVersion": 1
},
{
"id": "87aa9fa8-dbf5-4ac9-8390-d47281b10a64",
"name": "Lead Scoring",
"type": "n8n-nodes-base.code",
"position": [
464,
-272
],
"parameters": {
"jsCode": "const data = items[0].json; // full contact JSON\nconst props = data.properties || {};\nlet score = 0;\n\n// Rule 1: Conversion events\nif (parseInt(props.num_unique_conversion_events?.value || \"0\") > 0) {\n score += 30;\n}\n\n// Rule 2: Page views\nif (parseInt(props.hs_analytics_num_page_views?.value || \"0\") > 5) {\n score += 20;\n}\n\n// Rule 3: Visits\nif (parseInt(props.hs_analytics_num_visits?.value || \"0\") > 2) {\n score += 20;\n}\n\n// Rule 4: Email domain check\nconst email = props.email?.value || \"\";\nif (email && !/(gmail\\.com|yahoo\\.com|outlook\\.com|hotmail\\.com)$/i.test(email)) {\n score += 20;\n}\n\n// Rule 5: Phone present\nif (props.phone?.value || props.mobilephone?.value) {\n score += 10;\n}\n\n// Rule 6: Company enriched\nif (data[\"associated-company\"]?.properties?.hs_is_enriched?.value === \"true\") {\n score += 20;\n}\n\n// Rule 7: Lifecycle stage\nif ((props.lifecyclestage?.value || \"\").toLowerCase() === \"lead\") {\n score += 10;\n}\n\n// --- Lead Tiers ---\nlet tier = \"\u2744\ufe0f Cold Lead\";\nif (score >= 70) {\n tier = \"\ud83d\udd25 Hot Lead\";\n} else if (score >= 40) {\n tier = \"\ud83c\udf21 Warm Lead\";\n}\n\n// Return new object\nreturn [\n {\n json: {\n vid: data.vid,\n firstname: props.firstname?.value || \"\",\n lastname: props.lastname?.value || \"\",\n email: email,\n phone: props.phone?.value || props.mobilephone?.value || \"\",\n company: props.company?.value || data[\"associated-company\"]?.properties?.name?.value || \"\",\n leadScore: score,\n leadTier: tier\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "6e1b7142-47f7-40bd-b8f0-2eeac7aad6b3",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1456,
-848
],
"parameters": {
"width": 928,
"height": 1120,
"content": "# \ud83d\udee0\ufe0f Setup Guide \n## **Author:** [Krishna Sharma]\n\nLead Capture & Scoring Flow in HubSpot\n\n### \u2705 Step 1: Add a Typeform Trigger\nThis runs automatically whenever a new lead submits the form.\n\n### \u2705 Step 2: Add a HubSpot Contact \u2192 Search Node\nSearch for the contact in HubSpot to prevent duplicates before creating a new record.\n\n### \u2705 Step 3: Add an If Node (Create vs Update logic)\nRoute data depending on whether the contact exists in HubSpot:\n- True branch \u2192 create a new contact\n- False branch \u2192 update the existing contact (upsert logic)\n\n### \u2705 Step 4: Add a HubSpot Contact \u2192 Create Node (True branch)\nCreates a new contact in HubSpot with the form data.\n\n### \u2705 Step 5: Add a HubSpot Contact \u2192 Update Node (False branch)\nUpdates the existing contact record with fresh data.\n\n### \u2705 Step 6: Add a Function Node \u2192 Lead Scoring\nUse custom code to calculate a lead score based on your rules and assign a tier (e.g. Hot, Warm, Cold).\n\n### \u2705 Step 7: Add a Slack Node for Notifications\nSend a message to your Slack channel with a summary like this:\n\n\ud83d\ude80 New Lead Alert!\n\ud83d\udc64 Name: {{ $json.firstname }} {{ $json.lastname }}\n\ud83d\udce7 Email: {{ $json.email }}\n\ud83c\udfe2 Company: {{ $json.company }}\n\ud83d\udcca Score: {{ $json.leadScore }} \u2014 {{ $json.leadTier }}\n\n\ud83e\uddea Step 8: Run & Test\nExecute the workflow and verify that HubSpot is updating correctly and Slack alerts are triggered as expected."
},
"typeVersion": 1
}
],
"connections": {
"If": {
"main": [
[
{
"node": "Create a contact",
"type": "main",
"index": 0
}
],
[
{
"node": "Update a contact",
"type": "main",
"index": 0
}
]
]
},
"Lead Scoring": {
"main": [
[
{
"node": "Slack Notification",
"type": "main",
"index": 0
}
]
]
},
"Create a contact": {
"main": [
[
{
"node": "Lead Scoring",
"type": "main",
"index": 0
}
]
]
},
"Typeform Trigger": {
"main": [
[
{
"node": "Search HubSpot Contact",
"type": "main",
"index": 0
}
]
]
},
"Update a contact": {
"main": [
[
{
"node": "Lead Scoring",
"type": "main",
"index": 0
}
]
]
},
"Search HubSpot Contact": {
"main": [
[
{
"node": "If",
"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.
hubspotAppTokenslackOAuth2ApitypeformApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
π Smart Lead Capture, Scoring & Slack Alerts
Source: https://n8n.io/workflows/8685/ β 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 captures new leads from Typeform, instantly checks if their budget is above $5,000, and prioritizes them for faster sales follow-up. High-budget leads are enriched in HubSpot as contacts
This project automates the process of collecting and managing new leads submitted through a web form. It eliminates the need for manual data entry and ensures that each lead is: Properly recorded and
This workflow starts whenever a new lead submits a Typeform. It captures the leadβs details, checks their budget, and routes them based on priority and source. High-budget leads are pushed into HubSpo
This workflow automates the entire lead qualification process from form submission to personalized follow-up. When a prospect fills out your JotForm, the workflow instantly captures their information,
This template is perfect for: Marketing Teams looking to automatically qualify inbound leads from campaigns Sales Teams wanting to prioritize high-value prospects instantly Agencies offering lead qual