Intermediate~15 min setupCommunication & CRMVerified April 2026
Slack logo
Zoho CRM logo

How to Send Lost Deal Alerts from Zoho CRM to Slack with Power Automate

When a deal is marked as lost in Zoho CRM, Power Automate fires a webhook, extracts the reason code and competitor data, and posts a formatted alert to a designated Slack management channel.

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

Best for

Sales ops teams already running Microsoft 365 who need management alerted instantly when deals close-lost with structured reason and competitor data.

Not ideal for

Teams not in the Microsoft ecosystem — Make handles this same flow cheaper and with less setup friction if you're starting fresh.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 22-person B2B SaaS sales team uses this to post every closed-lost deal to a private #lost-deals Slack channel visible to the VP of Sales and RevOps lead. Before this flow, reason codes sat in Zoho unread for days and competitive intel (which rival won the deal) never surfaced to leadership until the quarterly review. Now the VP sees a Slack card within 90 seconds of a rep marking a deal lost, including the loss reason and competitor field, and can follow up with the rep the same day.

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.

Zoho CRM account with API access enabled and a user role that has read permission on the Deals module
Power Automate account — Microsoft 365 Business Basic or higher, or a standalone Power Automate per-user plan that includes premium connectors (Zoho CRM connector is premium)
Slack workspace admin access, or permission to add apps to the workspace, so Power Automate can authenticate and post to channels
A dedicated Slack channel for lost deal alerts (e.g., #lost-deals) created and accessible to the management team who need visibility
Zoho CRM Deals picklist values confirmed — specifically the exact string for the lost stage (e.g., 'Closed Lost') and the field API names for Closing Reason and Competitor custom fields

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Deal NameDeal_Name
StageStage
Closing ReasonClosing_Reason
AmountAmount
Account NameAccount_Name
Deal OwnerOwner
3 optional fields▸ show
CompetitorCompetitor
Close DateClosing_Date
Description / Loss NotesDescription

Step-by-Step Setup

1

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

Set Up the Zoho CRM Webhook Trigger in Power Automate

Go to make.powerautomate.com and click 'My flows' in the left sidebar, then click '+ New flow' and select 'Automated cloud flow'. Name the flow something like 'Zoho Lost Deal → Slack Alert'. In the trigger search bar, type 'Zoho CRM' and select the connector. Choose the trigger 'When a record is created or updated' — this is the correct trigger for catching stage changes in Zoho CRM deals.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' then select 'Automated cloud flow'
  3. 3Enter a flow name, e.g. 'Zoho Lost Deal → Slack Alert'
  4. 4In the trigger search bar type 'Zoho CRM'
  5. 5Select 'When a record is created or updated' as the trigger
What you should see: You should see the Zoho CRM trigger card appear as the first step in your flow canvas, with fields for Module and other settings still unconfigured.
Common mistake — Power Automate's Zoho CRM connector uses polling under the hood even though it feels event-driven — the minimum poll interval is 1 minute. For near-real-time behavior that's fine, but if you need sub-30-second alerts, Zoho's native webhooks pushed to a Power Automate HTTP trigger is the faster path (covered in Step 2 as an alternative note).
Power Automate
+
click +
search apps
Slack
SL
Slack
Set Up the Zoho CRM Webhook …
Slack
SL
module added
2

Flow canvas > Zoho CRM trigger card > Module Name dropdown

Configure the Zoho CRM Trigger for Deals Module

Inside the trigger card, set the 'Module Name' dropdown to 'Deals'. Leave the trigger set to fire on both creates and updates — you cannot filter to updates-only at the trigger level in this connector. The filtering to lost deals happens in a Condition step later. Make sure your Zoho CRM Connection is authenticated before moving forward; Power Automate will prompt you to sign in if no connection exists yet.

  1. 1Click inside the Zoho CRM trigger card to expand its settings
  2. 2Click the 'Module Name' dropdown and select 'Deals'
  3. 3If prompted, click 'Sign in' to create a new Zoho CRM Connection and authenticate with your Zoho account
  4. 4Confirm the Connection shows your Zoho org domain in the connection label
What you should see: The trigger card shows 'Deals' in the Module Name field and your Zoho CRM connection name appears below with a green checkmark indicating a valid connection.
Common mistake — If your Zoho account uses a region-specific domain (zoho.eu, zoho.com.au), select the matching region in the connector's connection setup screen. Choosing the wrong region causes silent authentication failures with no clear error message.
3

Flow canvas > + New step > Control > Condition

Add a Condition to Filter for Lost Stage Only

Click '+ New step' and search for 'Condition' — select the built-in Control action named 'Condition'. This is where you isolate only deals whose Stage field equals 'Closed Lost'. In the left value box, click inside and select 'Stage' from the dynamic content picker (this is the Deal_Stage field from Zoho). Set the operator to 'is equal to' and type 'Closed Lost' in the right value box exactly as it appears in your Zoho CRM picklist.

  1. 1Click '+ New step' below the trigger card
  2. 2Search for 'Condition' and select the 'Condition' Control action
  3. 3Click the left value box and choose 'Stage' from the dynamic content panel
  4. 4Set the middle dropdown to 'is equal to'
  5. 5Type 'Closed Lost' in the right value box (match the exact spelling in your Zoho picklist)
What you should see: The Condition card shows 'Stage is equal to Closed Lost' and splits into a 'Yes' branch and a 'No' branch below it.
Common mistake — The picklist value must match character-for-character what Zoho stores internally. If your Zoho admin renamed the stage to 'Lost' or 'Closed - Lost', your condition will never fire. Check Zoho CRM > Settings > Picklist Fields to confirm the exact string.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Zoho CRM
ZO
notified
4

Flow canvas > Condition > No branch > + Add an action > Control > Terminate

Add a Terminate Action in the 'No' Branch

Click inside the 'No' branch of your Condition. Add a 'Terminate' action from the Control connector. Set Status to 'Succeeded' and leave the message blank. This cleanly ends the flow run for any deal update that is not a lost deal, keeping your flow run history clean and avoiding unnecessary Slack noise.

  1. 1Click '+ Add an action' inside the 'No' branch
  2. 2Search for 'Terminate' and select the Control action
  3. 3Set the 'Status' field to 'Succeeded'
  4. 4Leave the 'Code' and 'Message' fields empty
What you should see: The No branch shows a single 'Terminate' card with Status set to Succeeded. Flows that don't match the lost condition will show as 'Succeeded' in run history rather than cluttering it with cancellations.
5

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

Add a Parse JSON Action to Extract Zoho Deal Fields

Inside the 'Yes' branch, click '+ Add an action' and search for 'Parse JSON' — it lives under the Data Operation connector. In the 'Content' field, insert the dynamic content output from the Zoho CRM trigger (typically labeled 'body' or the raw record output). You need to provide a schema so Power Automate can surface individual fields like Deal_Name, Closing_Reason, Competitor, and Amount as named tokens. Click 'Generate from sample' and paste a real Zoho deal JSON payload to auto-generate the schema.

  1. 1Click '+ Add an action' inside the 'Yes' branch
  2. 2Search 'Parse JSON' and select 'Parse JSON' under Data Operation
  3. 3In the 'Content' field, select the raw body output from the Zoho CRM trigger via the dynamic content panel
  4. 4Click 'Generate from sample', paste a real Zoho CRM deal record JSON, and click 'Done'
  5. 5Verify that fields like Deal_Name, Closing_Reason, and Competitor appear in the generated schema
What you should see: The Parse JSON card shows a populated schema and individual fields from the Zoho deal record are now available as dynamic content tokens in subsequent steps.
Common mistake — Zoho CRM returns custom fields with their API name (e.g., 'CONV_Competitor' not 'Competitor'). Run a test trigger first, capture the raw output from the trigger's run history, and use that actual JSON for schema generation — not a manually typed payload.
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
6

Flow canvas > Condition > Yes branch > + Add an action > Data Operation > Compose

Add a Compose Action to Build the Slack Message

Add a 'Compose' action (Data Operation connector) in the Yes branch after Parse JSON. Use this to construct the Slack Block Kit JSON payload. This gives you full control over the message format before passing it to the Slack action. Build a JSON object with a 'blocks' array that includes a header block with the deal name, a section block with loss reason and competitor, and a context block with deal amount and close date.

  1. 1Click '+ Add an action' after the Parse JSON step
  2. 2Search 'Compose' and select 'Compose' under Data Operation
  3. 3Click inside the 'Inputs' field and switch to the expression editor
  4. 4Paste the Block Kit JSON structure (see pro_tip_code below) referencing Parse JSON dynamic tokens
  5. 5Click 'OK' to save the expression
What you should see: The Compose card shows the Block Kit JSON structure in its Inputs field with dynamic tokens for deal name, loss reason, competitor, and amount embedded in the correct positions.
Common mistake — Slack Block Kit JSON must be valid — a missing comma or extra bracket causes the Slack action to fail with a generic 'Bad Request' error. Use jsonlint.com to validate your static structure before adding dynamic tokens.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
7

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

Connect to Slack and Configure the Post Message Action

Add a new action and search for 'Slack'. Select the 'Post message (V2)' action. If you don't have a Slack connection yet, click 'Sign in' and authenticate with the Slack workspace where you want alerts posted. For the 'Channel' field, type or select the management channel (e.g., #lost-deals). In the 'Message Text' field, enter a plain-text fallback. In the 'Blocks' field, reference the output of your Compose step.

  1. 1Click '+ Add an action' after the Compose step
  2. 2Search 'Slack' and select 'Post message (V2)'
  3. 3Click 'Sign in' to create a Slack Connection if none exists; authorize Power Automate in your Slack workspace
  4. 4Set the 'Channel' field to your target channel (e.g., #lost-deals)
  5. 5In the 'Blocks' field, select the 'Outputs' dynamic token from the Compose step
What you should see: The Slack action card shows your workspace connection, the target channel name, and the Compose output wired into the Blocks field. A plain-text fallback message should appear in the Message Text field.
Common mistake — The Slack connector in Power Automate posts as the connected user's identity, not a bot. If the authenticated user leaves the company or loses workspace access, the flow breaks silently. Create a dedicated service account or Slack app bot token for this connection instead.
8

Flow canvas > Slack action > ... menu > Configure run after

Add Error Handling with a Parallel Branch

Select the Slack 'Post message' action card, click the three-dot menu, and choose 'Configure run after'. Enable the 'has failed' and 'has timed out' checkboxes. Below the Slack action, add a parallel branch that fires only on failure: add another 'Post message' action to a different Slack channel (e.g., #automation-errors) with a static alert that the lost deal notification failed. Include the flow run ID using the expression workflow()['run']['name'] so your team can trace the failed run.

  1. 1Click the '...' menu on the Slack Post message action card
  2. 2Select 'Configure run after'
  3. 3Check the 'has failed' and 'has timed out' boxes, then click Done
  4. 4Click '+ Add a parallel branch' and add a second Slack 'Post message' action
  5. 5Set the error channel to #automation-errors and include the expression workflow()['run']['name'] in the message body
What you should see: Your flow canvas shows two branches after the Compose step: the primary Slack post for success and a parallel error-notification branch that only runs when the primary fails.
9

make.powerautomate.com > My flows > [Your Flow] > 28 day run history

Test the Flow with a Real Zoho Deal

Save the flow, then go to your Zoho CRM account and find an existing test deal. Change its Stage to 'Closed Lost', set a Closing Reason, and fill in the Competitor field. Wait up to 60 seconds for Power Automate's polling interval to pick up the change. Back in Power Automate, click '28 day run history' in the flow detail page to see if a run fired. Click into the run to inspect each step's inputs and outputs.

  1. 1Save the flow by clicking the 'Save' button in the top right
  2. 2Open Zoho CRM in a separate tab and navigate to a test deal
  3. 3Set Stage to 'Closed Lost', fill in Closing Reason and Competitor, and save
  4. 4Wait 60 seconds then return to Power Automate
  5. 5Click '28 day run history' on your flow's detail page and inspect the latest run
What you should see: The run history shows a green 'Succeeded' run. Expanding each step shows the Zoho deal data flowing through Parse JSON and the Slack message delivered. You should also see the formatted card in your #lost-deals Slack channel within 90 seconds of saving the Zoho record.
Common mistake — If no run appears after 2 minutes, the polling trigger may not have picked up the update. Check that the Zoho CRM Connection used in the trigger has permission to read Deals — a read-only API user without Deals module access will cause silent polling failures.
Power Automate
▶ Test flow
executed
Slack
Zoho CRM
Zoho CRM
🔔 notification
received
10

make.powerautomate.com > My flows > [Your Flow] > Detail page > Owners / Run only users

Turn the Flow On and Set Run-Only Permissions

If the flow is still in draft or off state, toggle it to 'On' from the flow detail page. Then click 'Edit' next to 'Run only users' at the bottom of the flow detail screen. This controls who can trigger a manual run — for an automated flow you can leave this as owner-only, but document the owning account clearly. Add at least one co-owner under 'Owners' so the flow doesn't orphan if the original creator's account is deactivated.

  1. 1Navigate to the flow's detail page and confirm the status toggle reads 'On'
  2. 2Scroll to the 'Owners' section at the bottom of the detail page
  3. 3Click 'Edit' next to Owners and add a second owner (e.g., your team's shared admin account)
  4. 4Save the ownership change
What you should see: The flow detail page shows 'On' in the status toggle and at least two owners listed. The flow will now run automatically on every Zoho CRM deal update without manual intervention.

Paste this expression into the Compose action's Inputs field (switch to the Expression tab in the dynamic content panel). It builds a complete Slack Block Kit payload using dynamic tokens from the Parse JSON step, formats the Amount as currency, and truncates the Description field to 200 characters so Slack cards stay readable. Replace 'body' references with the actual Parse JSON output token names if they differ in your schema.

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

... expand to see full code

{
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": concat('🔴 Deal Lost: ', body('Parse_JSON')?['Deal_Name'])
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": concat('*Loss Reason:*\n', body('Parse_JSON')?['Closing_Reason'])
        },
        {
          "type": "mrkdwn",
          "text": concat('*Competitor:*\n', if(empty(body('Parse_JSON')?['Competitor']), 'Not specified', body('Parse_JSON')?['Competitor']))
        },
        {
          "type": "mrkdwn",
          "text": concat('*Deal Value:*\n$', body('Parse_JSON')?['Amount'])
        },
        {
          "type": "mrkdwn",
          "text": concat('*Owner:*\n', body('Parse_JSON')?['Owner'])
        }
      ]
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": concat('*Notes:* ', substring(if(empty(body('Parse_JSON')?['Description']), 'No notes provided.', body('Parse_JSON')?['Description']), 0, min(200, length(if(empty(body('Parse_JSON')?['Description']), 'No notes provided.', body('Parse_JSON')?['Description'])))))
      }
    },
    {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": concat('Account: *', body('Parse_JSON')?['Account_Name'], '* | Close Date: ', body('Parse_JSON')?['Closing_Date'])
        }
      ]
    }
  ]
}

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 organization is already running Microsoft 365 and your IT team manages connections through the Microsoft admin center. The Zoho CRM connector is pre-built and maintained, Power Automate's error handling and run history are genuinely good for debugging production issues, and if you're already paying for a Microsoft 365 Business Premium plan, the per-user Power Automate license may already be included. The one scenario where you'd skip Power Automate entirely: if you have no Microsoft footprint whatsoever. Paying $15/user/month just for this flow when Make would run it for $9/month total is hard to justify.

