Intermediate~15 min setupCommunication & CRMVerified April 2026
Slack logo
Close logo

How to Send Close Deal Alerts to Slack with Power Automate

Triggers a Slack message to your sales channel the moment a deal in Close changes stage or crosses a value threshold, using a Close webhook and Power Automate to format and route the alert.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Inside sales teams already in the Microsoft 365 ecosystem who want deal-stage alerts in Slack without buying another automation tool.

Not ideal for

Teams not on Microsoft 365 — Make runs the same flow for free under 1,000 ops/month and has a native Close trigger.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person SaaS sales team runs all pipeline management in Close and communicates in Slack. Before this flow, reps refreshed the Close pipeline view manually and big wins sat unannounced for hours. Now, every deal moved to 'Won' or above $25,000 posts immediately to #deals with the rep name, company, and value — the team sees it before the rep even sends a message.

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.

Close admin access with permission to create and manage webhooks under Settings > Integrations
Slack account with permission to post in the target channel and authorize third-party app connections via OAuth
Microsoft 365 account with Power Automate access — the free Power Automate plan supports HTTP triggers and Slack connector
Close API familiarity: understand that opportunities (deals) live inside leads, and 'lead.updated' is the webhook event that captures opportunity stage changes
Know the exact Slack channel name (e.g. #deals) and confirm the authenticating Slack user is a member of that channel

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Lead Namelead_name
Opportunity Status Labelopportunity_status_label
Opportunity Valuevalue
Assigned User Nameassigned_to_name
4 optional fields▸ show
Opportunity IDopportunity_id
Lead IDlead_id
Date Updateddate_updated
Pipeline Namepipeline_name

Step-by-Step Setup

1

make.powerautomate.com > My flows > + New flow > Automated cloud flow

Create a new Automated cloud flow in Power Automate

Go to make.powerautomate.com and sign in with your Microsoft 365 account. In the left sidebar, click 'My flows', then click '+ New flow' in the top bar. Select 'Automated cloud flow' from the dropdown — this is the correct flow type because Close will push events to Power Automate via webhook, not the other way around. Give the flow a name like 'Close Deal Alert to Slack'. In the trigger search box that appears, type 'HTTP' and select 'When a HTTP request is received' from the results.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top of the page
  3. 3Select 'Automated cloud flow'
  4. 4Name the flow 'Close Deal Alert to Slack'
  5. 5Search 'HTTP' in the trigger picker and select 'When a HTTP request is received'
What you should see: You should see a blank flow canvas with the 'When a HTTP request is received' trigger card at the top, showing a greyed-out HTTP POST URL field that will populate after you save.
Common mistake — Do NOT select 'Instant cloud flow' or 'Scheduled cloud flow'. Instant requires manual trigger; Scheduled uses polling. You need Automated with the HTTP trigger for real-time webhook delivery.
2

Flow canvas > When a HTTP request is received > Request Body JSON Schema

Configure the HTTP trigger and copy the webhook URL

Click the 'When a HTTP request is received' trigger card to expand it. In the 'Request Body JSON Schema' field, paste the JSON schema so Power Automate can parse Close's payload automatically — this unlocks dynamic content tokens for later steps. Leave the method as POST. Click 'Save' at the top right of the flow. After saving, the 'HTTP POST URL' field will populate with a unique URL — copy this URL now, you'll need it in Close.

  1. 1Click the trigger card to expand it
  2. 2Paste the Close deal webhook JSON schema into 'Request Body JSON Schema'
  3. 3Leave HTTP method as POST
  4. 4Click 'Save' in the top-right corner
  5. 5Copy the generated HTTP POST URL
What you should see: After saving, the HTTP POST URL field shows a long URL starting with 'https://prod-'. This is your webhook endpoint. Copy it before navigating away.
Common mistake — The HTTP POST URL only appears after the first save. If you paste the schema after the URL appears, save again — the schema changes don't affect the URL, but you need it parsed correctly before building later steps.
Power Automate
+
click +
search apps
Slack
SL
Slack
Configure the HTTP trigger a…
Slack
SL
module added
3

Close > Settings > Integrations > Webhooks > Add Webhook

Register the webhook URL in Close

Open Close in a new tab and go to Settings > Integrations > Webhooks. Click 'Add Webhook'. Paste the Power Automate HTTP POST URL into the 'Endpoint URL' field. Under 'Events', check 'lead.updated' — this fires when a deal (opportunity) on a lead changes stage or value. Optionally add a signing secret, but Power Automate's HTTP trigger does not natively verify HMAC signatures without extra steps, so leave it blank for now unless you plan to add signature verification later.

  1. 1In Close, navigate to Settings > Integrations > Webhooks
  2. 2Click 'Add Webhook'
  3. 3Paste the Power Automate HTTP POST URL into 'Endpoint URL'
  4. 4Check the 'lead.updated' event
  5. 5Click 'Save'
What you should see: The webhook appears in your Close webhook list with a green status indicator and the endpoint URL visible. Close will now POST a JSON payload to Power Automate every time a lead (and its associated opportunities) is updated.
Common mistake — Close fires 'lead.updated' for ALL lead field changes, not just deal stage changes. You must add a condition in Power Automate (Step 5) to filter only relevant opportunity changes, or you'll flood Slack with irrelevant alerts.
4

Flow canvas > + New step > Data Operation > Parse JSON

Add a Parse JSON action to extract deal fields

Back in Power Automate, click '+ New step' below the trigger card. Search for 'Parse JSON' and select the 'Data Operation – Parse JSON' action. In the 'Content' field, click inside it, then select 'Body' from the dynamic content panel on the right — this is the raw webhook payload from Close. In the 'Schema' field, paste a schema that includes the fields you care about: opportunity status, value, lead name, assigned user, and pipeline. This step converts the raw JSON string into usable dynamic tokens.

  1. 1Click '+ New step'
  2. 2Search 'Parse JSON' and select 'Data Operation – Parse JSON'
  3. 3Click in the 'Content' field and select 'Body' from dynamic content
  4. 4Paste the Close webhook schema into the 'Schema' field
  5. 5Click 'Save'
What you should see: After saving, the Parse JSON card shows 'Body' in the Content field. When you click into a later step's dynamic content panel, you'll see individual fields like 'opportunity_status_label', 'lead_name', and 'value_formatted' listed under 'Parse JSON'.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
5

Flow canvas > + New step > Condition

Add a Condition to filter deal-stage and value changes

Click '+ New step' and search for 'Condition'. Add a Condition action. In the left field of the condition, select 'opportunity_status_label' from the Parse JSON dynamic content. Set the operator to 'is not equal to' and the right field to an empty string — this ensures you only proceed when an opportunity status is actually present in the payload. For a value filter, click 'Add' > 'Add row' and add a second condition: 'value' is 'greater than or equal to' your threshold, e.g. 25000. Set the group to 'OR' if you want either condition to trigger the alert.

  1. 1Click '+ New step' and search 'Condition'
  2. 2In the left field, select 'opportunity_status_label' from dynamic content
  3. 3Set operator to 'is not equal to' and right field to empty string
  4. 4Click 'Add' > 'Add row' for a second condition
  5. 5Set second condition: 'value' greater than or equal to 25000
  6. 6Set group logic to 'OR'
What you should see: The Condition card shows two rows connected by 'OR', with a 'Yes' branch and 'No' branch below. All subsequent Slack actions go inside the 'Yes' branch.
Common mistake — The 'No' branch should remain empty unless you want a fallback action. Do not add a Terminate action in the 'No' branch — Power Automate treats an empty 'No' branch as a clean exit, which is correct behavior here.
Slack
SL
trigger
filter
Deal Stage
matches criteria?
yes — passes through
no — skipped
Close
CL
notified
6

Flow canvas > Yes branch > + Add an action > Slack > Post message

Connect your Slack account as a Connection

Inside the 'Yes' branch, click '+ Add an action'. Search for 'Slack' in the action picker. Select 'Post message' from the Slack connector results. A sign-in prompt will appear inline. Click 'Sign in' and authenticate with the Slack account that has permission to post in your target channel. Power Automate stores this as a named Connection. If your workspace requires admin approval for third-party apps, get that done before this step — otherwise the OAuth flow will fail silently.

  1. 1Click '+ Add an action' inside the 'Yes' branch
  2. 2Search 'Slack' in the action picker
  3. 3Select 'Post message (V2)' from the results
  4. 4Click 'Sign in' in the connection prompt
  5. 5Complete the Slack OAuth flow and return to Power Automate
What you should see: The Slack action card shows your Slack workspace name in the connection field with a checkmark. The 'Channel' and 'Message Text' fields become editable.
Common mistake — Power Automate's Slack connector posts as the authenticated user, not as a bot. If you want messages from a bot account (e.g., 'DealBot'), create a Slack app with a bot token and use the HTTP action to call the Slack API directly instead of this connector.
Power Automate settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Power Automate
popup window
Connected
green checkmark
7

Flow canvas > Yes branch > Slack: Post message > Channel + Message Text

Configure the Slack message with Close deal fields

In the 'Channel' field, type the channel name exactly as it appears in Slack, e.g. '#deals' or '#sales-wins'. In the 'Message Text' field, build your alert using dynamic content tokens from the Parse JSON step. A clear message format tells the team everything they need: who owns the deal, what company, what stage, and what value. Click into the field and mix static text with dynamic tokens — for example: '🏆 Deal Update: [lead_name] moved to [opportunity_status_label] | Value: $[value] | Owner: [assigned_to_name]'.

  1. 1Type the target channel name in the 'Channel' field (e.g. #deals)
  2. 2Click into the 'Message Text' field
  3. 3Type your static label text (e.g. '🏆 Deal Update:')
  4. 4Click 'Add dynamic content' and insert 'lead_name' from Parse JSON
  5. 5Continue building the message with 'opportunity_status_label', 'value', and 'assigned_to_name'
What you should see: The Message Text field shows a mix of static text and blue dynamic content tokens. The preview in the field looks like: '🏆 Deal Update: [lead_name] moved to [opportunity_status_label] | Value: $[value] | Owner: [assigned_to_name]'.
Common mistake — The 'value' field from Close comes through as a raw integer in cents (e.g. 2500000 = $25,000). Wrap it in the expression formatNumber(div(triggerBody()?['value'], 100), 'C2', 'en-US') to display it as currency, otherwise your Slack message will show '2500000'.
8

Flow canvas > Yes branch > Slack: Post message > Message Text > Expression editor

Add an expression to format deal value as currency

Click into the 'Message Text' field where you placed the value token. Delete the raw 'value' token. Click 'Expression' tab in the dynamic content panel instead of 'Dynamic content'. Type the expression: formatNumber(div(float(outputs('Parse_JSON')?['body/value']), 100), 'C2', 'en-US'). Click OK. This converts the raw integer from Close into a formatted dollar string like '$25,000.00'. If Close sends value already as a decimal float (depends on your Close plan's API response), use formatNumber(float(outputs('Parse_JSON')?['body/value']), 'C2', 'en-US') instead.

  1. 1Click inside the Message Text field where the value token sits
  2. 2Delete the raw 'value' dynamic content token
  3. 3Click the 'Expression' tab in the dynamic content panel
  4. 4Type: formatNumber(div(float(outputs('Parse_JSON')?['body/value']), 100), 'C2', 'en-US')
  5. 5Click 'OK' to insert the expression
What you should see: The Message Text field now shows a purple expression token (not blue) where the value was. When a test run fires, the Slack message will display '$25,000.00' instead of '2500000'.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
9

make.powerautomate.com > My flows > [Flow name] > Run history

Test the flow with a live deal change in Close

Save the flow by clicking 'Save' in the top right. In Close, open any active lead with an opportunity and manually move the opportunity to a new stage (e.g., drag it to 'Won'). Return to Power Automate, click 'My flows', find your flow, and click the flow name to open its detail page. Scroll to 'Run history' at the bottom. You should see a run appear within 5-15 seconds of the stage change. Click the run to inspect each action — green checkmarks mean success, red X means a step failed.

  1. 1Save the flow
  2. 2In Close, open a lead and change an opportunity stage
  3. 3Return to Power Automate and open the flow detail page
  4. 4Scroll to 'Run history' and wait up to 15 seconds for a new entry
  5. 5Click the run entry and inspect each step for green checkmarks
What you should see: The run history shows a completed run with all steps green. In Slack, the #deals channel shows a new message with the correct lead name, stage, formatted value, and assigned rep name.
Common mistake — If the Condition step takes the 'No' path during your test, the Slack message won't appear. Open the run detail, click the Condition card, and check which values were evaluated — your test opportunity may not have met the filter criteria you set.
Power Automate
▶ Test flow
executed
Slack
Close
Close
🔔 notification
received
10

make.powerautomate.com > My flows > [Flow name] > (three-dot menu) > Edit

Turn on the flow and set error notifications

If the test passed, the flow is already live — Power Automate flows start running as soon as they are saved and enabled. Confirm the flow status shows 'On' on the flow detail page (toggle is in the top right). To catch failures silently, go to the flow detail page, click the three-dot menu next to your flow in 'My flows', and select 'Edit'. Add a Scope action around your steps and use 'Configure run after' on a final notification step set to run only on failure — this sends you an email if the Slack post fails.

  1. 1Confirm the flow status toggle shows 'On' on the detail page
  2. 2Go to My flows, click the three-dot menu on your flow
  3. 3Select 'Edit'
  4. 4Add a 'Send an email' action after the Slack step
  5. 5Click 'Configure run after' on the email action and check 'has failed' only
What you should see: The flow detail page shows status 'On'. The email failure notification step appears in the canvas with a red dashed border (indicating it runs only on failure). You'll now receive an email if Slack posting breaks.

Paste this into a 'Compose' action immediately after Parse JSON. It builds a formatted Slack Block Kit message payload as a JSON string, replacing the plain-text message with a structured card that includes a header, deal details in two columns, and a clickable 'View in Close' button. Add a second Compose action referencing the output of this one, then use 'Send an HTTP request to Slack' with the Slack API's chat.postMessage endpoint — pass your bot token in the header and the output of this Compose as the 'blocks' body parameter.

JavaScript — Code Step{
▸ Show code
{
  "blocks": [
    {

... expand to see full code

{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "@{if(equals(outputs('Parse_JSON')?['body/opportunity_status_label'], 'Won'), '🏆 Deal Won!', '📋 Deal Update')}"
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*Company*\n@{outputs('Parse_JSON')?['body/lead_name']}"
        },
        {
          "type": "mrkdwn",
          "text": "*Stage*\n@{outputs('Parse_JSON')?['body/opportunity_status_label']}"
        },
        {
          "type": "mrkdwn",
          "text": "*Value*\n@{formatNumber(div(float(outputs('Parse_JSON')?['body/value']), 100), 'C2', 'en-US')}"
        },
        {
          "type": "mrkdwn",
          "text": "*Owner*\n@{outputs('Parse_JSON')?['body/assigned_to_name']}"
        }
      ]
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "View in Close"
          },
          "url": "https://app.close.com/lead/@{outputs('Parse_JSON')?['body/lead_id']}/"
        }
      ]
    }
  ]
}

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 your team already runs on Microsoft 365 and you want one less tool to pay for. The HTTP trigger in Power Automate handles webhook ingestion natively, the Slack connector is built-in, and you can use Power Fx expressions to format currency and build conditional messages without writing code. The one scenario where you'd pick something else: if your team uses Google Workspace instead of Microsoft 365, Power Automate requires a standalone license and the value proposition disappears — use Make instead.

