

How to Send Zoho CRM Lead Alerts to Slack with Pipedream
Instantly posts a Slack channel message with lead details every time a new lead is created in Zoho 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 who need instant Slack alerts when a new lead lands in Zoho CRM so they can assign and respond within minutes.
Not ideal for
Teams that want a daily digest of new leads — use a scheduled workflow with Make or n8n instead.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person SaaS sales team receives 40-80 inbound leads per day from web forms that push directly into Zoho CRM. Before this workflow, reps refreshed CRM views every hour and leads sat uncontacted for 2-3 hours on average. Now every new lead fires a Slack message to #new-leads within 10 seconds, including company name, lead source, and phone number, so the first available rep can claim it immediately.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 | ||
| First Name | First_Name | |
| Last Name | Last_Name | |
| Company | Company | |
Email | ||
| Lead Source | Lead_Source | |
| Record ID | id | |
4 optional fields▸ show
| Phone | Phone |
| Lead Status | Lead_Status |
| Lead Owner | Owner.name |
| Created Time | Created_Time |
Step-by-Step Setup
pipedream.com > Dashboard > New Workflow
Create a new Pipedream workflow
Go to pipedream.com and sign in. Click 'New Workflow' in the top right of the dashboard. You'll land on a blank workflow canvas with a trigger slot at the top. Give the workflow a name like 'Zoho CRM Lead → Slack' in the title field at the top of the canvas so you can find it later.
- 1Click the blue 'New Workflow' button at the top right of the dashboard
- 2Click the workflow title field (defaults to 'My Workflow') and rename it to 'Zoho CRM Lead → Slack'
- 3Click 'Save' or press Enter to confirm the name
Workflow Canvas > Add a trigger > Zoho CRM > New Lead
Add the Zoho CRM trigger
Click the 'Add a trigger' block at the top of the canvas. Search for 'Zoho CRM' in the app search box. Select 'New Lead' as the trigger event — this fires an instant webhook every time a new lead record is created. Pipedream will show you the trigger configuration panel on the right side of the screen.
- 1Click the 'Add a trigger' block
- 2Type 'Zoho CRM' in the app search field
- 3Click 'Zoho CRM' in the results list
- 4Select 'New Lead' from the trigger event dropdown
Trigger Configuration Panel > Connect Account > Zoho CRM OAuth
Connect your Zoho CRM account
Click 'Connect Account' in the trigger configuration panel. A popup window will open asking you to authorize Pipedream to access Zoho CRM via OAuth. Sign in with your Zoho credentials and click 'Accept' on the permissions screen. Pipedream needs read access to leads — make sure the account you connect has CRM Lead read permissions in Zoho.
- 1Click 'Connect Account' in the right panel
- 2Select 'Connect new account' if no account is listed
- 3Sign in to Zoho in the popup window
- 4Click 'Accept' on the Zoho OAuth permissions screen
- 5Confirm you see the account name appear in the 'Account' dropdown
Trigger Configuration Panel > Generate Test Event
Configure the trigger and load sample data
With the account connected, set the polling interval or click 'Generate Test Event' to pull a real lead from Zoho CRM into Pipedream. Pipedream will fetch the most recent lead record and display it as structured JSON in the trigger output panel. You'll use these fields to build the Slack message in the next steps. Click 'Continue' once you see lead data.
- 1Click 'Generate Test Event' button in the trigger panel
- 2Wait 5-10 seconds for Pipedream to fetch a real lead from Zoho CRM
- 3Expand the JSON output to confirm you see fields like First_Name, Last_Name, Company, Lead_Source
- 4Click 'Continue' to move to the next step
Workflow Canvas > + > Run Node.js code
Add a Node.js code step to format the Slack message
Click the '+' button below the trigger block to add a new step. Select 'Run Node.js code' from the step type options. This code step will pull fields from the Zoho trigger output and construct a clean, readable Slack message. You'll write or paste the formatting logic here before sending it to Slack. This is where Pipedream's code-first approach pays off — you can pull, rename, and format any Zoho field without a separate formatter tool.
- 1Click the '+' button below the Zoho CRM trigger block
- 2Click 'Run Node.js code' from the step type list
- 3Rename the step to 'Format Lead Message' by clicking the step title
- 4Paste the formatting code from the Pro Tip section below into the code editor
This code runs in the Node.js code step between the Zoho trigger and the Slack step. Paste it into the code editor in Step 5. It formats a Slack Block Kit message with a header, lead details, and a direct CRM link — much richer than a plain text message. It also includes basic error handling so the workflow logs a clear message instead of crashing if a field is missing.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
// Pull lead data from the Zoho CRM trigger... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
// Pull lead data from the Zoho CRM trigger
const lead = steps.trigger.event;
// Safely extract fields with fallback values
const firstName = lead.First_Name || '';
const lastName = lead.Last_Name || 'Unknown';
const fullName = `${firstName} ${lastName}`.trim();
const company = lead.Company || 'No company listed';
const email = lead.Email || 'No email';
const phone = lead.Phone || 'No phone';
const source = lead.Lead_Source || 'Unknown source';
const status = lead.Lead_Status || 'New';
const ownerName = lead.Owner?.name || 'Unassigned';
const leadId = lead.id;
if (!leadId) {
throw new Error('Lead ID missing from Zoho trigger payload — cannot build CRM link');
}
// Build the direct Zoho CRM link for this lead
const crmUrl = `https://crm.zoho.com/crm/org/leads/${leadId}`;
// Format a Slack Block Kit message for a richer notification card
const blocks = [
{
type: 'header',
text: {
type: 'plain_text',
text: `🆕 New Lead: ${fullName}`,
emoji: true
}
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Company:*\n${company}` },
{ type: 'mrkdwn', text: `*Source:*\n${source}` },
{ type: 'mrkdwn', text: `*Email:*\n${email}` },
{ type: 'mrkdwn', text: `*Phone:*\n${phone}` },
{ type: 'mrkdwn', text: `*Status:*\n${status}` },
{ type: 'mrkdwn', text: `*Owner:*\n${ownerName}` }
]
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'View in Zoho CRM' },
url: crmUrl,
style: 'primary'
}
]
}
];
// Return both plain text fallback and blocks for the Slack step
return {
text: `New lead: ${fullName} from ${company} (${source}) — ${crmUrl}`,
blocks: JSON.stringify(blocks)
};
}
});channel: {{channel}}
ts: {{ts}}
Code Step Panel > Test
Test the code step
Click 'Test' in the code step panel to run it against the sample lead data fetched in Step 4. Pipedream will execute the Node.js function and show the return value in the 'Results' tab. Verify that the formatted message string looks correct — you should see the lead's name, company, source, email, and a CRM link in the output. Fix any undefined fields before moving on.
- 1Click the 'Test' button at the top of the code step panel
- 2Switch to the 'Results' tab to see the function output
- 3Confirm the formatted message text contains real lead data, not 'undefined'
- 4If any field is undefined, check the field name against the trigger JSON output
This code runs in the Node.js code step between the Zoho trigger and the Slack step. Paste it into the code editor in Step 5. It formats a Slack Block Kit message with a header, lead details, and a direct CRM link — much richer than a plain text message. It also includes basic error handling so the workflow logs a clear message instead of crashing if a field is missing.
JavaScript — Code Stepexport default defineComponent({▸ Show code
export default defineComponent({
async run({ steps, $ }) {
// Pull lead data from the Zoho CRM trigger... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
// Pull lead data from the Zoho CRM trigger
const lead = steps.trigger.event;
// Safely extract fields with fallback values
const firstName = lead.First_Name || '';
const lastName = lead.Last_Name || 'Unknown';
const fullName = `${firstName} ${lastName}`.trim();
const company = lead.Company || 'No company listed';
const email = lead.Email || 'No email';
const phone = lead.Phone || 'No phone';
const source = lead.Lead_Source || 'Unknown source';
const status = lead.Lead_Status || 'New';
const ownerName = lead.Owner?.name || 'Unassigned';
const leadId = lead.id;
if (!leadId) {
throw new Error('Lead ID missing from Zoho trigger payload — cannot build CRM link');
}
// Build the direct Zoho CRM link for this lead
const crmUrl = `https://crm.zoho.com/crm/org/leads/${leadId}`;
// Format a Slack Block Kit message for a richer notification card
const blocks = [
{
type: 'header',
text: {
type: 'plain_text',
text: `🆕 New Lead: ${fullName}`,
emoji: true
}
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Company:*\n${company}` },
{ type: 'mrkdwn', text: `*Source:*\n${source}` },
{ type: 'mrkdwn', text: `*Email:*\n${email}` },
{ type: 'mrkdwn', text: `*Phone:*\n${phone}` },
{ type: 'mrkdwn', text: `*Status:*\n${status}` },
{ type: 'mrkdwn', text: `*Owner:*\n${ownerName}` }
]
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'View in Zoho CRM' },
url: crmUrl,
style: 'primary'
}
]
}
];
// Return both plain text fallback and blocks for the Slack step
return {
text: `New lead: ${fullName} from ${company} (${source}) — ${crmUrl}`,
blocks: JSON.stringify(blocks)
};
}
});Workflow Canvas > + > Slack > Send a Message
Add the Slack step
Click '+' below the code step to add another step. Search for 'Slack' and select 'Send a Message' as the action. Connect your Slack account via OAuth — you'll need to authorize the Pipedream Slack app in your workspace. Pipedream will ask for the bot:chat:write and channels:read scopes at minimum.
- 1Click '+' below the Format Lead Message step
- 2Search for 'Slack' in the app list
- 3Select 'Send a Message' as the action
- 4Click 'Connect Account' and authorize Pipedream in your Slack workspace
- 5Confirm the account email appears in the Account dropdown
Slack Step Configuration > Channel > Message Text
Configure the Slack message
In the Slack step configuration panel, set the Channel field to the target channel (e.g., #new-leads). In the Message Text field, reference the formatted output from Step 5 using Pipedream's expression syntax: type '{{steps.format_lead_message.$return_value.text}}' or click the reference builder and navigate to the code step's return value. You can also use Block Kit JSON in the 'Blocks' field for richer formatting — the pro tip code returns a blocks array you can wire directly here.
- 1Click the Channel field and type or select your target channel (e.g., #new-leads)
- 2Click the Message Text field
- 3Type '{{' and use the reference picker to select steps > format_lead_message > $return_value > text
- 4Optionally, paste the blocks array reference into the 'Blocks' field for a richer card format
Workflow Canvas > Test Workflow
Test the full workflow end-to-end
Click 'Test Workflow' at the top of the canvas to run all steps against the sample Zoho lead data from Step 4. Watch each step turn green as it completes. Check your Slack channel — a message should appear within 5 seconds. If any step fails, click it to see the error output and check the troubleshooting section below.
- 1Click the 'Test Workflow' button at the top of the canvas
- 2Watch each step indicator turn green as it runs
- 3Open Slack and check the target channel for the test message
- 4If a step shows a red error indicator, click it to read the error detail
Workflow Canvas > Deploy
Deploy and activate the workflow
Once the test passes, click 'Deploy' in the top right corner of the canvas. Pipedream will activate the workflow and begin polling Zoho CRM for new leads at the configured interval. The workflow status indicator at the top will change from gray to green. From this point, every new lead added to Zoho CRM will trigger a Slack message automatically.
- 1Click the 'Deploy' button in the top right of the workflow canvas
- 2Confirm the deployment in the dialog if prompted
- 3Check that the workflow status badge changes to 'Active' (green)
- 4Add a real test lead in Zoho CRM to verify the live workflow fires
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 Pipedream for this if your team has at least one person who can read JavaScript. The Zoho CRM trigger is straightforward to configure, and the Node.js code step lets you transform lead data exactly how you need it — including field lookups, conditional formatting, and Block Kit message construction — without bolting on a separate formatter tool. Pipedream also handles auth for both Zoho and Slack cleanly, and the execution logs make debugging fast. The one scenario where you'd skip Pipedream: if nobody on your team writes code at all, Zapier has a point-and-click Zoho CRM to Slack path that takes 6 minutes with no code required.
Pipedream's free tier includes 10,000 workflow executions per month. At one new lead per execution, you'd need 10,001 leads per month before hitting the ceiling — most sales teams won't get there. The $19/month Basic plan raises that to 20,000 executions and removes the 30-second timeout on code steps. Compare that to Zapier, where 750 tasks/month on the free tier runs out fast if your lead volume is moderate, and the $19.99/month Starter plan only gets you 750 tasks — far fewer than Pipedream. For this specific workflow, Pipedream is cheaper at any meaningful volume.
Zapier's Zoho CRM + Slack integration is the most beginner-friendly option — no code, clean UI, done in under 10 minutes. Make's scenario builder lets you add conditional routing to multiple Slack channels using filters and routers, which is slightly easier to visualize than Pipedream's code branches. n8n gives you self-hosted control and a visual workflow builder that's almost as powerful as Pipedream's code steps, useful if your Zoho org has strict data residency requirements. Power Automate has a Zoho CRM connector but it's limited to polling and requires a premium license tier. Pipedream beats all of them here because the combination of instant webhook processing (when you set it up via HTTP source), real Node.js, and clean OAuth handling for both Zoho and Slack in one tool is the most production-ready setup for a developer-adjacent team.
Three things you'll run into after going live. First, Zoho's 'Created_Time' field returns a string in ISO 8601 format with a timezone offset that may not match your team's timezone — format it in the code step using new Date(lead.Created_Time).toLocaleString('en-US', {timeZone: 'America/New_York'}) or whatever your team's timezone is. Second, Zoho CRM's API has a 5,000 call/day limit on Standard plans — Pipedream's polling adds 96 calls/day per workflow, but if you have other integrations hitting the same org, check your API usage in Zoho Admin > Developer Hub > API Usage before deploying. Third, if the Slack message includes a 'View in Zoho CRM' button and your team uses Zoho's EU or AU data center, the URL prefix will be crm.zoho.eu or crm.zoho.com.au — not crm.zoho.com. Update the URL construction in the code step to match your org's actual region or the link will 404.
Ideas for what to build next
- →Filter notifications by lead source or territory — Add a filter step between the Zoho trigger and the Slack step using Pipedream's built-in filter or a conditional code block. Route enterprise leads to #enterprise-leads and SMB leads to #smb-leads based on the Lead_Source or Annual_Revenue field.
- →Update Zoho lead status when a rep reacts to the Slack message — Use Slack's Events API to listen for emoji reactions on the notification message (e.g., 👋 means 'I'm taking this lead') and fire a second Pipedream workflow that updates the lead's status and owner in Zoho CRM via the Zoho API.
- →Add lead enrichment before the Slack notification — Insert a step between the trigger and the Slack send that calls Clearbit or Apollo.io to enrich the lead with LinkedIn URL, company size, and funding data. Include those fields in the Slack Block Kit card so reps have full context before they make first contact.
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