Intermediate~15 min setupCRM & CommunicationVerified April 2026
Salesforce logo
Slack logo

How to Send Opportunity Stage Alerts to Slack with Power Automate

Automatically sends Slack DMs to deal owners when Salesforce opportunities change stages, including deal value and close date.

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

Sales teams using Salesforce who need instant deal stage notifications without checking the CRM constantly

Not ideal for

Teams wanting batch digest notifications or complex multi-stage approval workflows

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 25-person enterprise sales team uses this to instantly notify deal owners via Slack DM when opportunities move to Negotiation or Closed-Won stages. Before automation, reps discovered stage changes hours later during daily CRM reviews, missing time-sensitive follow-ups.

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 Power Automate

Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. 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.

Salesforce admin access to create API webhooks and view all opportunities
Slack workspace admin permissions to install the Power Automate app
Matching email addresses between Salesforce users and Slack members
Power Automate premium license for Salesforce premium connector

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Opportunity NameName
Stage NameStageName
AmountAmount
ProbabilityProbability
Close DateCloseDate
Owner NameOwner.Name
Owner EmailOwner.Email
1 optional field▸ show
Account NameAccount.Name

Step-by-Step Setup

1

My flows > + New flow > Automated cloud flow

Create automated cloud flow

Navigate to make.powerautomate.com and click 'My flows' in the left sidebar. Click the '+ New flow' button at the top of the page. Select 'Automated cloud flow' from the dropdown menu. Name your flow 'Opportunity Stage Alerts' and leave the trigger selection for the next step.

  1. 1Click 'My flows' in the left navigation
  2. 2Click the '+ New flow' button
  3. 3Select 'Automated cloud flow'
  4. 4Enter 'Opportunity Stage Alerts' as the flow name
  5. 5Click 'Create' without selecting a trigger
What you should see: You should see the flow designer with an empty canvas and a search box for selecting your first trigger.
2

Flow designer > Choose trigger > Salesforce

Add Salesforce trigger

In the trigger search box, type 'Salesforce' and select the Salesforce connector. Choose 'When a record is created, updated or deleted' as your trigger. This gives you the most control over which field changes fire the automation. You'll configure the specific conditions in the next step.

  1. 1Type 'Salesforce' in the search box
  2. 2Click on the Salesforce connector
  3. 3Select 'When a record is created, updated or deleted'
  4. 4Click 'Create' to add the trigger
What you should see: You should see a Salesforce trigger step with configuration fields for Environment, Object Name, and Condition.
Common mistake — Don't use the 'When a record is modified' trigger - it fires on every field change, not just stage updates.
Power Automate
+
click +
search apps
Salesforce
SA
Salesforce
Add Salesforce trigger
Salesforce
SA
module added
3

Salesforce trigger > Connection settings

Configure Salesforce connection

If this is your first Salesforce connection, click 'Sign in' and authenticate with your Salesforce credentials. Choose your Salesforce environment (Production or Sandbox). Set Object Name to 'Opportunity' from the dropdown. Leave the Condition field blank for now - you'll filter for stage changes using a condition step later.

  1. 1Click 'Sign in' to authenticate with Salesforce
  2. 2Select your environment (Production/Sandbox)
  3. 3Choose 'Opportunity' from Object Name dropdown
  4. 4Leave Condition field empty
  5. 5Click outside the step to save
What you should see: The trigger should show 'Connected' status and display available Opportunity fields in the dynamic content panel.
Common mistake — Make sure you're connecting to the right Salesforce environment - Production vs Sandbox connections aren't interchangeable.
4

Flow designer > + New step > Condition

Add stage change condition

Click '+ New step' below the trigger. Search for and select the 'Condition' control. You need to filter for only stage changes, not every opportunity update. In the left side of the condition, select 'StageName' from the Salesforce dynamic content. Set the operator to 'is not equal to' and leave the right side empty for now.

  1. 1Click '+ New step' below the Salesforce trigger
  2. 2Search for 'Condition' in the actions list
  3. 3Select the Condition control
  4. 4Click in the left condition box
  5. 5Select 'StageName' from dynamic content
What you should see: You should see a condition step with StageName selected on the left side and two branches (Yes/No) below it.
Common mistake — Don't try to compare against specific stage names here - different Salesforce orgs use different stage naming conventions.
Salesforce
SA
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Slack
SL
notified
5

Condition Yes branch > + Add an action > Salesforce > Get record by Id

Get opportunity owner details

In the 'Yes' branch of the condition (when stage changed), add a new action. Search for 'Salesforce' and select 'Get record by Id'. Set Object Type to 'User' and Record Id to the 'OwnerId' field from the opportunity trigger. This lookup gets the owner's name and email for the Slack message.

  1. 1Click '+ Add an action' in the Yes branch
  2. 2Search for and select Salesforce connector
  3. 3Choose 'Get record by Id' action
  4. 4Set Object Type to 'User'
  5. 5Set Record Id to 'OwnerId' from dynamic content
What you should see: The Get record action should show User fields like Name, Email, and Username in the dynamic content panel.
Common mistake — If OwnerId is empty on some opportunities, add a condition to check it exists before this step.
6

Get record > + Add an action > Slack > Get user by email

Find Slack user by email

