

How to Send Salesforce Stage Changes to Slack with N8n
Automatically DM deal owners in Slack when Salesforce opportunities move between stages with deal details.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Slack for Salesforce exists as a native integration, but it limited to record notifications without custom logic. This guide uses an automation platform for full control. View native option →
Best for
Teams that want custom SOQL queries and don't mind 5-minute notification delays
Not ideal for
Teams needing instant notifications or simple drag-and-drop setup without code
Sync type
pollingUse case type
notificationReal-World Example
A 25-person B2B software sales team uses this to notify deal owners immediately when opportunities move to 'Negotiation' or 'Closed-Won' stages in Salesforce. Before automation, sales reps manually checked pipeline reports twice daily and often missed stage changes from other team members. Now deal owners get Slack DMs within 5 minutes showing the new stage, deal value, and probability so they can take immediate action.
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 | ||
| Opportunity ID | Id | |
| Deal Name | Name | |
| Amount | Amount | |
| Stage Name | StageName | |
| Probability | Probability | |
| Close Date | CloseDate | |
| Owner Email | Owner.Email | |
Step-by-Step Setup
Workflows > New Workflow
Create new workflow
Start a fresh N8n workflow for the Salesforce to Slack integration. This workflow will poll Salesforce for stage changes and send notifications.
- 1Click 'New Workflow' from the N8n dashboard
- 2Click the gray '+' node to add your first step
- 3Name the workflow 'SF Stage Changes to Slack'
Node > Apps > Salesforce > Get Records
Add Salesforce trigger node
Configure N8n to poll Salesforce for opportunity updates. The polling trigger will check every 5 minutes for stage changes.
- 1Click the '+' node and search for 'Salesforce'
- 2Select 'Salesforce' from the apps list
- 3Choose 'Get Records' as the operation
- 4Set Resource to 'Opportunity'
Salesforce Node > Credentials > Create New
Connect Salesforce credentials
Link your Salesforce org to N8n using OAuth or username/password authentication. This enables the workflow to read opportunity data.
- 1Click 'Create New' next to Credentials
- 2Choose 'Salesforce OAuth2 API' for production orgs
- 3Enter your Salesforce domain (like yourcompany.my.salesforce.com)
- 4Click 'Connect my account' and authorize N8n
Salesforce Node > Options > Use Custom Query
Configure opportunity query
Set up a SOQL query to pull recently modified opportunities. This filters for records changed in the last 10 minutes to catch stage updates.
- 1Toggle 'Use custom query' to ON
- 2Paste this SOQL: SELECT Id, Name, Amount, Probability, CloseDate, StageName, OwnerId, LastModifiedDate FROM Opportunity WHERE LastModifiedDate >= LAST_N_MINUTES:10
- 3Click 'Execute Node' to test the query
Nodes > Logic > IF
Add stage change filter
Filter opportunities to only process those with actual stage changes. This prevents notifications for other field updates like amount or description.
- 1Add an 'IF' node after Salesforce
- 2Set Condition to 'String' and Field to '{{ $json.StageName }}'
- 3Operation should be 'Not Equal' with Value '{{ $json.PreviousStageName }}'
- 4Connect the 'true' output to continue the workflow
Nodes > Salesforce > Get Record by ID
Get opportunity owner details
Pull the deal owner's information from Salesforce to get their name and email. This data helps map to the correct Slack user.
- 1Add another Salesforce node after the IF filter
- 2Set Operation to 'Get Record by ID'
- 3Choose Resource as 'User'
- 4Set Record ID to '{{ $json.OwnerId }}'
Nodes > Slack > Credentials
Add Slack credentials
Connect N8n to your Slack workspace using a bot token. This allows sending direct messages to deal owners.
- 1Add a Slack node to the workflow
- 2Click 'Create New' for Slack credentials
- 3Enter your Slack bot token (starts with xoxb-)
- 4Test the connection
Slack Node > Get User by Email
Find Slack user by email
Match the Salesforce user's email to their Slack account. This ensures notifications reach the right person.
- 1Set Slack operation to 'Get User by Email'
- 2Map Email field to '{{ $node["Salesforce1"].json.Email }}'
- 3Execute to test user lookup
Slack Node > Send Direct Message
Format notification message
Build the Slack DM content with deal details formatted for readability. Include all key information the sales rep needs.
- 1Change Slack operation to 'Send Direct Message'
- 2Set User ID to '{{ $json.id }}' from the previous step
- 3Build message text with deal name, stage, amount, probability, and close date
- 4Use Slack formatting like *bold* for emphasis
Workflow > Settings > Active
Configure workflow polling
Set the workflow to run automatically every 5 minutes to catch stage changes quickly. This creates near real-time notifications.
- 1Click 'Settings' in the top workflow menu
- 2Toggle 'Active' to ON
- 3Set execution mode to 'Every 5 minutes'
- 4Save the workflow
Drop this into an n8n Code node.
Copy this templateAdd this to filter only important stage movements:▸ Show code
Add this to filter only important stage movements:
WHERE StageName IN ('Proposal', 'Negotiation', 'Closed Won', 'Closed Lost') AND LastModifiedDate >= LAST_N_MINUTES:10... expand to see full code
Add this to filter only important stage movements:
WHERE StageName IN ('Proposal', 'Negotiation', 'Closed Won', 'Closed Lost') AND LastModifiedDate >= LAST_N_MINUTES:10Scaling Beyond 200+ stage changes/day+ Records
If your volume exceeds 200+ stage changes/day records, apply these adjustments.
Increase polling interval
Move from 5-minute to 10-minute polling to reduce API calls. Add 'LIMIT 100' to your SOQL query to cap results per execution.
Batch notifications
Group multiple stage changes per user into a single Slack message instead of separate DMs for each opportunity. Use an aggregate node to collect changes by owner.
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 want full control over the SOQL query and message formatting without paying per execution. The polling approach works well for stage changes since they don't happen constantly, and you can customize exactly which fields to pull and how to format notifications. Skip N8n if you need instant notifications — the 5-minute polling delay means urgent stage changes aren't truly real-time. Zapier's webhook triggers fire immediately when configured properly.
This workflow uses 1 execution every 5 minutes, so 8,640 executions monthly. On N8n Cloud's Starter plan at $20/month, that's well under the 20,000 execution limit. The same automation costs $50/month on Zapier Professional (need multi-step zaps) and $29/month on Make Core. N8n saves you $9-30/month, but the real win is SOQL flexibility — other platforms force you to use basic field filters instead of custom queries.
Zapier handles the Salesforce-to-Slack user mapping better with built-in field matching that doesn't require the extra lookup step. Make's error handling is cleaner with automatic retries on API failures, while N8n makes you configure retry logic manually. But N8n wins on query control — you can pull related objects, aggregate data, or add complex filters that Zapier and Make can't handle through their UI-based field selectors.
Salesforce's API returns null for PreviousStageName unless you enable field history tracking on the StageName field first. Go to Setup > Object Manager > Opportunity > Fields > StageName > Set History Tracking to track this field. Also, inactive Salesforce users still own opportunities but might not exist in Slack anymore — add error handling to skip notifications for deactivated owners. The 5-minute polling creates a window where rapid stage changes might get missed if an opportunity moves through multiple stages quickly.
Ideas for what to build next
- →Add closed deal celebrations — Send a different message format with celebration emojis when opportunities move to 'Closed Won' stage instead of standard notifications.
- →Create pipeline change digest — Build a daily summary workflow that posts all stage changes to a sales channel showing team pipeline movement trends.
- →Log notifications to spreadsheet — Add a Google Sheets node to track all sent notifications for reporting on response times and stage change patterns.
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