HubSpot + Slack: turn job posts into sales leads
Job posts keep showing up in your market, and you know they mean something. But unless someone manually spots them, researches the company, and logs the lead, that “intent signal” just disappears into the scroll.
HubSpot users in sales and growth feel this first. A marketing manager sees the same missed window from the other side. And if you run an agency, you’re probably tired of explaining why “timing” matters when nobody has time to track it. This HubSpot Slack leads automation turns hiring activity into contacts, tasks, and alerts you can act on.
You’ll see how the workflow captures job intent, enriches and de-duplicates the record, updates HubSpot, and pings the right people in Slack so follow-up actually happens.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: HubSpot + Slack: turn job posts into sales leads
flowchart LR
subgraph sg0["Flow 1"]
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/lemlist.svg' width='40' height='40' /></div><br/>Lemlist - Add lead to campaign"]
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/>HubSpot - Follow up task"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Attempted to contact?", pos: "b", h: 48 }
n3["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Lonescale - New Job Intent"]
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/dropcontact.svg' width='40' height='40' /></div><br/>Dropcontact"]
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/>HubSpot - Search company"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "New Company?", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Customer?", pos: "b", h: 48 }
n8["<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 - Notify CS team on Sl.."]
n9["<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/>HubSpot Update Account"]
n10["<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/>HubSpot"]
n11["<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/>HubSpot Create Account"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Account in Hubspot", pos: "b", h: 48 }
n13["<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/>HubSpot - Create/Update Cont.."]
n14["<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 - Notify sales team on.."]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Open Deal?", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "email found", pos: "b", h: 48 }
n17["<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/>HubSpot - Linkedin Outreach"]
n10 --> n13
n15 --> n14
n4 --> n5
n16 --> n0
n16 --> n17
n7 --> n8
n6 --> n16
n2 --> n1
n12 --> n9
n12 --> n11
n11 --> n10
n9 --> n10
n5 --> n12
n3 --> n4
n13 --> n6
n13 --> n7
n13 --> n2
n13 --> n15
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 n2,n6,n7,n12,n15,n16 decision
class n3 api
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n4,n5,n8,n9,n10,n11,n13,n14,n17 customIcon
The Problem: Job Intent Data Gets Lost (Or Never Logged)
Hiring is a buying signal. A company posts for “RevOps,” “Paid Search,” or “Sales Development” because something is changing, and budgets usually follow. The frustrating part is how easy it is to waste that signal: someone sees the post, bookmarks it, then forgets. Or a rep creates a half-baked HubSpot record, skips enrichment, and you end up with duplicates and no clear next step. Multiply that by a week of job posts and you’re not “missing a few leads.” You’re training your team to ignore a reliable trigger.
It adds up fast. Here’s where it breaks down in real life.
- Job posts get captured in random places (a Slack message, a note, a spreadsheet), so nothing is routed to sales consistently.
- Without enrichment, reps spend about 10–20 minutes hunting for a domain, a decision-maker, and a usable email.
- Duplicate companies and contacts quietly pile up, which means reporting gets messy and sequences hit the wrong record.
- Follow-up depends on memory, not a task, so “great timing” turns into “we’ll reach out next month.”
The Solution: Job Intent → Enriched HubSpot Lead + Slack Routing
This workflow starts when a job intent signal hits your system through a webhook (for example, from a scraper, a job-post monitoring tool, or a form you use internally). n8n then enriches the company and contact details via Dropcontact, so you’re not working from a vague company name and a role title. Next, it looks up the company in HubSpot and decides whether to update an existing account or create a new one. In the same pass, it searches for the contact, upserts the contact record, and checks key conditions like customer status, open deals, and whether an email was detected. Finally, it routes the outcome: sales gets a Slack notification when the signal is actionable, customer success gets alerted if it’s an existing customer, and HubSpot tasks are created so the lead doesn’t die in Slack.
The flow is simple to reason about. Webhook in, enrichment and HubSpot matching in the middle, then Slack + tasks + optional outreach enrollment as the finish. You get clean CRM data and immediate visibility, without asking someone to do “quick admin” all day.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 25 new job posts a week. Manually, a rep might spend about 15 minutes researching each company, 10 minutes finding a contact, and 5 minutes logging everything in HubSpot (roughly 12 hours weekly). With this automation, you send the job intent into the webhook, wait a couple minutes for enrichment and HubSpot updates, and Slack gets the right alert automatically. You still choose the message, but the lead is already clean, enriched, and assigned.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HubSpot to store companies, contacts, and tasks
- Slack to notify sales or customer success
- Dropcontact API key (get it from your Dropcontact dashboard)
Skill level: Intermediate. You’ll connect accounts, map a few HubSpot fields, and test the webhook payload end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A job intent signal hits your webhook. Your monitoring tool (or internal process) sends details like company name, job title, and source URL into n8n’s Webhook node.
Enrichment fills in the blanks. n8n calls Dropcontact to enrich the data, which helps turn “Company X is hiring” into something you can actually use in HubSpot, like a matched domain and contact identity details.
HubSpot gets updated, not cluttered. The workflow looks up the company first, then chooses between creating a new account or updating an existing one. It searches for the contact, upserts the contact record, and runs a few checks (customer status, contact attempts, and open deals) so you don’t spam existing opportunities or step on CS toes.
Slack and follow-up tasks get routed. Sales receives a Slack notification for net-new, actionable signals, and HubSpot tasks are created for outreach. If the account is already a customer, CS can be alerted instead, so the conversation stays coordinated.
You can easily modify the routing logic to notify different channels or assign tasks to specific owners based on territory. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound trigger that receives hiring intent signals and kicks off the workflow.
- Add the Job Intent Webhook node as your trigger.
- Set HTTP Method to
POST. - Set Path to
fe426a62-eee5-4fed-bc74-45d4ac09b338-lonescale. - Send a sample POST payload to the webhook URL to generate test data.
Step 2: Enrich and Identify the Company
Enrich the inbound data and locate the company record in HubSpot before deciding how to proceed.
- Add Dropcontact Enrichment and map Company to
{{ $json["body"]["people_company_name"] }}, Website to{{ $json["body"]["people_company_domain"] }}, Last Name to{{ $json["body"]["people_last_name"] }}, and First Name to{{ $json["body"]["people_first_name"] }}. - Credential Required: Connect your dropcontactApi credentials in Dropcontact Enrichment.
- Add HubSpot Company Lookup with Operation set to
searchByDomain, Domain set to{{ $node["Job Intent Webhook"].json["body"]["people_company_domain"] }}, and Limit set to1. - Include Properties array values
hs_lead_status,numberofemployees,description, andlinkedin_company_page. - Credential Required: Connect your hubspotOAuth2Api credentials in HubSpot Company Lookup.
- Confirm Dropcontact Enrichment connects to HubSpot Company Lookup in the canvas.
Step 3: Create or Update the HubSpot Company and Find the Contact
Branch based on whether a company exists, then update or create the company and search for the contact.
- Add Account Exists Check with condition
{{ $json["companyId"] }}isisNotEmpty. - Connect the true output of Account Exists Check to Update HubSpot Account and the false output to Create HubSpot Account.
- In Update HubSpot Account, set Company ID to
{{ $json["companyId"] }}and map Description, Number Of Employees, and LinkedIn Company Page using the expressions in the node. - In Create HubSpot Account, set Name to
{{ $node["Job Intent Webhook"].json["body"]["company_name"] }}and map Website URL, Description, Year Founded, and LinkedIn Company Page from the webhook payload. - Add HubSpot Contact Search with Operation set to
search, and filter on Email using{{ $node["Dropcontact Enrichment"].json["email"][0]["email"] }}. - Credential Required: Connect your hubspotOAuth2Api credentials in Update HubSpot Account, Create HubSpot Account, and HubSpot Contact Search.
Step 4: Upsert the Contact and Run Parallel Checks
Upsert the contact in HubSpot, then evaluate multiple lead status conditions in parallel.
- Add Upsert HubSpot Contact and set Email to
{{ $node["Dropcontact Enrichment"].json["email"][0]["email"] }}. - Map Job Title, Last Name, First Name, and Company Name with the expressions from the node parameters, and map the custom property linkedin_url to
{{ $json["properties"]["lemlistlinkedinurl"] || $node["Job Intent Webhook"].json["body"]["people_linkedin_url"] }}. - Credential Required: Connect your hubspotOAuth2Api credentials in Upsert HubSpot Contact.
- Connect HubSpot Contact Search to Upsert HubSpot Contact.
- Upsert HubSpot Contact outputs to both New Account Check, Customer Status Check, Contact Attempt Check, and Open Deal Check in parallel.
Tip: Parallel checks let you trigger multiple actions based on lead status without waiting for sequential evaluation.
Step 5: Configure Outreach and Notification Actions
Send Slack alerts, create HubSpot tasks, and enroll leads in Lemlist based on lead status and email availability.
- From New Account Check, route to Email Detected. This node then outputs to both Lemlist Lead Enrollment and LinkedIn Outreach Task in parallel.
- In Lemlist Lead Enrollment, set Email to
{{ $json["properties"]["email"]["value"] }}and Campaign ID toHiring Signal Lonescale. Map Last Name, First Name, Company Name, and LinkedIn URL using the provided expressions. - Credential Required: Connect your lemlistApi credentials in Lemlist Lead Enrollment.
- In LinkedIn Outreach Task, keep Type as
task, set Subject toHiring Signal - New lead to contact, and associate company/contact IDs using{{ $node["Update HubSpot Account"].json["companyId"] || $node["Create HubSpot Account"].json["companyId"] }}and{{ $json["vid"] }}. - Credential Required: Connect your hubspotOAuth2Api credentials in LinkedIn Outreach Task.
- From Contact Attempt Check, connect to HubSpot Follow-up Task with its metadata body expression intact and associations set to
{{ $node["Update HubSpot Account"].json["companyId"] || $node["Create HubSpot Account"].json["companyId"] }}and{{ $json["vid"] }}. - Credential Required: Connect your hubspotOAuth2Api credentials in HubSpot Follow-up Task.
- From Customer Status Check, connect to CS Slack Alert and set Channel to
Customer Success - Customer Newswith the provided message expression. - From Open Deal Check, connect to Sales Slack Notification and keep the HubSpot record URL expression intact.
- Credential Required: Connect your slackOAuth2Api credentials in CS Slack Alert and Sales Slack Notification.
⚠️ Common Pitfall: Ensure Email Detected is correctly configured to only pass records with a valid email; otherwise, Lemlist Lead Enrollment may fail or enroll incomplete leads.
Step 6: Test and Activate Your Workflow
Validate the end-to-end flow and then enable the workflow for production use.
- Click Execute Workflow and send a test POST request to the Job Intent Webhook URL.
- Verify that Dropcontact Enrichment returns email data and that HubSpot Company Lookup returns or creates a company record.
- Confirm that Upsert HubSpot Contact creates/updates the contact and that parallel checks fire as expected.
- Check for outreach actions: Lemlist Lead Enrollment enrollment, LinkedIn Outreach Task creation, and Slack messages from CS Slack Alert or Sales Slack Notification.
- Once verified, toggle the workflow to Active to process real hiring signals.
Common Gotchas
- HubSpot credentials can expire or need specific permissions. If things break, check your HubSpot private app scopes and the connection status inside n8n first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About an hour if your HubSpot, Slack, and Dropcontact accounts are ready.
No. You’ll connect accounts, map fields, and paste in a webhook URL.
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 Dropcontact API costs based on how many enrichments you run.
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 it’s one of the best reasons to use n8n. You’ll adjust the “Customer Status Check,” “Open Deal Check,” and “New Account Check” decision points to match your rules, then point the Slack nodes to different channels. Common customizations include routing by country, routing by deal stage, and creating different HubSpot tasks for email vs. LinkedIn follow-up.
Usually it’s expired credentials or missing scopes on your HubSpot private app. Reconnect HubSpot in n8n, then confirm the app has permission to read and write companies, contacts, and tasks. If the workflow creates records but can’t update them, it’s often a permissions mismatch. And if you’re pushing a lot of job posts at once, HubSpot rate limiting can show up as intermittent failures.
For most small teams, hundreds per month is fine, and the real limit is your n8n plan and enrichment budget. On n8n Cloud, your monthly execution limit depends on your plan. If you self-host, there’s no fixed execution cap, but your server resources and API rate limits will still matter. If you plan to ingest job posts in bulk, use batching (Split in Batches) and pace the enrichment calls.
Often, yes, because this workflow relies on multiple checks (customer status, open deals, contact attempts) and careful upserts, which get awkward and expensive in simpler automation tools. n8n is also easier to extend when you want to add logic like batching, merges, or multi-channel routing. Zapier or Make can still be fine if your process is just “job post in → Slack message out,” and you don’t care about CRM cleanliness. Honestly, CRM cleanliness is where most automations fall apart. Talk to an automation expert if you want help choosing.
Once it’s running, job intent stops being “interesting” and starts being actionable. The workflow handles the repetitive cleanup and routing so your team can focus on the conversation.
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.