HubSpot + Slack: deals assigned fast and fairly
Unassigned deals are quiet killers. They sit in HubSpot with no owner, no follow-up, and then someone asks why “inbound is slow” this week.
This HubSpot Slack automation hits sales managers first, but ops leads and small agency teams feel it too. You get fair, consistent routing by region and company size, so deals get worked the same day instead of drifting for days.
Below, you’ll see how the workflow assigns owners automatically, what results to expect, and what you need to customize before turning it on.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: HubSpot + Slack: deals assigned fast and fairly
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Deals"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get contact for deals"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Unassigned Deals", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split out deals", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assign by Region", pos: "b", h: 48 }
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/hubspot.svg' width='40' height='40' /></div><br/>Assign deal to John"]
n7["<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/>Assign to Max"]
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/hubspot.svg' width='40' height='40' /></div><br/>Assign to Eeden"]
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/>Assign to Peter"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get company of contact(s)"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assign US deals by company s..", pos: "b", h: 48 }
n12["<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/>Assign deal to Edward"]
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/>Assign to Michael"]
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/hubspot.svg' width='40' height='40' /></div><br/>Assign to Suka"]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assign DE deals by company s..", pos: "b", h: 48 }
n1 --> n4
n4 --> n3
n5 --> n11
n5 --> n15
n5 --> n9
n0 --> n1
n3 --> n2
n2 --> n10
n10 --> n5
n15 --> n12
n15 --> n13
n15 --> n14
n11 --> n6
n11 --> n7
n11 --> n8
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,n5,n11,n15 decision
class n1,n2,n10 api
classDef customIcon fill:none,stroke:none
class n1,n2,n6,n7,n8,n9,n10,n12,n13,n14 customIcon
The Problem: Deals Go Unowned (And Nobody Notices)
Most teams don’t “choose” to ignore leads. It happens because ownership is messy. Someone imports deals, a form creates them without an owner, a rep changes roles, or a round-robin rule gets skipped. Then the deal just sits there. By the time you notice, the buyer has moved on or already booked with a competitor. Even worse, reporting gets distorted because the pipeline is full of ghosts that never had a real chance.
The friction compounds fast. Here’s where it breaks down in real life.
- You end up checking “Unassigned” manually every morning, which gets skipped on busy days.
- Regional routing turns into tribal knowledge, so the “right rep” depends on who happens to be online.
- Company size rules get applied inconsistently, which means enterprise reps waste time on tiny accounts.
- Follow-up time slips from hours to days, and the whole funnel looks weaker than it really is.
The Solution: Auto-Route Unowned HubSpot Deals (Then Notify in Slack)
This workflow runs on a schedule (once a day by default) and looks for deals in HubSpot that still don’t have an owner. When it finds them, it pulls in the attached contact and then the contact’s company, because routing decisions usually live there. Next, it checks the company’s region and routes the deal down the correct path. For specific regions (like the US and Germany in this workflow), it also uses employee count to decide which rep should own the deal. Finally, it updates the deal owner back in HubSpot, with a fallback owner if nothing matches your criteria.
The workflow starts with a daily check, then enriches each unowned deal with contact and company details. After that, switches apply your routing rules by region and employee size. The result is simple: HubSpot gets clean ownership, and your team can be alerted in Slack so someone actually acts on it.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 15 new deals a day, and about 5 of them land unowned because of imports, handoffs, or form quirks. Manually, someone has to open each deal, check the company’s region and employee count, then assign an owner and message the rep. Call it 6 minutes per deal. That’s about 30 minutes a day, roughly 2.5 hours a week. With this workflow: you spend maybe 10 minutes once setting rules, then the daily run handles the assignments automatically.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HubSpot to read deals and update owners.
- Slack to alert the team after assignment.
- HubSpot private app token (create it in HubSpot developer settings)
Skill level: Beginner. You’ll connect HubSpot, edit a few routing values, and test with a handful of sample deals.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Daily trigger runs automatically. The schedule node starts the workflow once a day (you can change it to hourly if your lead flow is heavier).
HubSpot deals are retrieved and filtered. n8n pulls a list of deals via HTTP Request, splits them into individual items, then keeps only the ones that are unowned.
Contact and company data gets added. For each unowned deal, the workflow fetches the attached contact, then the company tied to that contact, so you can route based on real firmographic fields like region and employee count.
Routing rules assign the owner. A region switch sends the deal down the right branch. In the US and DE branches, another switch uses employee size to pick the correct rep, then HubSpot nodes update the deal owner (with a fallback owner if no rule matches).
You can easily modify the region and employee-count criteria to match how you sell today. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run on a timed schedule to fetch and assign unowned deals automatically.
- Add the Timed Schedule Start node as your trigger.
- Set the schedule rule to run every 2 days at 07:00 by configuring Interval to
{"daysInterval":2,"triggerAtHour":7}. - Connect Timed Schedule Start to Retrieve Deal List.
Step 2: Connect HubSpot
Authenticate all HubSpot requests and updates used across the workflow.
- Open Retrieve Deal List and confirm Authentication is set to
predefinedCredentialType. - Credential Required: Connect your hubspotOAuth2Api credentials in Retrieve Deal List.
- Repeat the same hubspotOAuth2Api credential selection for the other HubSpot nodes: Fetch Deal Contact, Fetch Contact Company, Update Owner A, Update Owner B, Update Owner C, Update Owner D, Update Owner E, Update Owner F, and Fallback Owner Assign.
Step 3: Set Up Deal Retrieval and Filtering
Pull deals, split them into individual items, and filter for those without an owner.
- In Retrieve Deal List, set URL to
https://api.hubapi.com/crm/v3/objects/deals?properties=dealname,amount,hubspot_owner_id&associations=contacts. - In Expand Deal Items, set Field to Split Out to
results. - In Filter Unowned Deals, set the condition Left Value to
{{ $json.properties.hubspot_owner_id }}and the operator toemptyso only unassigned deals continue. - Verify the flow: Retrieve Deal List → Expand Deal Items → Filter Unowned Deals.
Step 4: Set Up Contact and Company Enrichment
Enrich each deal with its associated contact and company data to route correctly.
- In Fetch Deal Contact, set URL to
=https://api.hubapi.com/crm/v3/objects/contacts/{{ $json.associations.contacts.results[0].id }}?associations=company. - In Fetch Contact Company, set URL to
=https://api.hubapi.com/crm/v3/objects/companies/{{ $json.associations.companies.results[0].id }}?properties=name,domain,city,country,numberofemployees. - Confirm the path: Filter Unowned Deals → Fetch Deal Contact → Fetch Contact Company → Route by Region.
Step 5: Configure Routing Logic
Route deals by region and company size to determine the correct owner update path.
- In Route by Region, set the US rule to Left Value
{{ $json.properties.country }}equalsUnited Statesand the DE rule toGermany. - Ensure Route by Region sends outputs to US Size Routing, DE Size Routing, and the fallback output to Fallback Owner Assign.
- In US Size Routing, configure thresholds using Left Value
{{ $json.properties.numberofemployees }}withlte 50,lte 499, andgte 500. - In DE Size Routing, configure thresholds using Left Value
{{ $json.properties.numberofemployees }}withlte 100000,lte 499, andgte 500.
Step 6: Configure Deal Owner Updates
Assign owners based on routing outcomes using HubSpot deal update actions.
- In Update Owner A, Update Owner B, and Update Owner C, set Deal ID to
{{ $('Filter Unowned Deals').item.json.id }}and set Deal Owner to the correct user ID. - In Update Owner D, Update Owner E, and Update Owner F, use the same Deal ID expression and assign the appropriate owner IDs.
- In Fallback Owner Assign, set Deal Owner to your default assignment ID for any unmatched region.
[YOUR_ID] and [YOUR_EMAIL] with real HubSpot owner IDs, or updates will silently fail.Step 7: Test and Activate Your Workflow
Run a manual test to ensure routing and owner updates work as expected before turning it on.
- Click Execute Workflow and verify that Retrieve Deal List returns data and Filter Unowned Deals only keeps unassigned deals.
- Check that Route by Region sends items to US Size Routing or DE Size Routing, and that owner update nodes receive the correct deal IDs.
- Confirm in HubSpot that the deal owner changes are applied.
- Toggle the workflow to Active to run on the defined schedule.
Common Gotchas
- HubSpot credentials can expire or lack scopes. If assignments stop working, check your private app token permissions and the credential used in n8n first.
- If your deals don’t always have an attached contact and company, the HTTP Request steps will return empty data. Fix the HubSpot data model or add a fallback path before routing.
- Region and employee count values must match your Switch conditions exactly. If HubSpot has “DACH” but your workflow expects “DE,” everything will fall into the fallback owner.
Frequently Asked Questions
Usually about 20 minutes once your HubSpot fields are ready.
No. You’ll paste credentials, choose your routing values, and test a few deals. The logic is configured with dropdown-style conditions, not code.
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 access costs based on your plan.
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, but you’ll change the decision point. You can replace the region Switch with a simple rotation rule (for example, using a Google Sheet “next rep” value) and keep the same HubSpot “update owner” nodes. Common customizations include adding a “deal source” branch, assigning based on product line, or routing enterprise deals to a dedicated queue. If you still want region as a tie-breaker, keep the region check first and apply round-robin inside each region.
Most of the time it’s an expired token or missing scopes on your HubSpot private app. Regenerate the token, update the credential in n8n, then re-test the “retrieve deals” request first. Also check that your deals actually have an associated contact and company; if not, the enrichment calls can fail and downstream routing will have nothing to work with.
Plenty for most small teams. On n8n Cloud, your limit is mostly tied to monthly executions (Starter is fine for daily checks; heavy volumes may need a higher plan). If you self-host, there’s no execution cap, but your server size and HubSpot API limits become the bottleneck.
Often, yes. This routing uses multiple decision branches (region, then employee size) and enrichment calls, which is where n8n tends to feel simpler and cheaper to run. Self-hosting is a big deal if you don’t want per-task pricing as volume grows. Zapier and Make can still be fine for a basic “new deal → assign owner” rule, especially if you want the quickest setup and don’t care about deeper logic. If you’re torn, Talk to an automation expert and we’ll map it to your process.
Once deals stop going unowned, everything downstream gets easier: follow-up, forecasting, and even team morale. Set the rules once, then let the workflow keep your pipeline honest.
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.