

How to Send Zoho CRM Deal Stage Updates to Slack with Zapier
Automatically posts a Slack message to a specified channel whenever a deal's stage changes in Zoho CRM, so your team sees progress updates without checking the CRM.
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 want instant visibility into pipeline movement without giving everyone CRM access.
Not ideal for
Teams moving 50+ deals per day — at that volume, Slack noise becomes a problem and a digest report (batched hourly) is a better pattern.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person SaaS sales team posts all deal stage changes to a #pipeline Slack channel so AEs, SDRs, and the VP of Sales see movement the moment it happens. Before this Zap, reps logged into Zoho CRM manually 4–5 times per day and still missed stage changes for hours — or heard about closed-won deals in the weekly standup, days late. Now a Closed Won deal triggers a celebratory message in under 5 minutes, and a deal stuck in Negotiation for 7+ days is visible to anyone who scrolls up.
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
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Deal Name | Deal_Name | |
| Stage | Stage | |
| Owner Name | Owner.name | |
5 optional fields▸ show
| Amount | Amount |
| Close Date | Closing_Date |
| Account Name | Account_Name |
| Probability | Probability |
| Modified Time | Modified_Time |
Step-by-Step Setup
zapier.com > Dashboard > Create Zap
Create a new Zap in Zapier
Log in at zapier.com and click the orange 'Create Zap' button in the top left sidebar. You'll land on the Zap editor, which shows a two-panel layout — the trigger step on the left and a blank canvas on the right. Give your Zap a name at the top (something like 'Zoho Deal Stage → Slack') so it's findable later. You won't connect any apps yet — this step is just orientation.
- 1Log in at zapier.com
- 2Click 'Create Zap' in the left sidebar
- 3Click the Zap name field at the top and type 'Zoho Deal Stage → Slack'
- 4Confirm the editor opens with a 'Trigger' block and an empty 'Action' block below it
Zap Editor > Trigger > Search Apps
Set Zoho CRM as the trigger app
Click the trigger block and search for 'Zoho CRM' in the app search bar. Select it from the results. You'll then be prompted to choose a trigger event — pick 'Updated Module Entry' from the dropdown. This trigger fires every time a record in any Zoho CRM module is modified, which is how Zapier detects stage changes since Zoho CRM doesn't emit a dedicated 'stage changed' webhook.
- 1Click the trigger block
- 2Type 'Zoho CRM' in the search bar
- 3Select 'Zoho CRM' from the results
- 4Click the 'Trigger Event' dropdown
- 5Select 'Updated Module Entry'
Zap Editor > Trigger > Zoho CRM > Sign In
Connect your Zoho CRM account
Click 'Sign in to Zoho CRM' and a popup window will open asking you to authorize Zapier. Log in with your Zoho credentials and click 'Accept' on the permissions screen. After authorization, Zapier will redirect you back to the editor. Select the newly connected account from the dropdown and confirm it shows your Zoho org name.
- 1Click 'Sign in to Zoho CRM'
- 2Log in with your Zoho email and password in the popup
- 3Click 'Accept' on the Zoho permissions screen
- 4Select your Zoho CRM account from the 'Choose account' dropdown in Zapier
Zap Editor > Trigger > Configure > Module
Configure the trigger module and filter
In the trigger configuration panel, set 'Module' to 'Deals' from the dropdown. Leave the other fields at their defaults for now. Click 'Continue' and then 'Test trigger' — Zapier will pull in the 3 most recently updated deals from your Zoho CRM. Review the returned data to confirm you can see the 'Stage' field in the payload. Note the exact field name Zapier uses — it will appear as something like 'Stage' or 'Deal_Stage' depending on your CRM setup.
- 1Click the 'Module' dropdown and select 'Deals'
- 2Click 'Continue'
- 3Click 'Test trigger'
- 4Scroll through the returned sample data and locate the 'Stage' field
- 5Note the exact label Zapier shows for the stage field
Zap Editor > + > Filter by Zapier > Only continue if
Add a Filter step to catch only stage changes
Click the '+' icon between the trigger and the action to add a step. Search for 'Filter' and select 'Filter by Zapier.' Set it to 'Only continue if...' and map the 'Stage' field from the Zoho trigger. Because Zapier's polling trigger fires on any field update, this filter prevents Slack messages from firing when unrelated fields (like deal amount or contact name) are updated. Add a condition: 'Stage' + 'Text exactly matches' and enter each stage value you want to notify on — or use 'is not empty' if you want all stage changes covered.
- 1Click the '+' icon between trigger and action
- 2Search for 'Filter' and select 'Filter by Zapier'
- 3Click 'Only continue if...'
- 4Click the first field selector and choose 'Stage' from the Zoho trigger data
- 5Set the condition to 'Text exactly matches' and enter your target stage (e.g., 'Closed Won')
- 6Click 'Add AND/OR condition' to add additional stages if needed
Zap Editor > + > Search Apps > Slack > Send Channel Message
Add Slack as the action app
Click the '+' below the filter step to add an action. Search for 'Slack' and select it. Choose 'Send Channel Message' as the action event — this posts a message to a public or private Slack channel. Click 'Continue' and then 'Sign in to Slack' to connect your workspace. You'll be redirected to Slack's OAuth screen to authorize Zapier.
- 1Click the '+' below the filter step
- 2Type 'Slack' in the search bar and select it
- 3Choose 'Send Channel Message' from the action event dropdown
- 4Click 'Continue'
- 5Click 'Sign in to Slack' and authorize Zapier in the Slack popup
Zap Editor > Slack Action > Configure
Configure the Slack message content
In the action configuration panel, select the Slack channel where deal updates should go (e.g., #pipeline or #deals). Then craft the message text using dynamic fields from your Zoho trigger data. Click into the 'Message Text' field and use the insert data icon to map fields: deal name, new stage, amount, owner, and close date. Write a clear, human-readable message — for example: '🎉 *[Deal Name]* moved to *[Stage]* | Amount: $[Amount] | Owner: [Owner Name] | Close Date: [Close Date].' Set 'Send as a bot?' to Yes and optionally customize the bot username to something like 'Zoho CRM'.
- 1Click the 'Channel' dropdown and select your target Slack channel (e.g., #pipeline)
- 2Click into the 'Message Text' field
- 3Type your message template and use the insert icon (lightning bolt) to map Zoho fields: Deal Name, Stage, Amount, Owner Name, Close Date
- 4Set 'Send as a bot?' to Yes
- 5Optionally set Bot Name to 'Zoho CRM' and add a bot icon emoji
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}Zap Editor > Slack Action > Message Text
Add an optional emoji or tone based on stage
If you want Closed Won deals to feel different from Stalled deals in Slack, add a second filter path or use Zapier's 'Paths' feature (available on Professional plan and above). Alternatively, include the stage value dynamically in the message and let your team interpret the tone. The simplest approach: add a static emoji prefix in your message text that you manually change per Zap copy — one Zap for Closed Won (🎉), one for Negotiation (🤝), one for Stalled (⚠️). This avoids Paths entirely and keeps each Zap simple.
- 1Decide whether to use one Zap for all stages or separate Zaps per stage
- 2If one Zap: include the Stage field dynamically and skip emoji differentiation
- 3If separate Zaps: duplicate the Zap, update the filter condition, and change the emoji prefix in the message text
Zap Editor > Slack Action > Test action
Test the full Zap
Click 'Test action' in the Slack step. Zapier will send a real test message to your selected Slack channel using the sample data pulled from Zoho in Step 4. Go to Slack and confirm the message arrived in the correct channel. Check that all dynamic fields populated correctly — no empty brackets or raw IDs. If the message looks right, return to Zapier and click 'Publish Zap.'
- 1Click 'Test action' in the Slack configuration panel
- 2Switch to Slack and open the target channel
- 3Confirm the test message appeared with correct deal name, stage, amount, and owner name
- 4Return to Zapier and click 'Publish Zap' if the message looks correct
zapier.com > My Zaps > [Your Zap] > Task History
Turn on the Zap and verify the polling interval
Once published, your Zap is live and will poll Zoho CRM every 5–15 minutes depending on your Zapier plan (Free/Starter: 15 minutes, Professional: 2 minutes, Team/Company: 1 minute). To confirm polling is working, change a deal's stage in Zoho CRM and wait for the next poll cycle. The Slack message should arrive within the polling window. Check your Zap's task history at zapier.com/app/history to confirm successful runs.
- 1Confirm the Zap toggle is set to 'On' (blue)
- 2Open Zoho CRM and manually move a test deal to a new stage
- 3Wait one polling cycle (5–15 minutes depending on your plan)
- 4Check the Slack channel for the notification
- 5Go to zapier.com/app/history and confirm the task shows as 'Success'
This Code by Zapier step solves one real annoyance: Zoho CRM returns the Amount field as a raw number ('48000') and the Close Date as an ISO string ('2024-03-31'). Paste this into a 'Code by Zapier' step between the Filter and the Slack action. Map the formatted outputs (formattedAmount, formattedCloseDate, stageEmoji) into your Slack message text instead of the raw Zoho fields.
JavaScript — Code Step// Code by Zapier — runs between Filter step and Slack action▸ Show code
// Code by Zapier — runs between Filter step and Slack action // Input fields from Zoho CRM trigger (map these in the input section): // inputData.amount — raw number e.g. '48000'
... expand to see full code
// Code by Zapier — runs between Filter step and Slack action
// Input fields from Zoho CRM trigger (map these in the input section):
// inputData.amount — raw number e.g. '48000'
// inputData.closeDate — ISO date string e.g. '2024-03-31'
// inputData.stage — stage name e.g. 'Closed Won'
const amount = parseFloat(inputData.amount) || 0;
const closeDate = inputData.closeDate ? new Date(inputData.closeDate) : null;
const stage = inputData.stage || '';
// Format currency with commas and dollar sign
const formattedAmount = amount.toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 0,
maximumFractionDigits: 0
});
// Format date as 'Mar 31, 2024'
const formattedCloseDate = closeDate
? closeDate.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })
: 'No close date set';
// Assign emoji based on stage name
const emojiMap = {
'Closed Won': '🎉',
'Closed Lost': '❌',
'Negotiation': '🤝',
'Proposal Sent': '📄',
'Qualification': '🔍',
'Value Proposition': '💡'
};
const stageEmoji = emojiMap[stage] || '📊';
output = [{ formattedAmount, formattedCloseDate, stageEmoji }];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 Zapier for this if your sales team is non-technical, already lives in Zapier for other automations, and can tolerate a 2–15 minute delay between a stage change in Zoho CRM and the Slack message. Setup genuinely takes under 20 minutes — you don't need to write a single line of code, and the Zoho CRM and Slack connectors are both well-maintained. The one scenario where you should pick something else immediately: if your team needs real-time notifications (under 60 seconds) for Closed Won deals, Zapier's polling architecture won't cut it — Make with a Zoho webhook fires in under 30 seconds.
Here's the cost math. Each deal stage change consumes 2–3 Zapier tasks: one for the trigger, one for the filter, one for the Slack action. If your team moves 150 deals through stages per month, that's 300–450 tasks. Zapier's Free plan gives you 100 tasks — you'll hit the ceiling fast. Starter at $19.99/month gives you 750 tasks and 15-minute polling. Professional at $49/month gives you 2,000 tasks and 2-minute polling. Make's equivalent setup costs $9/month for 10,000 operations with 1-minute polling. For this specific workflow, Make is cheaper and faster — Zapier wins only on ease of setup.
Here's how the competitors stack up. Make has a dedicated 'Watch Records' trigger for Zoho CRM that supports webhooks — no polling lag, and it natively tracks the previous field value so you can confirm a stage actually changed (not just any field). n8n lets you self-host and run this for free at any volume, and its IF node handles stage-based routing more cleanly than Zapier Paths. Power Automate integrates with Zoho CRM only through a generic HTTP connector — there's no native Zoho app, making setup significantly more complex. Pipedream offers sub-second execution and lets you write custom logic for stage-based routing with 40+ lines of Node.js, which is overkill here unless you're building something more complex. Zapier is still the right call if your team already uses it, has other Zaps running, and values a single platform over optimal cost or speed.
Three things you'll run into after go-live. First, Zoho CRM's 'Updated Module Entry' trigger fires on every field save — if a rep updates a deal's close date and stage at the same time, you get one trigger but with both fields changed. Your filter catches the stage, but if the stage value didn't change (only the date did), the filter fails and no message sends. Fix this by also testing with a deal that changes stage only. Second, Zoho CRM's amount field returns a raw float ('48000.0') — if you paste it directly into Slack, the message reads '$48000.0' instead of '$48,000.' Use the Code by Zapier step above to format it properly before it hits Slack. Third, if your Zoho admin renames a pipeline stage after the Zap is live, the filter condition will silently stop matching and no messages will fire — there's no error, the Zap just runs with 0 tasks sent. Build a monthly check into your ops calendar to verify stage names still match.
Ideas for what to build next
- →Add a Digest for Daily Deal Summaries — Use Zapier's Digest feature to batch all stage changes into a single daily or weekly Slack message — reduces noise for high-volume pipelines while keeping the team informed.
- →Post to Different Channels by Stage — Use Zapier Paths to route Closed Won notifications to #wins, Stalled deals to #at-risk, and new Proposals to #pipeline — each audience gets only the updates relevant to them.
- →Log Stage Changes to a Google Sheet — Add a second action step that writes each stage change to a Google Sheet row — gives you a searchable, time-stamped audit trail of your full pipeline history without paying for Zoho CRM's reporting add-ons.
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