Cost

Cost math: Power Automate's free plan includes 750 flow runs per month. Each Close webhook event = 1 run. A 10-person sales team moving 3-5 deals per day generates roughly 20-35 runs/day, or 600-1,050 runs/month. You'll hit the free cap on a busy month. The Power Automate per-user plan costs $15/month and gives you 5,000 runs — enough for any realistic sales team. Make's free tier gives you 1,000 operations/month and the same flow costs 2-3 operations per run, so Make handles moderate volume free where Power Automate charges $15/month.

Tradeoffs

Make beats Power Automate here on trigger reliability — Make has a native Close module with a 'New/Updated Opportunity' trigger that doesn't require webhook setup on your end. Zapier also has a Close integration with a 'New Opportunity' trigger, but Zapier polls every 15 minutes on lower plans, which kills the 'real-time' promise. n8n gives you a webhook trigger and full JavaScript for message formatting, better than Power Automate's expression syntax for complex logic, but requires self-hosting or n8n Cloud at $20/month. Pipedream has a Close webhook source and a Slack action with Block Kit support out of the box, and it's free up to 10,000 invocations/month — cheapest option for high-volume teams. Power Automate still wins for Microsoft shops: the SSO, the Connections model, and the integration with Teams/SharePoint for logging wins make it the right default.