Cost

Cost math is straightforward. This flow consumes approximately 3–4 actions per run (trigger check, condition, parse JSON, compose, Slack post — but trigger checks don't always count toward your action quota). At 50 lost deals per month, you're looking at 150–200 action runs. The Power Automate per-user plan includes 40,000 actions/month, so you won't come close to the limit. The real cost is the license: $15/user/month for the plan that unlocks the Zoho CRM premium connector. Make runs this same flow for $9/month total on their Core plan, which covers 10,000 operations. Zapier's equivalent comes in at $19.99/month on the Professional plan. Power Automate is mid-range on price but the cheapest option if you're already paying for Microsoft 365 E3 or higher.

Tradeoffs

Zapier has a cleaner Zoho CRM trigger setup — their 'New or Updated Deal in Stage' filter is built into the trigger itself, so you skip the Condition step entirely. That's a genuine time-saver. Make gives you better message formatting control through its HTTP module with Slack's raw API, letting you send rich Block Kit payloads without the limitations of the native Slack connector. n8n wins if you want to self-host and pay nothing per run — their Zoho CRM node and Slack node both handle this workflow in about 6 nodes, and you can add JavaScript transformations inline. Pipedream is fastest to set up if you already know JavaScript and want sub-10-second trigger latency via Zoho's push webhooks. Power Automate still makes sense here when your IT department requires all integrations to live within the Microsoft tenant for compliance and visibility reasons — that's a real constraint in enterprise environments and it's where Power Automate wins by default.

Three things you'll hit after setup. First, Zoho CRM fires multiple update events for a single save when Zoho workflows or Blueprint automation also touch the record — you'll see duplicate Slack messages and spend time wondering why. Fix it with concurrency control set to 1 on the flow. Second, the Zoho CRM connector's token refresh isn't bulletproof — flows that go days without running sometimes wake up with a stale OAuth token and fail with a 401 until you manually re-authenticate the connection. Put a monitoring alert on flow failure emails so you catch this before management notices missing notifications. Third, Power Automate's dynamic content panel doesn't always surface nested JSON fields from Zoho cleanly — fields inside objects (like Owner being an object with 'name' and 'id' sub-properties) show up as the full object string rather than a readable name. You'll need Parse JSON with a precise schema, or an explicit expression like body('Parse_JSON')?['Owner']?['name'], to pull out the rep's display name rather than posting a raw ID to Slack.

Ideas for what to build next

  • Build a Weekly Lost Deal DigestAdd a separate Scheduled cloud flow that runs every Monday morning, queries Zoho CRM for all deals closed-lost in the past 7 days using the 'Search records' action, and posts a grouped summary to #lost-deals showing loss reasons ranked by frequency. This gives leadership a pattern view alongside the real-time individual alerts.
  • Log Lost Deals to a SharePoint List for Trend ReportingAfter the Slack post action in your Yes branch, add a SharePoint 'Create item' action to write each lost deal to a SharePoint list with columns for reason code, competitor, amount, and date. Connect that list to a Power BI report so your RevOps team can slice loss reasons by rep, product line, and competitor over time.
  • Auto-Create a Follow-Up Task in Zoho CRMAdd a Zoho CRM 'Create record' action at the end of the Yes branch to create a follow-up Activity/Task assigned to the deal owner with a due date of 2 business days, prompting them to document a full loss analysis. This closes the loop between the Slack alert and structured loss data capture.

Related guides

Was this guide helpful?
Slack + Zoho CRM overviewPower Automate profile →