Add another action and search for 'Slack'. Select 'Get user by email' to match the Salesforce owner with their Slack account. If you haven't connected Slack yet, you'll need to authenticate. Set the Email field to the Email from the User record you just retrieved. This ensures DMs go to the right person.

  1. 1Click '+ Add an action' below Get record
  2. 2Search for 'Slack' and select the connector
  3. 3Choose 'Get user by email' action
  4. 4Authenticate with Slack if prompted
  5. 5Set Email to the Email field from the User record
What you should see: You should see Slack user details like User ID, Display Name, and Time Zone in the dynamic content.
Common mistake — This fails if the Salesforce user email doesn't match their Slack email exactly - consider adding error handling.
7

Get user > + Add an action > Slack > Post message

Send Slack DM

Add a final Slack action and select 'Post message'. Set Channel to the User ID from the previous step (this creates a DM). Compose your message using dynamic content from the opportunity. Include the opportunity name, new stage, amount, probability percentage, and expected close date for a complete notification.

  1. 1Click '+ Add an action' below Get user by email
  2. 2Select Slack connector again
  3. 3Choose 'Post message' action
  4. 4Set Channel to the User ID from Get user step
  5. 5Compose message with opportunity details
What you should see: You should see a message preview with all the dynamic content properly inserted from Salesforce fields.
Common mistake — Using User ID as channel creates DMs - don't use username or display name here.
8

Flow designer > Save > Test in Salesforce

Test the flow

Click 'Save' in the top right to save your flow. Go to your Salesforce org and change an opportunity's stage to trigger the automation. The flow should fire within 30 seconds and send a DM to the opportunity owner. Check the flow run history in Power Automate to see if it succeeded or failed.

  1. 1Click 'Save' in the top toolbar
  2. 2Navigate to your Salesforce org
  3. 3Open any opportunity record
  4. 4Change the Stage field to a different value
  5. 5Save the opportunity record
What you should see: The opportunity owner should receive a Slack DM within 30 seconds, and the flow run should show as Succeeded in Power Automate.
Common mistake — Webhook delays can occasionally reach 2-3 minutes during high API usage periods.

Add this expression in the Slack message text box to format currency properly and handle null amounts gracefully.

JavaScript — Code Stepif(empty(triggerOutputs()?['body/Amount']),
▸ Show code
if(empty(triggerOutputs()?['body/Amount']), 
  'Amount not set', 
  concat('$', formatNumber(triggerOutputs()?['body/Amount'], '0,0'))

... expand to see full code

if(empty(triggerOutputs()?['body/Amount']), 
  'Amount not set', 
  concat('$', formatNumber(triggerOutputs()?['body/Amount'], '0,0'))
)

concat(
  '🎯 Deal Update: ', triggerOutputs()?['body/Name'], 
  ' moved to ', triggerOutputs()?['body/StageName'], '\n',
  '💰 Value: ', if(empty(triggerOutputs()?['body/Amount']), 'Not set', concat('$', formatNumber(triggerOutputs()?['body/Amount'], '0,0'))),
  ' (', triggerOutputs()?['body/Probability'], '% probability)\n',
  '📅 Expected close: ', formatDateTime(triggerOutputs()?['body/CloseDate'], 'MMM dd, yyyy'), '\n',
  '🏢 Account: ', body('Get_record')?['Account']?['Name']
)
Power Automate
▶ Test flow
executed
Salesforce
Slack
Slack
🔔 notification
received

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 Power Automate for this if you're already deep in the Microsoft ecosystem and need Salesforce webhook reliability without coding. The Salesforce premium connector handles webhook registration automatically, and you get proper error retry logic built-in. Skip this for Make if you need complex conditional formatting - Make's formula system runs circles around Power Automate's expression builder.

Cost

Real math: Each stage change costs 2 Power Automate runs (Salesforce trigger + Slack action). At 200 stage changes per month, that's 400 runs monthly. With the base plan including 2,000 runs, you're covered. Zapier costs $30/month for the same volume while Power Automate starts at $15/month with Office 365.

Tradeoffs

Make wins on message customization with better text formatting functions and conditional logic blocks. Zapier's Salesforce integration handles duplicate webhook prevention better than Power Automate. n8n gives you full JavaScript control over message templates and error handling. Pipedream's built-in Slack SDK makes user lookups more reliable. But Power Automate's Salesforce webhook setup requires zero technical configuration - it just works.

You'll hit webhook delivery delays during Salesforce maintenance windows, usually Tuesday nights. Power Automate doesn't dedupe multiple rapid stage changes like Make does, so busy reps get notification spam. The Slack user lookup fails silently if emails don't match exactly - add explicit error handling or your flow stops working for mismatched users.

Ideas for what to build next

  • Add digest mode for busy sales managersCreate a separate scheduled flow that sends daily summaries of all stage changes to sales leadership via a dedicated Slack channel.
  • Include next action recommendationsEnhance messages with stage-specific next steps pulled from Salesforce playbooks or custom fields to guide rep behavior.
  • Sync stage changes back to project managementExtend the flow to update related Asana or Monday.com project status when deals reach specific stages like Closed-Won.

Related guides

Was this guide helpful?
Salesforce + Slack overviewPower Automate profile →