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

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

Use case type

notification

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

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

Zoho CRM account with Lead read permissions — the connected account must have API access enabled in Zoho settings under Developer Hub > API
Slack workspace with permission to install apps — you or an admin must be able to authorize third-party OAuth apps in your workspace
Pipedream account — free tier works for this workflow up to 10,000 executions/month
At least one existing lead in Zoho CRM — Pipedream needs a real record to generate test event data in Step 4
Pipedream bot invited to the target Slack channel — without this the send step fails silently on private channels

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
First NameFirst_Name
Last NameLast_Name
CompanyCompany
EmailEmail
Lead SourceLead_Source
Record IDid
4 optional fields▸ show
PhonePhone
Lead StatusLead_Status
Lead OwnerOwner.name
Created TimeCreated_Time

Step-by-Step Setup

1

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.

  1. 1Click the blue 'New Workflow' button at the top right of the dashboard
  2. 2Click the workflow title field (defaults to 'My Workflow') and rename it to 'Zoho CRM Lead → Slack'
  3. 3Click 'Save' or press Enter to confirm the name
What you should see: You should see a blank workflow canvas with an empty trigger block labeled 'Add a trigger' at the top.
Common mistake — Pipedream workflows are paused by default when first created. You'll activate it in the final step — don't try to test it before the trigger and steps are fully configured.
2

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.

  1. 1Click the 'Add a trigger' block
  2. 2Type 'Zoho CRM' in the app search field
  3. 3Click 'Zoho CRM' in the results list
  4. 4Select 'New Lead' from the trigger event dropdown
What you should see: The trigger block should display 'Zoho CRM — New Lead' and show a 'Connect Account' button on the right configuration panel.
Common mistake — Zoho CRM's 'New Lead' trigger in Pipedream uses polling under the hood at a 15-minute interval by default — it is NOT an instant webhook unless you configure Zoho's custom functions to push to Pipedream's HTTP source. If sub-minute latency matters, see Step 3 for the webhook approach.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add the Zoho CRM trigger
Slack
SL
module added
3

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.

  1. 1Click 'Connect Account' in the right panel
  2. 2Select 'Connect new account' if no account is listed
  3. 3Sign in to Zoho in the popup window
  4. 4Click 'Accept' on the Zoho OAuth permissions screen
  5. 5Confirm you see the account name appear in the 'Account' dropdown
What you should see: Your Zoho CRM account email should appear in the Account dropdown in the trigger panel, and the authorization popup should close automatically.
Common mistake — If your Zoho org uses a custom domain (e.g., crm.zoho.eu or crm.zoho.com.au), make sure you're signing into the correct regional Zoho instance. Connecting the wrong region returns a valid OAuth token that silently fails to pull leads.
Pipedream settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize Pipedream
popup window
Connected
green checkmark
4

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.

  1. 1Click 'Generate Test Event' button in the trigger panel
  2. 2Wait 5-10 seconds for Pipedream to fetch a real lead from Zoho CRM
  3. 3Expand the JSON output to confirm you see fields like First_Name, Last_Name, Company, Lead_Source
  4. 4Click 'Continue' to move to the next step
What you should see: You should see a JSON object in the trigger output panel containing at least 10 lead fields including the lead's name, company, email, and created timestamp.
5

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.

  1. 1Click the '+' button below the Zoho CRM trigger block
  2. 2Click 'Run Node.js code' from the step type list
  3. 3Rename the step to 'Format Lead Message' by clicking the step title
  4. 4Paste the formatting code from the Pro Tip section below into the code editor
What you should see: A code editor panel should open on the right with a default async function. After pasting the pro tip code, the step name should show 'Format Lead Message'.
Common mistake — Zoho field names in the API response use underscores and title case (e.g., First_Name, Lead_Source, Mobile). Reference them from the trigger as steps.trigger.event.First_Name — not firstName or first_name, which will return undefined.

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)
    };
  }
});
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
6

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.

  1. 1Click the 'Test' button at the top of the code step panel
  2. 2Switch to the 'Results' tab to see the function output
  3. 3Confirm the formatted message text contains real lead data, not 'undefined'
  4. 4If any field is undefined, check the field name against the trigger JSON output
What you should see: The Results tab should show a formatted string or object with the lead's full name, company, source, and a Zoho CRM URL, all with real values from the test lead.

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)
    };
  }
});
Pipedream
▶ Deploy & test
executed
Slack
Zoho CRM
Zoho CRM
🔔 notification
received
7

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.

  1. 1Click '+' below the Format Lead Message step
  2. 2Search for 'Slack' in the app list
  3. 3Select 'Send a Message' as the action
  4. 4Click 'Connect Account' and authorize Pipedream in your Slack workspace
  5. 5Confirm the account email appears in the Account dropdown
What you should see: The Slack step should show your workspace name in the Account field and display the channel and message configuration fields.
Common mistake — If your Slack workspace requires admin approval for third-party apps, the OAuth window will hang after login. Have your Slack admin pre-approve the Pipedream app at api.slack.com/apps before you try to connect.
8

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.

  1. 1Click the Channel field and type or select your target channel (e.g., #new-leads)
  2. 2Click the Message Text field
  3. 3Type '{{' and use the reference picker to select steps > format_lead_message > $return_value > text
  4. 4Optionally, paste the blocks array reference into the 'Blocks' field for a richer card format
What you should see: The Channel field should show the channel name and the Message Text field should show a reference expression like {{steps.format_lead_message.$return_value.text}} rather than a hardcoded string.
Common mistake — Pipedream's channel field accepts channel names (with #) and channel IDs. If the bot isn't a member of the target channel, the message will silently fail. Invite the Pipedream bot to the channel with /invite @Pipedream before testing.
9

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.

  1. 1Click the 'Test Workflow' button at the top of the canvas
  2. 2Watch each step indicator turn green as it runs
  3. 3Open Slack and check the target channel for the test message
  4. 4If a step shows a red error indicator, click it to read the error detail
What you should see: All three steps (Zoho trigger, Format code, Slack send) should show green checkmarks and the test lead notification should appear in your Slack channel with correct lead data.
10

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.

  1. 1Click the 'Deploy' button in the top right of the workflow canvas
  2. 2Confirm the deployment in the dialog if prompted
  3. 3Check that the workflow status badge changes to 'Active' (green)
  4. 4Add a real test lead in Zoho CRM to verify the live workflow fires
What you should see: The workflow status should show 'Active' with a green indicator, and the workflow will appear in your Pipedream dashboard under 'Active Workflows'.
Common mistake — After deploying, Pipedream only picks up leads created after the deployment timestamp. Leads added while the workflow was in draft will not be backfilled. If you need to catch up on older leads, trigger a manual run against a date-filtered Zoho API call.

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

Cost

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.

Tradeoffs

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 territoryAdd 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 messageUse 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 notificationInsert 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

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