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

How to Share Close Prospects to Slack with Power Automate

When a Close opportunity reaches a target stage, Power Automate fires a webhook, pulls deal and contact details, and posts a formatted research brief to a Slack channel so the team can comment before the call.

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 of 5-20 reps who already live in Microsoft 365 and want pre-call research threads in Slack without leaving their existing tools.

Not ideal for

Teams that need two-way sync — replies in Slack should write back to Close — because that requires a second flow and custom middleware.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person SaaS sales team uses this to post a research brief to #prospect-research every time a Close deal moves to 'Demo Scheduled.' The brief includes company name, ARR opportunity size, conversation history summary, and a direct link back to the Close lead. Before this flow, reps Slacked deal details manually — copy-pasting from Close — which took 4-5 minutes per deal and often skipped conversation history entirely.

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 API key with read access to leads and opportunities — generate one under Close > Settings > API Keys
Slack workspace admin rights or permission to install third-party apps — needed to authorize the Power Automate Slack connector
Power Automate account with a Microsoft 365 or standalone Power Automate license that includes premium connectors — the HTTP connector requires a paid plan
A Slack channel created and ready for prospect research posts — note the exact channel name including the # prefix
At least one Close opportunity in your target pipeline stage to use as test data during setup

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Lead Name (Company)display_name
Opportunity Valuevalue
Opportunity Status Labelstatus_label
Close Lead URLurl
Primary Contact Namecontacts[0].name
5 optional fields▸ show
Primary Contact Emailcontacts[0].emails[0].email
Primary Contact Phonecontacts[0].phones[0].phone
Opportunity Notenote
Assigned User IDuser_id
Expected Close Datedate_won

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. In the left sidebar click 'My flows', then click '+ New flow' at the top and select 'Automated cloud flow' from the dropdown. Name the flow something like 'Close → Slack Prospect Research'. For the trigger, type 'HTTP' in the search box and select 'When a HTTP request is received' — this gives you a webhook URL that Close will call. Click Create.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' and select 'Automated cloud flow'
  3. 3Name the flow 'Close → Slack Prospect Research'
  4. 4Search 'HTTP' in the trigger picker and select 'When a HTTP request is received'
  5. 5Click 'Create'
What you should see: You should see the flow canvas open with a single trigger card labeled 'When a HTTP request is received'. The POST URL field will be empty until you save the flow for the first time.
Common mistake — Do not close the canvas before saving at least once. Power Automate only generates the webhook POST URL after the first save — if you navigate away before saving, you'll need to recreate the trigger step.
2

Flow canvas > Trigger card > HTTP POST URL

Save the flow to generate the webhook URL

Click 'Save' in the top right of the canvas. Power Automate will generate a unique POST URL in the trigger card. Click the trigger card to expand it and copy the full URL — it will look like https://prod-xx.westus.logic.azure.com:443/workflows/.... Keep this tab open; you need this URL in the next step when configuring Close.

  1. 1Click 'Save' in the top right corner
  2. 2Click the 'When a HTTP request is received' trigger card to expand it
  3. 3Copy the full 'HTTP POST URL' value
What you should see: The trigger card now shows a populated HTTP POST URL field. The URL is long and includes a 'sig' parameter at the end — that's the shared access signature used for security.
Common mistake — This URL contains the shared access signature in plain text. Anyone with this URL can trigger your flow. Store it in a secret manager or Azure Key Vault, not in a shared doc or Slack message.
3

Close > Settings > Integrations > Webhooks > Add Webhook

Configure a Close webhook to call Power Automate

In Close, go to Settings > Integrations > Webhooks and click 'Add Webhook'. Paste the Power Automate POST URL into the URL field. Under 'Events', select 'lead.updated' and 'opportunity.updated' — both fire when a deal's status changes. Set the 'Status' filter if you want to trigger only on specific opportunity statuses like 'Active' or a custom stage name. Click Save.

  1. 1In Close, click 'Settings' in the bottom left
  2. 2Click 'Integrations', then 'Webhooks'
  3. 3Click 'Add Webhook'
  4. 4Paste the Power Automate POST URL into the URL field
  5. 5Select 'opportunity.updated' as the event type and click Save
What you should see: The webhook appears in your Close webhook list with a green Active badge. Close will immediately send a test ping to the URL — check Power Automate's 'Run history' to confirm it received the request.
Common mistake — Close sends webhook payloads for ALL opportunity updates, including minor field edits. If you only want to fire on status changes (e.g., when a deal reaches 'Demo Scheduled'), you must add a condition in Power Automate in Step 5 — otherwise your Slack channel will flood with noise.
4

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

Define the JSON schema so Power Automate parses the Close payload

Back in Power Automate, click '+ New step' and search for 'Parse JSON'. Select the 'Parse JSON' action under 'Data Operation'. In the 'Content' field, click inside and select 'Body' from the dynamic content panel — this is the raw JSON Close sent. For the Schema, click 'Generate from sample', paste in a real Close webhook payload, and click Done. Power Automate will generate the schema automatically.

  1. 1Click '+ New step' below the trigger
  2. 2Search 'Parse JSON' and select it under 'Data Operation'
  3. 3In the 'Content' field, select 'Body' from dynamic content
  4. 4Click 'Generate from sample'
  5. 5Paste a real Close opportunity.updated webhook payload and click Done
What you should see: The Schema field populates with a JSON schema definition. You should now see Close fields like 'data.id', 'data.status_label', 'data.value', and 'data.lead_id' available as dynamic content tokens in subsequent steps.
Common mistake — If you generate the schema from a test ping instead of a real opportunity.updated event, the schema will be missing most deal fields. Trigger a real status change in Close first, copy that payload from the Run history, then generate the schema from it.
5

Flow canvas > + New step > Control > Condition

Add a condition to filter for your target deal stage

Click '+ New step' and search 'Condition'. Add a Condition action. In the left field, select the 'status_label' token from the Parse JSON output. Set the operator to 'is equal to'. In the right field, type the exact stage name you care about — for example, 'Demo Scheduled'. Everything in the 'Yes' branch will run only when a deal enters that stage. Leave the 'No' branch empty.

  1. 1Click '+ New step' and search 'Condition' under Control
  2. 2In the left value field, select 'status_label' from the Parse JSON dynamic content
  3. 3Set the middle dropdown to 'is equal to'
  4. 4Type your exact stage name in the right field (e.g., 'Demo Scheduled')
  5. 5Leave the 'No' branch empty — it terminates silently
What you should see: The canvas shows a branching condition card with a 'Yes' path and a 'No' path. All remaining steps will be added inside the 'Yes' branch only.
Common mistake — Stage name matching is case-sensitive in this expression. 'Demo Scheduled' and 'demo scheduled' are treated as different values. Check your Close pipeline stage names exactly under Close > Settings > Pipelines.
Slack
SL
trigger
filter
Deal Stage
matches criteria?
yes — passes through
no — skipped
Close
CL
notified
6

Flow canvas > Yes branch > Add an action > HTTP

Fetch full lead details from Close via HTTP action

Inside the 'Yes' branch, click 'Add an action'. Search 'HTTP' and select the 'HTTP' action (not the trigger). Set Method to GET. For the URI, use the expression: concat('https://api.close.com/api/v1/lead/', body('Parse_JSON')?['data']?['lead_id']). In Headers, add 'Authorization' with value 'Basic ' followed by your Base64-encoded Close API key. This call returns the full lead record including company name, contacts, and custom fields.

  1. 1Inside the Yes branch, click 'Add an action'
  2. 2Search 'HTTP' and select the HTTP action
  3. 3Set Method to 'GET'
  4. 4Set URI to: concat('https://api.close.com/api/v1/lead/', body('Parse_JSON')?['data']?['lead_id'])
  5. 5Add Authorization header: 'Basic ' + your Base64-encoded API key
What you should see: When you test the flow, this step returns a 200 status and the Body contains the full Close lead JSON, including the 'display_name', 'contacts', 'custom', and 'url' fields.
Common mistake — Close uses HTTP Basic Auth with your API key as the username and an empty password. The Base64 encoding format is Base64('your_api_key:'). Missing the trailing colon is the most common auth failure here.
7

Flow canvas > Yes branch > Add an action > Data Operation > Parse JSON

Parse the lead response and extract contact details

Add another 'Parse JSON' action after the HTTP step. Set Content to 'Body' from the HTTP action's output. Generate a new schema from a real lead API response — you can get one by calling https://api.close.com/api/v1/lead/{id} in Postman with your API key. This unlocks tokens like 'display_name', 'contacts[0].emails[0].email', 'contacts[0].name', and any custom fields you've added to the lead.

  1. 1Click 'Add an action' below the HTTP step
  2. 2Search 'Parse JSON' and select it
  3. 3Set Content to 'Body' from the previous HTTP action
  4. 4Click 'Generate from sample' and paste a real Close lead API response
  5. 5Click Done
What you should see: A second Parse JSON card appears with a populated schema. You should now see lead-level tokens like 'display_name', 'contacts', 'url', and any custom field keys available in the dynamic content panel.
8

Flow canvas > Yes branch > Add an action > Slack > Post message (V2)

Connect to Slack via a new Connection

Click 'Add an action' and search 'Slack'. Select 'Post message (V2)' from the Slack connector. If you haven't connected Slack before, Power Automate will prompt you to sign in — click 'Sign in' and authorize the Power Automate app in your Slack workspace. Make sure you authorize it for the correct workspace if you're in multiple. The connection is saved in Connections in the left sidebar for reuse.

  1. 1Click 'Add an action' and search 'Slack'
  2. 2Select 'Post message (V2)'
  3. 3Click 'Sign in' to create a new Slack Connection
  4. 4Authorize the Power Automate app in your Slack workspace
  5. 5Return to the flow canvas — the connection will be pre-selected
What you should see: The Slack action card shows your workspace name next to a green dot, confirming the connection is active. The 'Channel' and 'Text' fields are now available for configuration.
Common mistake — The 'Post message (V2)' connector posts as the Power Automate bot, not as a named user. If your Slack workspace requires messages to come from a named user for compliance reasons, you'll need to use Slack's incoming webhook URL instead and call it via the HTTP action.
9

Flow canvas > Slack action > Channel + Text fields

Build the Slack message with prospect details

In the Channel field, type the name of your target channel — for example, #prospect-research. In the Text field, build the message using dynamic tokens from earlier Parse JSON steps. Include company name, deal value, status label, contact name, email, and a direct link to the Close lead. Format the message with line breaks using the expression concat() or use Slack's mrkdwn format with *bold* for headers. See the pro tip for a pre-built expression that formats all fields cleanly.

  1. 1In the Channel field, type the exact channel name (e.g., #prospect-research)
  2. 2Click into the Text field
  3. 3Use dynamic content tokens to insert: Lead Name, Deal Value, Status Label, Contact Name, Contact Email, and Lead URL
  4. 4Use concat() expressions to join tokens with labels and line breaks
  5. 5Optionally add a *Research Thread* header using Slack mrkdwn syntax
What you should see: The Text preview shows a structured message template with placeholder tokens visible (e.g., 'display_name', 'value'). The channel name resolves to #prospect-research without error.
Common mistake — Power Automate's Slack connector does not support Block Kit — you only get plain text or basic mrkdwn. If you need buttons, sections, or structured cards, you must skip this connector and use the HTTP action to call Slack's chat.postMessage API directly with a blocks payload.
10

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

Test the flow end-to-end with a live Close deal

Save the flow. In Close, find a test deal and manually change its status to your target stage (e.g., 'Demo Scheduled'). Wait 5-15 seconds, then check Power Automate's 'Run history' under My flows. Click the most recent run to see each step's input and output. Confirm the Parse JSON steps resolved correctly and the Slack step shows Status: 200. Then check your Slack channel — the message should appear within 20-30 seconds of the Close status change.

  1. 1Click 'Save' in Power Automate
  2. 2In Close, change a test deal's status to 'Demo Scheduled'
  3. 3Wait 15 seconds, then go to My flows in Power Automate
  4. 4Click the flow name, then click 'Run history'
  5. 5Click the most recent run and verify each step shows a green checkmark
What you should see: Run history shows all steps green. The Slack channel receives a message with the deal's company name, value, stage, contact details, and a clickable Close link — all within 30 seconds of the status change in Close.
Power Automate
▶ Test flow
executed
Slack
Close
Close
🔔 notification
received
11

My flows > [Flow Name] > Edit > Settings

Turn the flow on and set error notification preferences

If the flow is in draft state, click the toggle on the flow detail page to turn it On. Then go to My flows > select the flow > Edit > Settings (gear icon in the top toolbar) and enable 'Send me an email when this flow fails'. Set the frequency to 'Immediately' so you know within minutes if Close stops reaching the webhook or the Slack token expires. This takes 60 seconds and saves hours of debugging a silent failure.

  1. 1Click the flow name in My flows
  2. 2Click 'Turn on' if the flow is still in draft state
  3. 3Click 'Edit', then click the gear icon (Settings) in the top toolbar
  4. 4Enable 'Send me an email when this flow fails'
  5. 5Set frequency to 'Immediately' and click Save
What you should see: The flow detail page shows 'On' status with a blue toggle. You will now receive failure emails at your Microsoft account email address if any run fails.

Paste this into a 'Compose' action after your second Parse JSON step. It builds the complete Slack mrkdwn message string in one expression, handling the cents-to-dollars conversion, date formatting, and null-safe contact fields. Reference the Compose output in the Slack 'Text' field instead of building the message inline — this makes the expression editable without touching the Slack action.

JavaScript — Code Stepconcat(
▸ Show code
concat(
  '*🔍 Research Needed: ', body('Parse_Lead_JSON')?['display_name'], '*', decodeUriComponent('%0A'),
  '*Stage:* ', body('Parse_Webhook_JSON')?['data']?['status_label'], decodeUriComponent('%0A'),

... expand to see full code

concat(
  '*🔍 Research Needed: ', body('Parse_Lead_JSON')?['display_name'], '*', decodeUriComponent('%0A'),
  '*Stage:* ', body('Parse_Webhook_JSON')?['data']?['status_label'], decodeUriComponent('%0A'),
  '*Deal Value:* ', formatNumber(div(float(body('Parse_Webhook_JSON')?['data']?['value']), 100), 'C2', 'en-US'), decodeUriComponent('%0A'),
  '*Contact:* ', coalesce(body('Parse_Lead_JSON')?['contacts']?[0]?['name'], 'No contact listed'), ' (', coalesce(body('Parse_Lead_JSON')?['contacts']?[0]?['emails']?[0]?['email'], 'no email'), ')', decodeUriComponent('%0A'),
  '*Last Note:* ', coalesce(body('Parse_Webhook_JSON')?['data']?['note'], 'No note recorded'), decodeUriComponent('%0A'),
  '*Expected Close:* ', if(equals(body('Parse_Webhook_JSON')?['data']?['date_won'], null), 'Not set', formatDateTime(body('Parse_Webhook_JSON')?['data']?['date_won'], 'MMMM dd, yyyy')), decodeUriComponent('%0A'),
  decodeUriComponent('%0A'),
  '🔗 <', body('Parse_Lead_JSON')?['url'], '|Open in Close>'
)

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 is already inside Microsoft 365 and your IT department controls app approvals. Power Automate's HTTP connector handles Close webhooks without any third-party bridge, and the Slack connector is pre-built and maintained by Microsoft. If you're a startup with no Microsoft 365 dependency and your team codes, skip Power Automate — n8n self-hosted or Pipedream will give you more control over the message format and cost you nothing at this volume.

Cost

Power Automate's pricing here is simple: the HTTP action is a premium connector, so you need at least the Power Automate Premium plan at $15/user/month. Each flow run consumes roughly 3-4 action runs (webhook receive, two Parse JSON, one HTTP GET, one Slack post). At 200 deals/month moving to a tracked stage, you're looking at ~800 action runs — well within the 40,000 monthly run limit on Premium. Compare that to Zapier: the same workflow on Zapier Professional runs $49/month and counts as a 3-step Zap, hitting task limits at 2,000 tasks/month. If you're already paying for Power Automate Premium for other flows, this one is effectively free. If you're buying it only for this workflow, Zapier is $34 cheaper per month.

Tradeoffs

Make handles the same workflow for $9/month on the Core plan and gives you a visual data mapping interface that's faster to configure than Power Automate's dynamic content picker — especially for nested JSON like Close's contacts array. Zapier's Close trigger is a polling connector that checks every 5-15 minutes, so it can't match the real-time webhook approach here. n8n's HTTP Request node plus the Slack node does this in 6 nodes on a self-hosted instance for $0, and you get full JavaScript for message formatting. Pipedream has a native Close trigger that fires on webhooks with zero setup — no JSON schema step required. Power Automate is still the right call when your IT team needs to audit integrations in a single platform and your apps are already behind Azure AD.

Three things you'll hit after setup. First, Close webhooks fire for every field update on an opportunity — including internal system updates — not just status changes. Without the status_label filter, expect 5-10x the Slack posts you actually want. Second, the Power Automate Slack connector doesn't support Block Kit, so your message is limited to mrkdwn text. If your team wants structured cards with buttons to 'Claim Research' or 'Log a Note', you need the HTTP action calling Slack's API directly with a blocks payload. Third, Close returns deal value in cents as an integer. A $12,000 deal comes through as 1200000. Build the division and formatNumber() expression from day one — debugging why your Slack posts say '$1,200,000' instead of '$12,000' is a time-waster that trips up nearly every first implementation.

Ideas for what to build next

  • Write team comments back to Close as notesSet up a second flow triggered by new Slack messages in #prospect-research that detects replies to the bot's post and writes them back to the Close lead as activity notes. This keeps research context in the CRM, not buried in Slack threads.
  • Add a daily digest for upcoming demosCreate a Scheduled cloud flow that runs every morning at 8am, queries Close for all deals with 'Demo Scheduled' status in the next 48 hours, and posts a single digest message to Slack. This gives the team a daily briefing without per-deal noise.
  • Pull LinkedIn and company data via Clearbit enrichmentAdd an HTTP action between the Close lead fetch and the Slack post that calls the Clearbit Enrichment API with the contact's email. Append company size, industry, and LinkedIn URL to the Slack message so teammates have external context, not just what's in Close.

Related guides

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