AutomationFlows β€Ί CRM & Sales β€Ί Typeform Lead Capture to Hubspot with Scoring and Slack Alerts

Typeform Lead Capture to Hubspot with Scoring and Slack Alerts

ByKrishna Sharma @triggerallβœ“ on n8n.io

πŸ“„ Smart Lead Capture, Scoring & Slack Alerts

Event triggerβ˜…β˜…β˜…β˜…β˜† complexity14 nodesTypeform TriggerHubSpotSlack
CRM & Sales Trigger: Event Nodes: 14 Complexity: β˜…β˜…β˜…β˜…β˜† Added:

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 β†’

Download .json
{
  "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.

Pro

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 β†’

More CRM & Sales workflows β†’ Β· Browse all categories β†’

Related workflows

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

CRM & Sales

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

Typeform Trigger, HubSpot, Google Sheets +1
CRM & Sales

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

Google Sheets Trigger, Slack, Gmail +1
CRM & Sales

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

Typeform Trigger, HubSpot, Google Sheets +2
CRM & Sales

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,

Jot Form Trigger, HubSpot, Google Sheets +2
CRM & Sales

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

Form Trigger, Slack, OpenAI +5