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

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-time

Use case type

notification

Real-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.

/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 CRM API key with read access to leads and users (generated in Close Settings > API Keys)
Slack workspace admin access, or permission to install apps — needed to authorize the Power Automate Slack connector
Power Automate account with a license that includes premium connectors if you use any beyond the standard HTTP + Slack tier (check your plan at admin.microsoft.com)
Dedicated Slack channels for each sales rep already created, following a consistent naming convention (e.g., #leads-sarah, #leads-james)
Close webhook permissions enabled — confirm your Close plan supports outbound webhooks (available on Professional and above)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Lead IDid
Lead Namedisplay_name
Assigned To (User ID)assigned_to
URL (Close record link)
6 optional fields▸ show
Lead Sourcesource
Companycompany
Primary Contact Emailcontacts[0].emails[0].email
Primary Contact Phonecontacts[0].phones[0].phone
Statusstatus_label
Date Createddate_created

Step-by-Step Setup

1

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.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' then select 'Automated cloud flow'
  3. 3Name the flow 'Close Lead Assignment → Slack'
  4. 4Search 'HTTP' in the trigger search bar
  5. 5Select 'When a HTTP request is received' under the Request connector
What you should see: You should see the flow canvas open with a single trigger card labeled 'When a HTTP request is received' at the top.
Common mistake — Do NOT use a Scheduled flow here. Close fires events in real time and polling will introduce delays of up to 15 minutes. Automated flow with the HTTP webhook trigger is the correct choice.
2

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.

  1. 1Click the trigger card to expand it
  2. 2Click 'Use sample payload to generate schema'
  3. 3Paste the Close lead.assigned webhook payload sample into the text box
  4. 4Click 'Done' to generate the schema
  5. 5Click 'Save' in the top right, then reopen the trigger card and copy the HTTP POST URL
What you should see: After saving, the HTTP POST URL field displays a full HTTPS URL ending in a unique token. It should look like 'https://prod-xx.westus.logic.azure.com:443/workflows/...'
Common mistake — The URL changes if you delete and recreate the flow. If you ever do that, you must update the webhook URL in Close as well, or events will stop arriving.
3

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'.

  1. 1Navigate to Settings > Integrations > API & Webhooks in Close
  2. 2Click the 'Webhooks' tab
  3. 3Click '+ Add Webhook'
  4. 4Paste the Power Automate HTTP POST URL into the URL field
  5. 5Check the 'lead.assigned' event and click 'Save'
What you should see: The webhook appears in the list with a green status indicator and 'lead.assigned' listed under events.
Common mistake — Close sends a test ping immediately after saving. Power Automate will receive a payload with 'event': 'ping' — make sure your flow handles or ignores this gracefully, or it may error on the first run before any real lead is assigned.
4

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.

  1. 1Click '+ New step'
  2. 2Search 'Parse JSON' and select it under Data Operation
  3. 3Click the 'Content' field and select 'Body' from the dynamic content panel
  4. 4Paste your JSON schema into the 'Schema' field
What you should see: The Parse JSON card shows 'Body' in the Content field and a valid schema in the Schema field. No red error indicators should be visible.
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 > 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.

  1. 1Click '+ New step' and search 'HTTP'
  2. 2Select the HTTP action (not the webhook trigger)
  3. 3Set Method to 'GET'
  4. 4Set URI to 'https://api.close.com/api/v1/user/' followed by the 'assigned_to' dynamic token from Parse JSON
  5. 5Set Authentication to 'Basic', enter your Close API key as Username, leave Password blank
What you should see: The HTTP action card shows a GET request to the Close user endpoint with Basic auth configured. When you test it, the Body output should contain the user's first_name, last_name, and email fields.
Common mistake — Do NOT skip this lookup step and post the raw user ID to Slack. A message that says 'Lead assigned to: user_abc123' is useless to a rep. The API call adds about 300ms to the flow — worth it.
6

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.

  1. 1Click '+ New step' and select Parse JSON again
  2. 2Set Content to 'Body' from the HTTP user lookup step
  3. 3Click 'Use sample payload to generate schema'
  4. 4Paste a sample Close GET /user/ response and click 'Done'
What you should see: You now have dynamic tokens for 'first_name', 'last_name', and 'email' available in the dynamic content panel for use in later steps.
7

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.

  1. 1Click '+ New step'
  2. 2Search 'Slack' and select the Slack connector
  3. 3Select 'Post message (V2)' action
  4. 4Click 'Sign in' if prompted and authorize Power Automate in your Slack workspace
What you should see: The Slack action card shows your connected workspace name next to a green check. The Channel Name and Message Text fields appear below.
Common mistake — Power Automate's Slack connector uses a single bot token tied to one Slack account. If that account is deactivated or leaves the workspace, all flows using this connection stop working. Use a dedicated service account or Slack bot user for this connection.
8

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.

  1. 1Click the Channel Name field and switch to expression mode
  2. 2Enter: concat('leads-', toLower(body('Parse_JSON_2')?['first_name']))
  3. 3Click the Message Text field
  4. 4Build the message using dynamic tokens: Lead Name, Company, Company Size, Lead Source, Phone, Email, and the Close record URL
What you should see: The Channel Name field shows the expression in blue. The Message Text field shows a mix of static labels and dynamic token pills.
Common mistake — Slack channel names must be lowercase and contain no spaces. If a rep's name contains a space or capital letter and you don't normalize it, the message will post to a nonexistent channel and fail silently. The toLower() expression handles capitalization — add a replace() to handle spaces if needed.
9

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.

  1. 1Click the three-dot menu (…) on the Slack 'Post message' card
  2. 2Select 'Configure run after'
  3. 3Check 'has failed' and 'has timed out' in addition to 'is successful'
  4. 4Add a 'Send an email (V2)' or Teams message action in the failure branch to alert the flow owner
What you should see: The Slack action card now shows a dotted border on one branch and a solid border on another, indicating it has both success and failure paths configured.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Close
CL
notified
10

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.

  1. 1In Close, open any lead and click 'Assign' to reassign it to a rep
  2. 2Go to Power Automate > My flows > your flow name
  3. 3Click '28 day run history'
  4. 4Click the most recent run to open the step-by-step execution trace
  5. 5Confirm green checkmarks on all steps and verify the Slack channel received the message
What you should see: All steps show green checkmarks in the run history. The assigned rep's Slack channel contains a new message with the lead's company, size, source, and a working Close link.
Power Automate
▶ Test flow
executed
Slack
Close
Close
🔔 notification
received
11

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.

  1. 1Return to the flow detail page and confirm the toggle is set to 'On'
  2. 2Click 'Check' in the top toolbar to run the flow checker
  3. 3Resolve any warnings shown in the checker panel
  4. 4Monitor '28 day run history' the next morning for any failed runs
What you should see: The flow checker shows no errors. The flow toggle is green and labeled 'On'. Run history entries appear for each lead assignment in Close.

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

VerdictWhy n8n for this workflow

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

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.

Tradeoffs

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 messagePull 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 leadsCreate 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 CloseUpgrade 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

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