Three things you'll hit after setup: First, the Close 'lead.updated' webhook fires for everything — email address changes, custom field updates, note additions. Without a tight Condition filter on 'opportunity_status_label' and 'changed_fields', your #deals channel will be unreadable within a week. Second, the 'value' field arrives as an integer in cents (4750000 = $47,500), not a decimal. Every team that skips the formatNumber expression ends up with a confused sales floor. Third, Power Automate's Slack connector posts as the authenticated user, not a bot — if that person's Slack account is deactivated or they leave the company, the flow silently fails. Pin the connection to a service account or use the HTTP + Slack API approach with a bot token to avoid this breaking at the worst possible time.

Ideas for what to build next

  • Route alerts to different channels by deal sizeAdd a Switch action after the Condition to post $100k+ deals to #enterprise-wins, $10k-$99k to #deals, and sub-$10k to #small-biz. Takes 10 minutes to configure and keeps channel noise low.
  • Add a daily digest of pipeline movementBuild a second Scheduled flow in Power Automate that queries the Close API every morning at 8am, aggregates all deals that changed stage in the last 24 hours, and posts a summary table to Slack — this pairs with real-time alerts so the team has both instant and daily context.
  • Write closed-won deals back to a SharePoint listExtend the Yes branch with a 'Create item' action pointing to a SharePoint list — log deal name, value, rep, and close date for quarterly reporting without manual data entry. Power Automate's SharePoint connector is native and free.

Related guides

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