Beginner~12 min setupCommunication & CRMVerified April 2026
Slack logo
Zoho CRM logo

How to Send Zoho CRM Deal Stage Updates to Slack with Make

Polls Zoho CRM for deal stage changes and posts a formatted Slack message to a designated channel whenever a deal moves forward or stalls.

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

Best for

Sales teams of 5–30 people who live in Slack and need instant visibility into pipeline movement without logging into Zoho CRM.

Not ideal for

Teams running hundreds of deal updates per day — at that volume, per-operation costs add up faster than a native Zoho webhook to a dedicated tool.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person B2B software sales team uses this to post into #pipeline-updates whenever a deal moves to Proposal Sent, Negotiation, or Closed Won. Before the automation, reps checked Zoho manually twice a day and missed same-day stage changes that needed fast follow-up. Now the whole team sees a Slack message within 15 minutes of the stage change, with deal name, owner, and value in one line.

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 Make

Copy the pre-built Make blueprint and paste it straight into Make. 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 at least one deal in the pipeline and 'Read' access to the Deals module — the OAuth connection will fail to return records without it
Zoho CRM API access enabled on your plan — API calls require Professional plan or above; Free and Standard plans block third-party integrations
Slack workspace where you have permission to add apps — you need the 'Manage Apps' permission or admin approval to install the Make Slack bot
A Slack channel already created (e.g., #pipeline-updates) and the Make bot invited to it — Make cannot create channels or post to channels it hasn't been invited to
Make account on a paid plan or the free tier with sufficient operations — this scenario uses roughly 3–5 operations per deal update depending on router branches matched

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Deal NameDeal_Name
StageStage
Owner NameOwner.name
Modified TimeModified_Time
5 optional fields▸ show
AmountAmount
Account NameAccount_Name
Closing DateClosing_Date
Lead SourceLead_Source
Description / Next StepsDescription

Step-by-Step Setup

1

Make Dashboard > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com and click the blue 'Create a new scenario' button in the top right of your Scenarios dashboard. You'll land on a blank canvas with a single grey circle in the middle — this is where your trigger module goes. Give the scenario a name right away by clicking 'New scenario' at the top left and typing something like 'Zoho Deal Stage → Slack'. Naming it now saves confusion when you have 20 scenarios later.

  1. 1Log in at make.com
  2. 2Click 'Create a new scenario' in the top right
  3. 3Click the pencil icon next to 'New scenario' at the top left
  4. 4Type a name like 'Zoho Deal Stage → Slack' and press Enter
What you should see: You should see a blank canvas with a single grey plus-circle in the center and your scenario name in the top left.
2

Canvas > + Circle > Search 'Zoho CRM' > Watch Records

Add the Zoho CRM trigger module

Click the grey circle on the canvas to open the module picker. Search for 'Zoho CRM' and select it from the results. From the list of triggers and actions, choose 'Watch Records' — this is the polling trigger that checks for updated deals on a schedule you define. You'll need to connect your Zoho CRM account here if you haven't before; Make will open an OAuth popup.

  1. 1Click the grey plus-circle on the canvas
  2. 2Type 'Zoho CRM' in the search box
  3. 3Select 'Zoho CRM' from the results
  4. 4Choose 'Watch Records' as the trigger
  5. 5Click 'Add' to connect your Zoho CRM account via OAuth
What you should see: A Zoho CRM module appears on the canvas with a clock icon indicating it's a polling trigger, and the connection dropdown shows your Zoho account name.
Common mistake — Zoho CRM has multiple regional domains (zoho.com, zoho.eu, zoho.in). During OAuth, Make will ask which domain you're on. Pick wrong and the connection will authorize but return zero records.
Make
+
click +
search apps
Slack
SL
Slack
Add the Zoho CRM trigger mod…
Slack
SL
module added
3

Zoho CRM Module Settings > Module: Deals > Trigger Field: Modified Time

Configure the Watch Records module for Deals

In the Watch Records configuration panel, set 'Module' to 'Deals' and 'Trigger field' to 'Modified Time'. This tells Make to look for deals where the Modified Time has changed since the last poll — which catches stage changes along with any other edits. Set 'Maximum number of returned records' to 10 to start; you can raise it later. You do not need to filter by stage here — the router in a later step handles that.

  1. 1In the Module dropdown, select 'Deals'
  2. 2Set 'Trigger field' to 'Modified Time'
  3. 3Set 'Maximum number of returned records' to 10
  4. 4Leave 'From now on' selected for the start position
  5. 5Click OK to save the module configuration
What you should see: The Zoho CRM module shows 'Watch Deals (Modified Time)' as a label on the canvas bubble.
Common mistake — 'Modified Time' catches every deal edit, not just stage changes. The router in step 5 filters this down — but if your team edits deal notes constantly, expect higher Make operation counts than you'd predict from deal count alone.
4

Zoho CRM Trigger Module > Clock Icon > Scheduling

Set the polling schedule

Click the clock icon on the Zoho CRM trigger module to open the scheduling panel. For most sales teams, 15-minute polling is the right balance — it keeps operation counts low while still delivering timely Slack messages. If your team needs faster updates, 5-minute polling works but triples your monthly operation count. Set the interval using the 'Every N minutes' option and click Save.

  1. 1Click the clock icon on the bottom-left of the Zoho CRM trigger bubble
  2. 2Select 'Every N minutes' from the interval type dropdown
  3. 3Type '15' in the minutes field
  4. 4Click Save
What you should see: The trigger module now shows a clock badge indicating a 15-minute polling interval.
Common mistake — The default polling interval is often 15 minutes. If you need faster delivery, check whether your plan supports shorter intervals before assuming it's a bug.
5

Canvas > Hover Zoho CRM Module > Wrench Icon > Add a router

Add a Router to split by deal stage

Click the small wrench icon that appears when you hover over the right edge of the Zoho CRM module, then select 'Add a router'. A router lets you send each deal down a different path depending on its stage — Closed Won gets a celebration message, Negotiation gets a heads-up, Stalled gets an alert. Make's router creates parallel branches from a single data source. You'll see the canvas split into two default branches with plus-circles at the end of each.

  1. 1Hover over the right edge of the Zoho CRM trigger module
  2. 2Click the small wrench/tool icon that appears
  3. 3Select 'Add a router' from the dropdown
  4. 4Confirm the router appears as a diamond shape between the trigger and new branches
What you should see: A router diamond appears on the canvas connected to the Zoho CRM module, with two empty branch paths extending to the right.
Common mistake — Make routes execute top-to-bottom. If a deal matches the first branch filter, it will NOT fall through to the second branch — unlike some other tools. If you want a deal to trigger multiple branches (e.g., log AND notify), use separate routes with different filter conditions or clone the message step.
6

Router > Branch Line > Funnel Icon > Filter Configuration

Configure router filters for each stage

Click the filter icon (a small funnel) on the line connecting the router to each branch. For Branch 1 (Closed Won), set the condition to: 'Stage' — 'Equal to (case insensitive)' — 'Closed Won'. For Branch 2 (Negotiation), set the condition to 'Stage' — 'Equal to (case insensitive)' — 'Negotiation'. Add a third branch by clicking the plus at the bottom of the router for any additional stages like 'Proposal Sent' or 'Stalled'. Stage names must exactly match what's in your Zoho CRM picklist.

  1. 1Click the funnel icon on the first router branch line
  2. 2Set Condition 1: Field = 'Stage', Operator = 'Equal to (case insensitive)', Value = 'Closed Won'
  3. 3Click OK and repeat for the second branch with 'Negotiation'
  4. 4Click the plus circle below the router diamond to add a third branch for other stages
  5. 5Label each branch by clicking the pencil icon on the branch label (optional but recommended)
What you should see: Each branch line from the router now shows a small blue funnel icon indicating an active filter condition.
Common mistake — Zoho CRM stage names are case-sensitive in the API even though the UI displays them consistently. Pull up your Zoho CRM deal picklist settings and copy the stage names exactly — a trailing space or capitalization difference will silently drop deals on that branch.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Zoho CRM
ZO
notified
7

Router Branch End > + Circle > Slack > Create a Message

Add a Slack module to each branch

Click the plus-circle at the end of the first router branch (Closed Won). Search for 'Slack' and choose 'Create a Message'. Connect your Slack account via OAuth if not already connected — Make needs the bot:write permission scope. Set 'Channel' to the Slack channel where you want deal alerts (e.g., #pipeline-updates). You'll repeat this step for each router branch, using the same channel or different channels per stage.

  1. 1Click the plus-circle at the end of the Closed Won router branch
  2. 2Search for 'Slack' and select it
  3. 3Choose 'Create a Message'
  4. 4Click 'Add' to connect your Slack account via OAuth
  5. 5Set 'Channel' to '#pipeline-updates' or your target channel name
What you should see: A Slack module appears at the end of the branch with your account name visible in the connection dropdown and the channel field populated.
Common mistake — Make's Slack integration requires the channel to exist before the scenario runs. If the channel name you type doesn't match an existing Slack channel exactly (including private channels the bot hasn't been invited to), the message will fail silently with a 'channel_not_found' error.
8

Slack Module > Text Field > Variable Picker

Build the Slack message text for each stage

In the Slack 'Create a Message' module, click into the 'Text' field. Use Make's variable picker (the small gear icon) to insert Zoho CRM fields. Build a message that gives context at a glance — deal name, owner, value, and stage. For Closed Won, add an emoji prefix. For Negotiation, keep it neutral. Use Make's formula bar to format the deal amount with a currency symbol. The message will render in Slack as plain text unless you use Block Kit formatting.

  1. 1Click into the 'Text' field in the Slack module
  2. 2Type '🎉 *Closed Won:* ' for the Closed Won branch prefix
  3. 3Click the gear icon and select 'Deal Name' from the Zoho CRM module variables
  4. 4Continue building: ' | Owner: ' then insert 'Owner > Name'
  5. 5Add ' | Value: $' then insert 'Amount' variable, then ' | Stage: ' then 'Stage'
What you should see: The Text field shows a mix of static text and blue variable pills. A preview at the bottom of the module (if shown) displays realistic-looking text like '🎉 *Closed Won:* Acme Corp Renewal | Owner: Priya Mehta | Value: $42,000 | Stage: Closed Won'.
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.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
9

Canvas > Line Between Trigger and Router > Funnel Icon

Add a stage-change guard filter before the router

The Watch Records trigger fires on any modification to a deal, not just stage changes. Add a filter between the trigger and the router to only continue when the Stage field actually changed. Click the funnel icon on the line between the Zoho CRM module and the router. Set the condition to 'Stage' — 'Is not empty'. This alone won't catch changes, but combined with storing the previous stage (see Pro Tip), it prevents noise. At minimum this blocks deals with a blank stage from flowing through.

  1. 1Click the line connecting the Zoho CRM trigger to the router diamond
  2. 2A funnel icon appears — click it to open the filter editor
  3. 3Set Condition: Field = 'Stage', Operator = 'Does not equal', Value = '' (empty string)
  4. 4Click OK to save the filter
What you should see: The connector line between the trigger and router now shows a blue funnel icon, and a small filter summary label appears on the line.
Common mistake — Make's Watch Records trigger does not expose a 'previous value' natively. Without a data store to record the last known stage, you cannot filter on 'stage changed from X to Y' — you can only filter on current stage value. The scenario will fire on any deal modification where stage matches your router conditions, including duplicate stage reads.
10

Scenario Canvas > Run Once (bottom left)

Run a test and verify Slack delivery

Click 'Run once' at the bottom left of the canvas. Make will poll Zoho CRM immediately and process any deals modified since your trigger start point. Watch the bubbles light up — green means data passed through, orange means the router filtered it out for that branch. Click any lit-up bubble to inspect the data bundle. Check Slack to confirm the message arrived in the correct channel with all fields populated correctly.

  1. 1Click the 'Run once' button at the bottom left of the canvas
  2. 2Watch for green highlights on each module as data flows through
  3. 3Click the Zoho CRM bubble to verify the deal data pulled correctly
  4. 4Click the Slack bubble to see the exact message payload sent
  5. 5Open Slack and confirm the message appeared in the correct channel
What you should see: You see a green checkmark on the Zoho CRM trigger module showing records retrieved, orange indicators on router branches that didn't match (correctly filtered), and a green Slack module on the matching branch. The Slack channel shows the formatted message.
Make
▶ Run once
executed
Slack
Zoho CRM
Zoho CRM
🔔 notification
received
11

Scenario Canvas > Toggle Switch (bottom left) > Activate

Activate the scenario

Once the test passes, click the toggle at the bottom left of the canvas — it switches from grey (off) to blue (on). Make will now run the scenario on your 15-minute schedule automatically. Confirm activation by checking the scenario card on your Scenarios dashboard, which should show 'Active' in green with the next scheduled run time. You can also check the History tab after the first scheduled run to confirm live execution.

  1. 1Click the grey toggle at the bottom left of the canvas
  2. 2Confirm the toggle turns blue and a tooltip says 'Active'
  3. 3Navigate back to the Scenarios dashboard
  4. 4Confirm the scenario card shows 'Active' and a next-run timestamp
What you should see: The scenario card on the dashboard shows a blue 'Active' badge and a 'Next run' time 15 minutes from now.

Paste this into a Make 'Set Variable' module placed between the router and each Slack module. It formats the Amount field with commas and a dollar sign, picks the right emoji based on stage, and formats the Closing Date into a readable string. Add a Tools > Set Variable module, name it 'Formatted Message', and paste this into the Value field using Make's formula editor.

JavaScript — Custom Function{{if(1.Stage = "Closed Won"; "🎉"; if(1.Stage = "Negotiation"; "🤝"; if(1.Stage = "Proposal Sent"; "📄"; if(1.Stage = "Stalled"; "🚨"; "📌"))))}}
▸ Show code
{{if(1.Stage = "Closed Won"; "🎉"; if(1.Stage = "Negotiation"; "🤝"; if(1.Stage = "Proposal Sent"; "📄"; if(1.Stage = "Stalled"; "🚨"; "📌"))))}}
*{{1.Stage}}:* {{1.Deal_Name}}
Owner: {{1.Owner.name}}

... expand to see full code

{{if(1.Stage = "Closed Won"; "🎉"; if(1.Stage = "Negotiation"; "🤝"; if(1.Stage = "Proposal Sent"; "📄"; if(1.Stage = "Stalled"; "🚨"; "📌"))))}}
*{{1.Stage}}:* {{1.Deal_Name}}
Owner: {{1.Owner.name}}
Value: ${{formatNumber(1.Amount; 2; "."; ",")}}
Account: {{1.Account_Name}}
Close Date: {{formatDate(1.Closing_Date; "MMM D, YYYY")}}
{{if(1.Stage = "Stalled"; "
ⓘ This deal has not moved in the current stage. Review needed."; "")}}
{{if(1.Stage = "Closed Won"; "
Great work, " + 1.Owner.name + "! 🏆"; "")}}
{{if(contains(1.Stage; "Negotiation"); "
Close date: " + formatDate(1.Closing_Date; "MMM D, YYYY") + " — " + toString(dateDifference(now; 1.Closing_Date; "days")) + " days out."; "")}}
{{if(1.Amount >= 50000; "
💰 High-value deal — flag for executive review."; "")}}
Source: {{if(1.Lead_Source != ""; 1.Lead_Source; "Not specified")}}
Updated: {{formatDate(1.Modified_Time; "MMM D, YYYY [at] h:mm A")}}

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 Make for this workflow

Use Make for this if your team needs conditional branching across multiple deal stages and you don't want to maintain code. Make's visual router is the right tool when you have 3+ stages that each need different Slack message text — building that with Zapier requires separate Zaps per stage, which becomes a maintenance problem fast. Make also wins if you want to add a Data Store deduplication layer later without rebuilding everything. The one scenario where you'd pick something else: if you need true real-time triggering (under 2 minutes), build a Zoho webhook that hits a Pipedream or n8n HTTP endpoint instead — Make's polling is reliable but not instant.

Cost

Here's the real math. At 15-minute polling: 4 runs/hour × 24 hours × 30 days = 2,880 runs/month. Each run that processes 2 deals across a 3-branch router uses roughly 8–12 operations. At 50 deal updates/month (realistic for a 10-person team), total operations land around 3,500–5,000/month. Make's free tier gives 1,000 operations — you'll hit the ceiling in week one. The Core plan ($9/month, 10,000 ops) handles up to ~200 deal updates/month comfortably. Zapier's equivalent (a 3-path Filter + Slack setup) runs $19.99/month minimum on the Starter plan. Make is cheaper by $10/month for this use case.

Tradeoffs

Zapier handles this with less setup — three Zaps (one per stage) take 20 minutes total and require no router configuration, but you're paying per Zap and managing them separately. n8n's webhook-based approach can achieve true real-time triggering via Zoho's native webhook and n8n's HTTP node, which Make can't match with polling — if your team cares about sub-minute latency, n8n self-hosted wins. Power Automate integrates with Zoho CRM poorly; the connector is third-party and often breaks on schema changes. Pipedream gives you the most flexibility for adding logic (Slack thread replies, deal scoring, CRM writes back) but requires writing JavaScript. Make sits in the right middle: no code, real routing logic, reasonable cost — the right pick for teams that want this working in an afternoon.

Three things you'll hit after setup. First, the polling trigger processes all recently modified deals — if your sales team edits deal notes frequently, your operation count will be 3–5x higher than you'd predict from deal stage change frequency alone. Watch your Make operations dashboard for the first week. Second, Zoho CRM's API rate limit is 5,000 calls per day on Professional plans and 25,000 on Enterprise — you won't hit it with this scenario unless you also have other Make scenarios hitting Zoho, but it's worth knowing the ceiling. Third, if your Zoho CRM uses custom stage names (anything beyond Zoho's default picklist), Make's module won't suggest them in the filter dropdown — you have to type them manually, and a single character mismatch silently drops deals on that branch with no error message.

Ideas for what to build next

  • Add a daily digest instead of per-update pingsBuild a second scenario that runs once at 5pm, pulls all deals modified that day using Zoho CRM's Search Records module, and sends a single Slack summary message — reduces notification fatigue while keeping visibility.
  • Post to stage-specific Slack channelsSplit the router branches to post Closed Won deals to #wins, Stalled deals to #at-risk, and Negotiation to #deals-in-flight — gives each channel a distinct purpose and lets different team members subscribe to only what's relevant to them.
  • Create a Zoho CRM task when a deal enters StalledAdd a second module to the Stalled router branch that creates a follow-up Task in Zoho CRM assigned to the deal owner — pairs the Slack alert with an in-CRM action item so nothing falls through the cracks.

Related guides

Was this guide helpful?
Slack + Zoho CRM overviewMake profile →