Typeform + HubSpot: scored leads, clear Slack alerts
You finally get Typeform submissions coming in… and then the busywork starts. Copying fields into HubSpot, checking if the person already exists, deciding if they’re worth an immediate call, and letting sales know (without spamming the channel) is where leads quietly die.
Marketing managers feel this when campaign volume spikes. SDRs feel it when “hot” leads sit unnoticed for an hour. And founders doing their own follow-up? Honestly, they’re the ones stuck doing everything. This Typeform HubSpot automation dedupes contacts, scores them, and posts a clear Slack alert so you can respond faster.
Below, you’ll see how the workflow runs, what it automates end-to-end, and how to tailor scoring tiers (Cold, Warm, Hot) to match how your team actually sells.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Typeform + HubSpot: scored leads, clear Slack alerts
flowchart LR
subgraph sg0["Typeform Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/typeform.dark.svg' width='40' height='40' /></div><br/>Typeform Trigger"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>Search HubSpot Contact"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Notification"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>Update a contact"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>Create a contact"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Lead Scoring"]
n3 --> n5
n3 --> n4
n6 --> n2
n5 --> n6
n0 --> n1
n4 --> n6
n1 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n3 decision
class n6 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n4,n5,n6 customIcon
The Problem: Form leads get lost (or duplicated)
Typeform makes it easy to collect leads, but it doesn’t make them usable for sales. Someone submits a form, then the same details get pasted into HubSpot, sometimes twice, sometimes with a typo, and often with missing context. Then comes the awkward part: deciding who’s “hot” based on gut feel, not rules. If your reps don’t get a timely alert, they follow up late, and late follow-up turns good intent into “we went with someone else.” It’s not one big failure. It’s dozens of tiny delays.
The friction compounds. Here’s where it breaks down in real teams:
- Duplicates pile up in HubSpot when multiple forms or campaigns hit the same audience.
- Manual triage eats about 1–2 hours a day once submissions are steady.
- Sales gets either no alert or a messy alert, which means they ask follow-up questions you already captured.
- HubSpot’s default scoring often feels too rigid, so teams stop trusting the score at all.
The Solution: Deduplicate, score, and alert sales automatically
This workflow turns a raw Typeform submission into a clean, prioritized lead inside HubSpot, with a Slack message your sales team can act on immediately. It starts when a new Typeform response comes in. n8n checks HubSpot for an existing contact using the email address, then either creates a new contact or updates the existing one with the freshest answers. Next, a custom scoring step applies your rules (company email, job title hints, phone present, enrichment signals if you add them later) and assigns a tier: Cold, Warm, or Hot. Finally, a formatted Slack alert posts the lead details and priority so your team knows what to do next.
The workflow begins at Typeform, runs a quick HubSpot duplicate check, then applies your scoring logic in one place. Slack gets the final “this is worth attention” summary, not a wall of fields.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 20 Typeform leads a day. Manually, a typical routine looks like 5 minutes to check HubSpot for duplicates, 5 minutes to create/update the contact, and another 2–3 minutes to write a useful Slack note. That’s roughly 3 hours a day of busywork. With this workflow, you spend maybe 10 minutes up front setting your scoring rules, then each new lead is processed automatically and posted to Slack within a minute or two. Your team gets those 3 hours back, and “hot” leads don’t wait in a queue.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Typeform for capturing inbound lead submissions
- HubSpot to store, dedupe, and update contacts
- Slack to notify sales with lead tier details
- HubSpot private app token or OAuth (get it from HubSpot settings → Integrations → Private Apps)
Skill level: Intermediate. You’ll connect accounts, map fields, and adjust a simple scoring script.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A Typeform submission triggers the workflow. The instant someone hits submit, n8n pulls the response fields you care about (name, email, company, phone, and any custom questions).
HubSpot gets checked before anything is created. The workflow searches HubSpot by email so you don’t create a second “[email protected]” just because they filled out a different form this week.
The contact is created or updated, then scored. If HubSpot doesn’t find a match, n8n creates the contact; if it does, it updates the record with fresh data. Right after that, the scoring logic runs in a small code step, which assigns a numeric score and a simple tier (Cold, Warm, Hot).
Slack receives a clean alert your team can act on. The message includes the lead identity plus the score and tier so reps can prioritize follow-up without opening HubSpot first.
You can easily modify the scoring rules to match your pipeline reality, or adjust the Slack message format to fit your team’s habits. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Typeform Trigger
Set up the Typeform trigger so new form submissions start the workflow.
- Add or open Typeform Intake Trigger and set Form ID to
DJUUTAmq. - Credential Required: Connect your typeformApi credentials to Typeform Intake Trigger.
- Save the node to generate the webhook and ensure Typeform can deliver submissions to n8n.
Step 2: Connect HubSpot Search and Conditional Logic
Search for an existing contact and branch based on whether the email exists.
- Open Find HubSpot Contact and set Operation to
searchwith Authentication set toappToken. - In Find HubSpot Contact filters, set Property to
email|stringand Value to={{ $json.Email }}. - Credential Required: Connect your hubspotAppToken credentials to Find HubSpot Contact.
- Configure Contact Exists Check with a single condition using Left Value
={{ $json.properties.email }}and the operator notExists.
Step 3: Create or Update Contacts and Calculate Lead Score
Create a new contact when no record exists, update it if it does, then score the lead.
- In Create HubSpot Contact, set Email to
={{ $('Typeform Intake Trigger').item.json.Email }}and map the additional fields:- Last Name →
={{ $('Typeform Intake Trigger').item.json['Last name'] }} - First Name →
={{ $('Typeform Intake Trigger').item.json['First name'] }} - Company Name →
={{ $('Typeform Intake Trigger').item.json.Company }} - Phone Number →
={{ $('Typeform Intake Trigger').item.json['Phone number'] }}
- Last Name →
- Credential Required: Connect your hubspotAppToken credentials to Create HubSpot Contact.
- In Modify HubSpot Contact, set Email to
={{ $json.properties.email }}and map the additional fields:- Last Name →
={{ $('Set Field').item.json['Last name'] }} - First Name →
={{ $('Set Field').item.json['First name'] }} - Company Name →
={{ $('Set Field').item.json.Company }} - Phone Number →
={{ $('Set Field').item.json['Phone number'] }}
- Last Name →
- Credential Required: Connect your hubspotAppToken credentials to Modify HubSpot Contact.
- Open Lead Score Logic and keep the JavaScript scoring logic as provided to calculate
leadScoreandleadTier.
Step 4: Configure Slack Notifications
Send a formatted alert to Slack with the computed lead details.
- Open Send Slack Alert and set Text to
=🚀 *New Lead Alert!* 👤 Name: {{ $json.firstname }} {{ $json.lastname }} 📧 Email: {{ $json.email }} 🏢 Company: {{ $json.company }} 📊 Score: {{ $json.leadScore }} — {{ $json.leadTier }}. - Set Select to
channeland choose the destination channel in Channel. - Credential Required: Connect your slackOAuth2Api credentials to Send Slack Alert.
Step 5: Test and Activate Your Workflow
Validate the flow end-to-end and then enable it for live leads.
- Click Execute Workflow and submit a test response in the Typeform connected to Typeform Intake Trigger.
- Confirm that Find HubSpot Contact returns data, Contact Exists Check routes correctly, and either Create HubSpot Contact or Modify HubSpot Contact runs.
- Verify Lead Score Logic outputs
leadScoreandleadTier, and that Send Slack Alert posts the message in Slack. - When the test run is successful, toggle the workflow to Active to enable production automation.
Common Gotchas
- HubSpot credentials can expire or lack the right scopes. If contacts stop creating/updating, check your Private App permissions and token status in HubSpot first.
- Typeform responses don’t always include optional fields (like phone). If your scoring logic assumes a field exists, add safe fallbacks so the code step doesn’t error on blank values.
- Slack alerts can fail silently when the channel ID changes or the bot isn’t invited. If messages stop posting, confirm the app is in the channel and review n8n’s Slack node execution logs.
Frequently Asked Questions
About 30–60 minutes if your accounts and fields are ready.
No, not really. You’ll mostly connect accounts and map fields, then copy a simple scoring snippet you can tweak over time.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in HubSpot and Typeform plan limits (API access can require paid tiers).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Update the scoring logic inside the Lead Score Logic code step to reflect your ICP signals, then adjust the tier thresholds (Cold/Warm/Hot) so they match how your sales team actually treats urgency. Common customizations include giving points for company email domains, specific job titles, a filled phone field, or extra points when a lead selects a high-intent option on the form. You can also change the Slack message format in Send Slack Alert so it highlights the exact fields reps care about.
Usually it’s an expired or rotated token, so regenerate your HubSpot private app token and update it in n8n. It can also be missing scopes (like contacts write access), which shows up as “forbidden” errors in the node output. If the search works but create/update fails, double-check which HubSpot account you connected and that the properties you mapped actually exist.
A lot for typical SMB volume. On n8n Cloud Starter, you’re mainly limited by monthly executions, while self-hosting removes execution caps and shifts the limit to your server and the Typeform/HubSpot APIs. In practice, most teams run hundreds or thousands of submissions a month without changing anything, as long as API limits and rate limits are respected.
Often, yes, because this kind of lead scoring and branching gets complex fast. n8n handles “if contact exists then update else create” logic cleanly, and you can keep the scoring rules in one editable code step instead of stacking fragile filters. It’s also easier to extend with enrichment later (via HTTP requests) without hitting premium task pricing every time you add a branch. Zapier or Make can still be a fine choice if you want a very simple two-step flow and never plan to change the logic. If you’re unsure, Talk to an automation expert and you can sanity-check the best fit in 15 minutes.
Once this is in place, leads stop leaking through cracks you didn’t even know you had. The workflow handles the repetitive triage so your team can spend that attention where it pays off.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.