Intermediate~20 min setupCRM & CommunicationVerified April 2026
HubSpot logo
Slack logo

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-time

Use case type

notification

Real-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.

/mo
505005K50K

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

Skip the setup

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.

HubSpot Professional or Enterprise plan with API access
Slack workspace admin access to install apps and create webhooks
N8n instance accessible via public URL (not localhost)
HubSpot deals pipeline with defined stages already configured
Slack channel created where you want to receive notifications

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Deal Namedealname
Deal Amountamount
Deal Stagedealstage
Deal Ownerhubspot_owner_id
3 optional fields▸ show
Close Dateclosedate
Pipelinepipeline
Deal Typedealtype

Step-by-Step Setup

1

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.

  1. 1Click 'New Workflow' in your N8n dashboard
  2. 2Name it 'HubSpot Deal Stage Alerts'
  3. 3Click 'Save' to create the workflow
What you should see: You should see a blank workflow canvas with the workflow name at the top.
2

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.

  1. 1Click the '+' button on the canvas
  2. 2Search for 'Webhook' in the node list
  3. 3Select 'Webhook' as your trigger node
  4. 4Set HTTP Method to 'POST'
  5. 5Copy the webhook URL that appears
What you should see: You should see a webhook node with a unique URL displayed in the node parameters.
Common mistake — Don't use the HubSpot polling trigger — it checks every 15 minutes and you'll miss urgent deal changes.
n8n
+
click +
search apps
HubSpot
HU
HubSpot
Add HubSpot trigger node
HubSpot
HU
module added
3

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.

  1. 1Open HubSpot and go to Settings > Integrations > Private Apps
  2. 2Create a new private app or select existing one
  3. 3Add 'crm.objects.deals.read' and 'webhooks' scopes
  4. 4Go to Settings > Data Management > Properties
  5. 5Navigate to 'Webhooks' section and click 'Create subscription'
  6. 6Paste your N8n webhook URL
  7. 7Select 'Deal' as object type and 'dealstage' as the property to watch
What you should see: HubSpot should show 'Active' status for your webhook subscription with the N8n URL listed.
Common mistake — Make sure your N8n instance is publicly accessible — localhost URLs won't work for HubSpot webhooks.

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' }) }}
4

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.

  1. 1Click '+' after the webhook node
  2. 2Search for 'HubSpot' and select it
  3. 3Choose 'Get' operation and 'Deal' resource
  4. 4Set Deal ID to {{ $node['Webhook'].json['objectId'] }}
  5. 5In 'Additional Fields', add 'Properties to Return'
  6. 6Enter: dealname,amount,dealstage,hubspot_owner_id,closedate,pipeline
What you should see: The HubSpot node should show connection status and the properties list you specified.
Common mistake — Use the exact property names from HubSpot's API — 'dealname' not 'deal_name' or it'll return empty values.
5

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.

  1. 1Add another HubSpot node after the deal node
  2. 2Set operation to 'Get' and resource to 'Owner'
  3. 3Set Owner ID to {{ $node['HubSpot'].json['properties']['hubspot_owner_id'] }}
  4. 4In Additional Fields, select 'Properties to Return'
  5. 5Enter: email,firstName,lastName
What you should see: This node should display the owner's name and email when you execute a test.
6

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.

  1. 1Add a 'Switch' node after the owner lookup
  2. 2Set 'Mode' to 'Expression'
  3. 3Enter {{ $node['HubSpot'].json['properties']['dealstage'] }} as the value
  4. 4Add routing rules for each stage ID in your pipeline
  5. 5Map each stage ID to its readable name (e.g., 'qualifiedtobuy' → 'Qualified to Buy')
What you should see: The switch node should show multiple output branches, one for each deal stage in your pipeline.
Common mistake — Get your exact stage IDs from HubSpot Settings > Objects > Deals > Deal Properties > Deal Stage — the API uses IDs, not display names.
7

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.

  1. 1Add a 'Set' node after each switch output
  2. 2Click 'Add Value' and select 'String'
  3. 3Name it 'slackMessage'
  4. 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'] }}'
  5. 5Add another string value called 'channelName' with your target Slack channel
What you should see: The Set node should display your formatted message template with placeholders for deal data.
Common mistake — Use \n for line breaks in Slack messages — regular line breaks won't format correctly in the Slack API.
message template
🔔 New Update: {{firstname}} {{lastname}}
email: {{email}}
company: {{company}}
#sales
🔔 New Update: Jane Smith
Company: Acme Corp
8

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.

  1. 1Add a 'Slack' node at the end
  2. 2Select 'Post Message' operation
  3. 3Connect your Slack workspace (you'll need to authorize N8n)
  4. 4Set Channel to {{ $node['Set'].json['channelName'] }}
  5. 5Set Text to {{ $node['Set'].json['slackMessage'] }}
  6. 6Enable 'Parse Mode' and select 'Markdown'
What you should see: The Slack node should show 'Connected' status and your channel/message configuration.
9

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.

  1. 1Click 'Execute Workflow' button
  2. 2Check that all nodes show green checkmarks
  3. 3Look for the test message in your Slack channel
  4. 4Verify deal details display correctly
  5. 5Test with a real deal stage change in HubSpot
What you should see: All nodes should execute successfully and you should see a properly formatted message in Slack.
Common mistake — The first test might fail if HubSpot hasn't sent webhook data yet — use 'Execute Node' with sample data first.
n8n
▶ Run once
executed
HubSpot
Slack
Slack
🔔 notification
received
10

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.

  1. 1Click the 'Inactive' toggle in the top right
  2. 2Confirm activation in the popup
  3. 3Check that status changes to 'Active'
  4. 4Save the workflow one final time
What you should see: The workflow status should show 'Active' and the toggle should be switched on.
Common mistake — Don't activate until you've tested successfully — active workflows with errors will retry and consume execution credits.

Scaling Beyond 300+ deal stage changes/day+ Records

If your volume exceeds 300+ deal stage changes/day records, apply these adjustments.

1

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.

2

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.

3

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 notificationsExtend this workflow to send special celebration messages when deals move to 'Closed Won' with team-wide mentions and deal metrics.
  • Create a deals dashboard webhookSend 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 alertsBuild 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

Was this guide helpful?
HubSpot + Slack overviewn8n profile →