

How to Send HubSpot Deal Stage Alerts to Slack with N8n
Automatically notify your team in Slack when HubSpot deals move to new pipeline stages with deal details and next steps.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
HubSpot for Slack exists as a native integration, but it doesn't support conditional routing or custom message formatting. This guide uses an automation platform for full control. View native option →
Best for
Sales teams that want real-time deal stage notifications with custom filtering or formatting logic.
Not ideal for
Teams without technical resources to manage webhooks and handle API authentication.
Sync type
real-timeUse case type
notificationReal-World Example
A 25-person B2B SaaS company uses this to notify their #sales-wins channel whenever a deal moves to 'Closed Won' stage, and DM the sales manager when deals over $50K hit 'Negotiation'. Before automation, their sales director checked HubSpot manually every morning and afternoon, often missing stage changes that happened overnight or during meetings.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Deal Name | dealname | |
| Deal Amount | amount | |
| Deal Stage | dealstage | |
| Deal Owner | hubspot_owner_id | |
3 optional fields▸ show
| Close Date | closedate |
| Pipeline | pipeline |
| Deal Type | dealtype |
Step-by-Step Setup
Workflows > New Workflow
Create new N8n workflow
Start a fresh workflow in N8n. This will be your main automation that connects HubSpot deal updates to Slack notifications.
- 1Click 'New Workflow' in your N8n dashboard
- 2Name it 'HubSpot Deal Stage Alerts'
- 3Click 'Save' to create the workflow
Workflow Canvas > Add Node > Webhook
Add HubSpot trigger node
Set up the trigger that fires when deals change in HubSpot. You'll use the webhook trigger since HubSpot's real-time notifications are more reliable than polling.
- 1Click the '+' button on the canvas
- 2Search for 'Webhook' in the node list
- 3Select 'Webhook' as your trigger node
- 4Set HTTP Method to 'POST'
- 5Copy the webhook URL that appears
HubSpot Settings > Data Management > Properties > Webhooks
Configure HubSpot webhook subscription
Tell HubSpot to send deal property changes to your N8n webhook. This happens in your HubSpot developer settings.
- 1Open HubSpot and go to Settings > Integrations > Private Apps
- 2Create a new private app or select existing one
- 3Add 'crm.objects.deals.read' and 'webhooks' scopes
- 4Go to Settings > Data Management > Properties
- 5Navigate to 'Webhooks' section and click 'Create subscription'
- 6Paste your N8n webhook URL
- 7Select 'Deal' as object type and 'dealstage' as the property to watch
Drop this into an n8n Code node.
Copy this template{{ new Date(parseInt($node['HubSpot'].json['properties']['closedate'])).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) }}▸ Show code
{{ new Date(parseInt($node['HubSpot'].json['properties']['closedate'])).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) }}... expand to see full code
{{ new Date(parseInt($node['HubSpot'].json['properties']['closedate'])).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) }}Workflow Canvas > Add Node > HubSpot > Deal > Get
Add HubSpot node for deal details
The webhook only sends basic info. Add a HubSpot node to fetch full deal details like amount, close date, and owner.
- 1Click '+' after the webhook node
- 2Search for 'HubSpot' and select it
- 3Choose 'Get' operation and 'Deal' resource
- 4Set Deal ID to {{ $node['Webhook'].json['objectId'] }}
- 5In 'Additional Fields', add 'Properties to Return'
- 6Enter: dealname,amount,dealstage,hubspot_owner_id,closedate,pipeline
Workflow Canvas > Add Node > HubSpot > Owner > Get
Add owner lookup node
Convert the HubSpot owner ID to an actual name for your Slack message. This requires a second HubSpot API call.
- 1Add another HubSpot node after the deal node
- 2Set operation to 'Get' and resource to 'Owner'
- 3Set Owner ID to {{ $node['HubSpot'].json['properties']['hubspot_owner_id'] }}
- 4In Additional Fields, select 'Properties to Return'
- 5Enter: email,firstName,lastName
Workflow Canvas > Add Node > Switch
Add stage name lookup
HubSpot sends stage IDs, not readable names. Add a switch node to convert stage IDs to human-readable stage names.
- 1Add a 'Switch' node after the owner lookup
- 2Set 'Mode' to 'Expression'
- 3Enter {{ $node['HubSpot'].json['properties']['dealstage'] }} as the value
- 4Add routing rules for each stage ID in your pipeline
- 5Map each stage ID to its readable name (e.g., 'qualifiedtobuy' → 'Qualified to Buy')
Workflow Canvas > Add Node > Set
Build Slack message template
Create a formatted message with deal details. Use a Set node to structure the Slack message with deal name, amount, stage, and owner.
- 1Add a 'Set' node after each switch output
- 2Click 'Add Value' and select 'String'
- 3Name it 'slackMessage'
- 4Enter this template: '*{{ $node['HubSpot'].json['properties']['dealname'] }}* moved to {{ $node['Switch'].json['stageName'] }}\n💰 Amount: ${{ $node['HubSpot'].json['properties']['amount'] }}\n👤 Owner: {{ $node['HubSpot1'].json['firstName'] }} {{ $node['HubSpot1'].json['lastName'] }}\n📅 Close Date: {{ $node['HubSpot'].json['properties']['closedate'] }}'
- 5Add another string value called 'channelName' with your target Slack channel
email: {{email}}
company: {{company}}
Workflow Canvas > Add Node > Slack > Post Message
Add Slack notification node
Send the formatted message to your Slack channel. Connect to Slack and configure the message posting.
- 1Add a 'Slack' node at the end
- 2Select 'Post Message' operation
- 3Connect your Slack workspace (you'll need to authorize N8n)
- 4Set Channel to {{ $node['Set'].json['channelName'] }}
- 5Set Text to {{ $node['Set'].json['slackMessage'] }}
- 6Enable 'Parse Mode' and select 'Markdown'
Workflow Canvas > Execute Workflow
Test the workflow
Run a test with sample data to verify all nodes execute correctly. Check that your Slack message formatting looks good.
- 1Click 'Execute Workflow' button
- 2Check that all nodes show green checkmarks
- 3Look for the test message in your Slack channel
- 4Verify deal details display correctly
- 5Test with a real deal stage change in HubSpot
Workflow Canvas > Activate Toggle
Activate the workflow
Turn on the workflow so it runs automatically when HubSpot sends webhook notifications. Set it to active mode.
- 1Click the 'Inactive' toggle in the top right
- 2Confirm activation in the popup
- 3Check that status changes to 'Active'
- 4Save the workflow one final time
Scaling Beyond 300+ deal stage changes/day+ Records
If your volume exceeds 300+ deal stage changes/day records, apply these adjustments.
Batch notifications by time window
Add a delay node to collect multiple stage changes and send digest messages every 15-30 minutes instead of instant notifications. This prevents Slack channel flooding during busy sales periods.
Use Slack threads for related deals
Store message timestamps in N8n's memory and reply in threads for deals from the same company or owner. This keeps the main channel cleaner when processing high volumes.
Add stage change filters
Only notify on meaningful stage progressions (qualified → negotiation → closed) and skip backwards movements or minor stage shuffles that don't need team attention.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use N8n for this if you need custom filtering logic or want to transform the deal data before sending to Slack. N8n's code nodes let you add complex conditions like 'only notify for deals over $10K' or format currency properly. You also get unlimited workflows on the self-hosted version. Pick Zapier instead if your team doesn't want to manage server infrastructure — their HubSpot integration handles authentication and field mapping more smoothly.
This workflow uses 4-5 executions per deal stage change (webhook + HubSpot deal fetch + owner lookup + Slack post). At 200 stage changes per month, that's 800-1000 executions. N8n's starter plan includes 5,000 executions for $20/month. Zapier would cost $30/month for the same volume and Make would be $21/month. N8n wins on price if you're self-hosting, but factor in server costs — a $5/month VPS makes this roughly equal to Make.
Zapier handles HubSpot's deal stage mapping automatically — you see friendly stage names, not internal IDs. Make has better built-in Slack formatting with rich message blocks and threading options. But N8n gives you real-time webhooks without polling delays and lets you add custom JavaScript for complex deal scoring or routing logic. The code flexibility matters more than the UI polish for most sales teams.
HubSpot's webhook payload doesn't include the old stage value, so you can't build 'moved from X to Y' messages without storing previous states. The dealstage property sometimes arrives as null during the brief moment between stage changes — add a 5-second delay node to let HubSpot's database sync. Deal owner IDs get scrambled if you have team reassignments happening frequently, causing messages to tag the wrong people.
Ideas for what to build next
- →Add deal close notifications — Extend this workflow to send special celebration messages when deals move to 'Closed Won' with team-wide mentions and deal metrics.
- →Create a deals dashboard webhook — Send deal stage data to Google Sheets or Airtable to build a real-time sales dashboard that tracks stage velocity and conversion rates.
- →Set up deal stall alerts — Build a separate workflow that monitors deal age and sends reminder notifications when deals stay in the same stage for too long without activity.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup