

How to Send Close Lead Assignments to Slack with Power Automate
When a lead is assigned in Close CRM, Power Automate fires a webhook, pulls the lead's company size, source, and contact details, then posts a formatted message to the assigned rep's dedicated Slack channel.
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 need instant Slack alerts when Close CRM assigns new leads to reps.
Not ideal for
Teams who need two-way sync or want to update Close from Slack actions — this flow only pushes notifications outbound.
Sync type
real-timeUse case type
notificationReal-World Example
A 20-person B2B SaaS sales team routes inbound leads from three sources — demo requests, PPC, and partner referrals — into Close, where an ops manager assigns them manually throughout the day. Before this flow, reps had no alert system and checked Close every hour or so, meaning a hot inbound demo request could sit untouched for 45 minutes. After setup, each rep gets a Slack message in their personal #leads-[name] channel within 90 seconds of assignment, including company headcount, lead source, and a direct link to the Close record.
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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Lead ID | id | |
| Lead Name | display_name | |
| Assigned To (User ID) | assigned_to | |
| URL (Close record link) | ||
6 optional fields▸ show
| Lead Source | source |
| Company | company |
| Primary Contact Email | contacts[0].emails[0].email |
| Primary Contact Phone | contacts[0].phones[0].phone |
| Status | status_label |
| Date Created | date_created |
Step-by-Step Setup
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 left and select 'Automated cloud flow' from the dropdown. A dialog box appears asking you to name the flow and choose a trigger. Name it something like 'Close Lead Assignment → Slack'. For the trigger, type 'HTTP' in the search bar and select 'When a HTTP request is received' — this is Power Automate's built-in webhook trigger under the 'Request' connector.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' then select 'Automated cloud flow'
- 3Name the flow 'Close Lead Assignment → Slack'
- 4Search 'HTTP' in the trigger search bar
- 5Select 'When a HTTP request is received' under the Request connector
Flow canvas > When a HTTP request is received > Use sample payload to generate schema
Generate and copy the webhook URL
Click the 'When a HTTP request is received' trigger card to expand it. You won't see the HTTP POST URL yet — Power Automate generates it only after you save the flow for the first time. Paste in a JSON schema so Power Automate knows what fields to expect from Close. Click 'Use sample payload to generate schema', paste the sample JSON below, and click 'Done'. Then click 'Save' in the top right. After saving, return to the trigger card — the HTTP POST URL field will now show a long URL. Copy it.
- 1Click the trigger card to expand it
- 2Click 'Use sample payload to generate schema'
- 3Paste the Close lead.assigned webhook payload sample into the text box
- 4Click 'Done' to generate the schema
- 5Click 'Save' in the top right, then reopen the trigger card and copy the HTTP POST URL
Close Settings > Integrations > API & Webhooks > Webhooks tab
Register the webhook in Close CRM
In Close, go to Settings > Integrations > API & Webhooks. Click the 'Webhooks' tab, then click '+ Add Webhook'. Paste the Power Automate HTTP POST URL into the URL field. Under 'Events', check 'lead.assigned' — this is the only event you need for this flow. Set the signing secret if you want to verify payloads later (recommended for production). Click 'Save'.
- 1Navigate to Settings > Integrations > API & Webhooks in Close
- 2Click the 'Webhooks' tab
- 3Click '+ Add Webhook'
- 4Paste the Power Automate HTTP POST URL into the URL field
- 5Check the 'lead.assigned' event and click 'Save'
Flow canvas > + New step > Data Operation > Parse JSON
Add a Parse JSON action to extract lead fields
Back in Power Automate, click '+ New step' below the trigger. Search for 'Parse JSON' and select it from the 'Data Operation' connector. In the 'Content' field, click inside and select 'Body' from the dynamic content panel — this is the raw payload coming from Close. In the 'Schema' field, paste the same JSON schema you generated in step 2. This action makes individual fields like lead name, assigned user, company size, and lead source available as dynamic content tokens in subsequent steps.
- 1Click '+ New step'
- 2Search 'Parse JSON' and select it under Data Operation
- 3Click the 'Content' field and select 'Body' from the dynamic content panel
- 4Paste your JSON schema into the 'Schema' field
Flow canvas > + New step > HTTP action
Add a Close connection and look up the assigned user's name
Close's webhook payload for lead.assigned sends an assigned_to field containing a user ID (e.g., 'user_abc123'), not a human-readable name. You need to resolve this to a name before posting to Slack. Click '+ New step', search 'HTTP', and select the HTTP action (not the trigger). Configure a GET request to 'https://api.close.com/api/v1/me/' substituting the user ID — actually use 'https://api.close.com/api/v1/user/{assigned_to}/' where {assigned_to} is the dynamic token from Parse JSON. Set Authentication to 'Basic', enter your Close API key as the username, and leave the password blank.
- 1Click '+ New step' and search 'HTTP'
- 2Select the HTTP action (not the webhook trigger)
- 3Set Method to 'GET'
- 4Set URI to 'https://api.close.com/api/v1/user/' followed by the 'assigned_to' dynamic token from Parse JSON
- 5Set Authentication to 'Basic', enter your Close API key as Username, leave Password blank
Flow canvas > + New step > Data Operation > Parse JSON
Parse the user lookup response
Add another Parse JSON action below the HTTP user lookup step. Set Content to 'Body' from the previous HTTP action's output. Generate a new schema from a sample Close user API response — it should include id, first_name, last_name, and email at minimum. This gives you clean dynamic tokens like 'first_name' and 'last_name' to use in the Slack message without writing manual expressions for every field.
- 1Click '+ New step' and select Parse JSON again
- 2Set Content to 'Body' from the HTTP user lookup step
- 3Click 'Use sample payload to generate schema'
- 4Paste a sample Close GET /user/ response and click 'Done'
Flow canvas > + New step > Slack > Post message (V2)
Add the Slack connection
Click '+ New step' and search 'Slack'. Select the Slack connector and choose the action 'Post message (V2)'. If you haven't connected Slack yet, 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 with an account that has access to post in all rep-specific channels you plan to use.
- 1Click '+ New step'
- 2Search 'Slack' and select the Slack connector
- 3Select 'Post message (V2)' action
- 4Click 'Sign in' if prompted and authorize Power Automate in your Slack workspace
Flow canvas > Slack > Post message (V2) > Channel Name + Message Text
Map the channel and compose the message
In the Channel Name field, you need to route messages to each rep's dedicated channel. If your channels follow a pattern like #leads-firstname, use a Power Automate expression: concat('leads-', toLower(body('Parse_JSON_2')?['first_name'])). In the Message Text field, compose the notification. Use a combination of dynamic tokens and static text to include lead name, company, company size, lead source, phone, email, and a direct link to the Close record. Format it clearly — each field on its own line using line breaks.
- 1Click the Channel Name field and switch to expression mode
- 2Enter: concat('leads-', toLower(body('Parse_JSON_2')?['first_name']))
- 3Click the Message Text field
- 4Build the message using dynamic tokens: Lead Name, Company, Company Size, Lead Source, Phone, Email, and the Close record URL
Flow canvas > Slack step > three-dot menu > Configure run after
Add error handling with a Scope and Condition
Wrap the Slack post step in a Scope action for error handling. Click the three-dot menu on the Slack step, select 'Add a parallel branch', and add a 'Compose' action that runs 'if failed'. Alternatively, configure the Slack step's run-after settings: click the three dots on the Slack card, select 'Configure run after', and check 'has failed' in addition to 'is successful'. This ensures the flow doesn't silently fail when a channel doesn't exist or a token is expired.
- 1Click the three-dot menu (…) on the Slack 'Post message' card
- 2Select 'Configure run after'
- 3Check 'has failed' and 'has timed out' in addition to 'is successful'
- 4Add a 'Send an email (V2)' or Teams message action in the failure branch to alert the flow owner
My flows > [Flow name] > 28 day run history
Test the flow end-to-end
In Close, open an existing lead and manually reassign it to a sales rep. Watch Power Automate's flow run history under 'My flows > [Flow name] > 28 day run history'. The run should appear within 10–20 seconds. Click into the run to inspect each step's input and output. Verify the Parse JSON steps decoded the payload correctly, the user lookup returned the right name, and the Slack message landed in the correct channel.
- 1In Close, open any lead and click 'Assign' to reassign it to a rep
- 2Go to Power Automate > My flows > your flow name
- 3Click '28 day run history'
- 4Click the most recent run to open the step-by-step execution trace
- 5Confirm green checkmarks on all steps and verify the Slack channel received the message
My flows > [Flow name] > flow detail page
Turn on the flow and monitor for 24 hours
Click the back arrow to return to the flow detail page. Confirm the flow toggle shows 'On'. Watch the run history over the next 24 hours and check that every real lead assignment in Close triggers a corresponding run. Set up Power Automate's built-in flow checker: go to the flow detail page and click 'Check' in the top toolbar to catch any schema mismatches or connection issues before they cause missed notifications.
- 1Return to the flow detail page and confirm the toggle is set to 'On'
- 2Click 'Check' in the top toolbar to run the flow checker
- 3Resolve any warnings shown in the checker panel
- 4Monitor '28 day run history' the next morning for any failed runs
This expression block goes inside the Message Text field of your Slack 'Post message (V2)' action. It builds a structured Slack notification using Power Automate's concat() and formatDateTime() functions, pulling tokens from the two Parse JSON steps. Paste each line as a separate expression or combine them into a single concat() in the expression editor — open it by clicking the expression tab (fx) in the dynamic content panel.
JavaScript — Code Step// Power Automate expression for Slack Message Text field▸ Show code
// Power Automate expression for Slack Message Text field // Paste into the Message Text field using the Expression (fx) editor concat(
... expand to see full code
// Power Automate expression for Slack Message Text field
// Paste into the Message Text field using the Expression (fx) editor
concat(
'🔔 *New Lead Assigned*', '
',
'*Company:* ', body('Parse_Lead_Response')?['company'], '
',
'*Lead Name:* ', body('Parse_Lead_Response')?['display_name'], '
',
'*Source:* ', if(empty(body('Parse_Lead_Response')?['source']), 'Unknown', body('Parse_Lead_Response')?['source']), '
',
'*Status:* ', body('Parse_Lead_Response')?['status_label'], '
',
'*Email:* ', body('Parse_Lead_Response')?['contacts']?[0]?['emails']?[0]?['email'], '
',
'*Phone:* ', body('Parse_Lead_Response')?['contacts']?[0]?['phones']?[0]?['phone'], '
',
'*Assigned:* ', formatDateTime(utcNow(), 'MMM dd, yyyy h:mm tt'), ' UTC', '
',
'*View in Close:* ', concat('https://app.close.com/lead/', body('Parse_JSON')?['data']?['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
Use Power Automate for this if your team is already in Microsoft 365 and your IT department controls app approvals. The HTTP webhook trigger handles Close's outbound events reliably, and the Slack connector is included in standard Power Automate plans without needing a premium connector upgrade. You also get native integration with Teams if you ever want to add a parallel notification there. The one scenario where you'd pick something else: if your team lives entirely outside the Microsoft ecosystem and nobody wants to manage Power Automate licenses — Make handles the same flow for free under 1,000 operations/month with a cleaner visual interface.
Cost math: this flow uses roughly 6–8 operations per lead assignment (trigger, two Parse JSON, one HTTP, one Slack post, plus error handling). At 200 lead assignments per month, that's 1,600 operations. Power Automate's per-user plan costs $15/month and includes 40,000 operations — you'll never hit the ceiling. The Power Automate per-flow plan at $100/month is overkill here. If you're on a Microsoft 365 Business plan, you may already have seeded Power Automate access included; check admin.microsoft.com before buying anything. Compare that to Make's free tier covering 1,000 operations, which handles up to 125 lead assignments per month at zero cost.
Here's how the competitors stack up on this specific use case. Make has a native Close module with a 'Watch Leads' trigger that polls every 15 minutes — no webhook setup required, which is faster to configure but slower to fire. Zapier has a Close 'New Lead' trigger but no native 'Lead Assigned' trigger, so you'd need to use a webhook Zap and filter, adding complexity. n8n has a Close node in community edition but the webhook setup is identical to Power Automate's — no real advantage there unless you're self-hosting for data residency reasons. Pipedream lets you write JavaScript to parse the Close payload directly, which is faster to iterate on if you're comfortable with code. Power Automate wins when your org already has Microsoft SSO, audit logging requirements, or an IT team that will only approve Microsoft-native tooling.
Three things you'll hit after setup. First, the Close lead.assigned webhook sends a minimal payload — often just the lead ID, assigned user ID, and timestamp. If you try to use company name or lead source directly from the webhook body, you'll get null values. You must make a secondary GET to the Close lead endpoint to fetch full details, which adds a step but is unavoidable. Second, Power Automate's Slack connector occasionally drops messages during Slack API maintenance windows without surfacing an error in the run history — the step shows green but the message never arrives. Add a 'Get message' verification step in testing to confirm delivery. Third, Power Automate throttles the HTTP action at 100 calls per 20 seconds at the tenant level — if you have multiple flows hammering the Close API simultaneously (e.g., a batch reassignment of 50 leads at once), you'll hit 429 errors on the user lookup calls. Add a Retry policy on the HTTP action: go to Settings on the HTTP card and set Retry Policy to 'Fixed Interval', 4 retries, 20-second delay.
Ideas for what to build next
- →Add lead scoring context to the message — Pull lead score or activity history from Close's API and include it in the Slack notification so reps know immediately whether to call now or queue the lead for later. A single extra HTTP GET to /activity/?lead_id= gives you last activity date and type.
- →Build a daily digest for uncontacted leads — Create a second Scheduled flow that runs each morning, queries Close for all leads assigned in the last 24 hours with zero logged activities, and posts a summary to a #leads-uncontacted Slack channel — a safety net for anything that fell through the cracks.
- →Add a Slack button to log a call in Close — Upgrade the Slack message to use Block Kit with an interactive button. When the rep clicks 'Mark as Contacted', a second Power Automate flow fires — triggered by Slack's interactivity URL — and creates a call activity on the lead in Close via POST /activity/call/.
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