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

How to Send Zoho CRM VIP Case Alerts to Slack with n8n

Fires a Slack alert to your support channel the moment a high-value or VIP account opens a new case in Zoho CRM, using a webhook and n8n to filter and format the message.

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

Best for

Support teams that need to catch high-value customer cases within seconds of creation, without manually watching Zoho CRM.

Not ideal for

Teams on Zoho's free plan — webhook triggers in Zoho CRM require a paid plan (Standard or above).

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person SaaS company manages 200+ active accounts in Zoho CRM and tags enterprise customers with a custom field called 'Account Tier: VIP'. Before this workflow, the on-call support lead checked Zoho manually every hour and VIP cases often sat unacknowledged for 45–90 minutes. Now, the moment a VIP account opens a case, a formatted Slack message lands in #support-vip with the account name, case subject, priority, and a direct link to the record.

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 n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. 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 on Standard plan or above — Webhook actions in Workflow Rules are not available on the free plan
Zoho CRM administrator access to create Workflow Rules and configure webhook actions under Setup > Automation
Slack app with chat:write and chat:write.public OAuth scopes — create one at api.slack.com/apps and install it to your workspace before Step 7
n8n instance (self-hosted or n8n Cloud) with a publicly reachable URL — Zoho cannot call a localhost address, so local n8n without a tunnel like ngrok will not work
A consistent field or picklist value in Zoho CRM that identifies VIP or high-value accounts — without this, you cannot filter cases reliably in Step 3 or Step 6

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Case IDid
Case SubjectSubject
Account NameAccount_Name
Case PriorityPriority
Case StatusStatus
5 optional fields▸ show
Case OwnerOwner
Contact NameContact_Name
DescriptionDescription
Account Tier (custom field)Account_Tier__c
Created TimeCreated_Time

Step-by-Step Setup

1

n8n Canvas > + Add Node > Trigger > Webhook

Create a Webhook node in n8n

Open your n8n instance and click the '+' button to create a new workflow. Add a Webhook node as the trigger — this is what Zoho CRM will call when a new case is created. Set the HTTP Method to POST. n8n will generate a unique webhook URL once you save; copy it now. Leave Authentication set to None for initial testing — you'll lock this down before going live.

  1. 1Click '+ Add first step' on the empty canvas
  2. 2Search for 'Webhook' in the node panel and select it
  3. 3Set HTTP Method to 'POST'
  4. 4Set Path to a memorable slug like 'zoho-vip-case'
  5. 5Click 'Copy Webhook URL' and save it to a notepad
What you should see: You should see a Webhook node on the canvas with a green URL displayed. The node shows 'Waiting for test event' when you click 'Listen for Test Event'.
Common mistake — n8n gives you two URLs: a Test URL and a Production URL. Use the Test URL now for Zoho setup. You must swap to the Production URL before activating the workflow or live events will fire into a dead end.
2

Zoho CRM > Setup > Automation > Workflow Rules > + Create Rule

Create a Workflow Rule in Zoho CRM

In Zoho CRM, navigate to Setup > Automation > Workflow Rules and create a new rule targeting the Cases module. Set the trigger to 'Record Action: Create' so it only fires on new cases. Give the rule a clear name like 'New Case — Webhook to n8n'. You'll add the webhook call in a later sub-step; set the condition first.

  1. 1Go to Setup (gear icon, top right) > Automation > Workflow Rules
  2. 2Click '+ Create Rule'
  3. 3Set Module to 'Cases'
  4. 4Set 'When' to 'A record is Created'
  5. 5Name the rule 'New Case — VIP Alert to n8n' and click Next
What you should see: You should be on the Condition step of the Workflow Rule wizard with the Cases module and 'Created' trigger confirmed.
Common mistake — Zoho's workflow rule editor is module-specific. If you accidentally select 'Contacts' instead of 'Cases', the webhook payload will have a completely different schema and your n8n field mapping will break.
3

Zoho CRM > Workflow Rule Wizard > Step 2: Condition

Set the VIP filter condition in Zoho

Add a condition so only VIP or high-value accounts trigger the webhook — otherwise every case floods your Slack channel. In the Condition step, click 'Add Condition'. Filter on the field that marks high-value accounts in your CRM. Common options: 'Account Name contains VIP', a custom picklist field like 'Account Tier equals Enterprise', or 'Contact Role equals Key Decision Maker'. Use the condition that matches how your team actually tags accounts.

  1. 1Click 'Add Condition' in the Condition step
  2. 2Set Field to your VIP marker field (e.g., 'Account Tier')
  3. 3Set Operator to 'equals'
  4. 4Set Value to 'Enterprise' or 'VIP' depending on your picklist values
  5. 5Click 'Next' to proceed to Actions
What you should see: The condition row shows your chosen field, operator, and value in plain English. Example: 'Account Tier | equals | VIP'.
Common mistake — If your VIP flag lives on the Account record rather than the Case record, you cannot filter on it directly in the Cases workflow rule condition — Zoho only exposes Case-level and related Contact fields here. In that scenario, leave the condition open and do the VIP filtering inside n8n using a Zoho CRM lookup node instead.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Zoho CRM
ZO
notified
4

Zoho CRM > Workflow Rule Wizard > Step 3: Actions > Add Action > Webhook

Add the webhook action in Zoho

In the Actions step of the Workflow Rule wizard, click 'Add Action' and choose 'Webhook'. Click 'Configure Webhook' and paste the n8n webhook URL you copied in Step 1. Set Method to POST and Content Type to application/json. In the body, select 'Custom Body' and enter a JSON payload that includes all the case fields you need. Zoho provides merge variables like ${Cases.Subject} to pull live field values into the payload.

  1. 1Click 'Add Action' and select 'Webhook'
  2. 2Click '+ New Webhook' or 'Configure Webhook'
  3. 3Paste the n8n Test Webhook URL into the URL field
  4. 4Set Method to POST, Content Type to application/json
  5. 5In the body, click 'Custom Body' and paste your JSON template (see field_mapping section for required fields)
  6. 6Click 'Save' on the webhook, then 'Save' on the workflow rule
What you should see: The workflow rule appears in your Workflow Rules list with status 'Active'. The action column shows 'Webhook' as the configured action.
Common mistake — Copy the webhook URL carefully — it expires if you regenerate it, and any scenarios using the old URL will silently stop working.
5

n8n Canvas > Webhook Node > Listen for Test Event

Test the Zoho-to-n8n connection

Back in n8n, click your Webhook node and hit 'Listen for Test Event'. Then in Zoho CRM, manually create a test case on a VIP account to trigger the rule. Within 10–20 seconds, n8n should receive the payload. Check the Input panel on the right side of the Webhook node — you should see the full JSON object from Zoho. Verify all the fields you need (case ID, subject, account name, priority, owner) are present in the payload.

  1. 1Click the Webhook node in n8n to open its panel
  2. 2Click 'Listen for Test Event' (blue button)
  3. 3Switch to Zoho CRM and create a new Case on a VIP account
  4. 4Return to n8n and confirm the payload appeared in the Input panel
  5. 5Expand the JSON tree to verify all expected fields are present
What you should see: The Webhook node shows 'Event received' and you can see a JSON object in the Input panel containing fields like case_id, subject, account_name, priority, and status.
Common mistake — If the payload arrives but 'account_name' is blank, Zoho may not have included the related Account lookup field in your webhook body. Go back to the Zoho webhook configuration and explicitly add ${Cases.Account Name} as a merge variable in the custom body.
n8n
▶ Run once
executed
Slack
Zoho CRM
Zoho CRM
🔔 notification
received
6

n8n Canvas > + Add Node > Core > Code

Add a Code node to filter and format the alert

Add a Code node after the Webhook node. This is where you validate the VIP condition (if you skipped Zoho-side filtering in Step 3) and build the Slack message payload. Use n8n's $input.first().json to access the incoming Zoho data. Write logic to check your VIP field, set a priority color for the Slack attachment, and construct the message text. See the pro_tip_code section for a complete ready-to-paste example.

  1. 1Click '+' after the Webhook node to add a new node
  2. 2Search for 'Code' and select it
  3. 3Set Language to 'JavaScript'
  4. 4Paste your transformation logic into the editor (see pro_tip_code below)
  5. 5Click 'Test Step' to verify the output object looks correct
What you should see: The Code node output panel shows a JSON object with fields: slackChannel, messageText, color, caseUrl, accountName, priority — ready to pipe into the Slack node.
Common mistake — n8n's Code node runs in a sandboxed environment with no access to external npm packages unless you're self-hosting with custom packages enabled. Stick to native JS — no axios, no lodash.

Paste this into the Code node added in Step 6. It reads the Zoho webhook payload, validates the VIP account tier, picks a Slack color based on case priority, truncates the description to 200 characters, formats the created timestamp in human-readable EST, and returns a clean object that the Slack node can consume directly without any extra nodes.

JavaScript — Code Node// n8n Code Node — Zoho CRM VIP Case Alert Formatter
▸ Show code
// n8n Code Node — Zoho CRM VIP Case Alert Formatter
// Paste into: Code node between Webhook trigger and Slack node
const item = $input.first().json;

... expand to see full code

// n8n Code Node — Zoho CRM VIP Case Alert Formatter
// Paste into: Code node between Webhook trigger and Slack node

const item = $input.first().json;

// --- VIP Validation ---
// Remove this block if filtering is already handled in Zoho Workflow Rule conditions
const vipTiers = ['VIP', 'Enterprise', 'Strategic'];
const accountTier = item.Account_Tier__c || '';
if (!vipTiers.includes(accountTier)) {
  // Return empty array — n8n will skip downstream nodes silently
  return [];
}

// --- Priority Color Mapping ---
const colorMap = {
  Critical: '#FF0000',  // Red
  High:     '#FF8C00',  // Orange
  Normal:   '#FFC300',  // Yellow
  Low:      '#36A64F',  // Green
};
const color = colorMap[item.Priority] || '#AAAAAA';

// --- Priority Emoji ---
const emojiMap = {
  Critical: '🚨',
  High:     '⚠️',
  Normal:   'ℹ️',
  Low:      '🔵',
};
const emoji = emojiMap[item.Priority] || '📋';

// --- Description Truncation ---
const rawDescription = item.Description || 'No description provided.';
const shortDescription = rawDescription.length > 200
  ? rawDescription.substring(0, 197) + '...'
  : rawDescription;

// --- Timestamp Formatting ---
// Zoho sends ISO 8601 — convert to readable local string
const createdDate = new Date(item.Created_Time);
const formattedDate = createdDate.toLocaleString('en-US', {
  timeZone: 'America/New_York',
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: '2-digit',
  timeZoneName: 'short',
});

// --- Case URL ---
// Replace YOUR_ORG_ID with your Zoho org ID (found in Zoho CRM URL)
const orgId = 'YOUR_ORG_ID';
const caseUrl = `https://crm.zoho.com/crm/${orgId}/Cases/${item.id}`;

// --- Slack Channel Routing ---
// Route Critical cases to a separate escalation channel
const slackChannel = item.Priority === 'Critical'
  ? '#support-critical'
  : '#support-vip';

// --- Output Object ---
return [{
  json: {
    slackChannel,
    messageText: `${emoji} *${accountTier} Case Alert* — ${item.Account_Name}`,
    color,
    caseSubject:   item.Subject,
    priority:      item.Priority,
    status:        item.Status,
    owner:         item.Owner || 'Unassigned',
    contactName:   item.Contact_Name || 'Unknown',
    description:   shortDescription,
    createdAt:     formattedDate,
    caseUrl,
    accountName:   item.Account_Name,
  }
}];
7

n8n Canvas > Slack Node > Credentials > Create New > Slack OAuth2

Connect your Slack account in n8n

Add a Slack node after the Code node. Click 'Create New Credential' and choose OAuth2. You'll be redirected to Slack's OAuth page — select the workspace and the channel(s) you want the bot to post in. n8n requires a Slack app with at minimum chat:write and chat:write.public scopes. If you don't have a Slack app yet, create one at api.slack.com/apps in under 5 minutes before this step.

  1. 1Click '+' after the Code node and search for 'Slack'
  2. 2Select the Slack node and set Resource to 'Message', Operation to 'Send'
  3. 3Click 'Credential for Slack API' > 'Create New'
  4. 4Select 'OAuth2' and click 'Connect my account'
  5. 5Authorize the Slack app in the popup and confirm the green 'Connected' badge appears
What you should see: The Slack node shows a green 'Connected' badge next to your credential name and the Channel field is now editable.
Common mistake — Slack's OAuth grants bot-level access, not user-level. The bot must be manually invited to private channels with /invite @YourBotName before it can post there. Posting to a private channel without invitation returns a channel_not_found error even though the channel exists.
n8n settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize n8n
popup window
Connected
green checkmark
8

n8n Canvas > Slack Node > Parameters

Configure the Slack message fields

In the Slack node, set Channel to the expression pulling from your Code node output — drag from the Input panel or type {{ $json.slackChannel }}. Set Text to {{ $json.messageText }}. Scroll down and enable 'Attachments' to add a colored sidebar (red for critical, orange for high). Map the color and fields from your Code node output. This gives the alert a scannable layout in Slack instead of a wall of text.

  1. 1Set Channel to {{ $json.slackChannel }} using the expression editor
  2. 2Set Text to {{ $json.messageText }}
  3. 3Toggle 'Attachments' on
  4. 4Set Attachment Color to {{ $json.color }}
  5. 5Add attachment fields: 'Account' → {{ $json.accountName }}, 'Priority' → {{ $json.priority }}, 'Case URL' → {{ $json.caseUrl }}
What you should see: When you click 'Test Step', a real Slack message appears in your target channel with the colored sidebar, account name, priority, and a clickable case link.
Common mistake — Slack's Block Kit and legacy Attachments are both available in n8n, but the Slack node's built-in 'Attachments' field uses the legacy format. That format still works but Slack may deprecate it. If your team wants interactive buttons, switch to 'Blocks' and use the raw JSON body option instead.
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
9

n8n Canvas > Slack Node > ⋯ Menu > Add Error Handler

Add an error handler node

Click the three-dot menu on the Slack node and select 'Add Error Handler'. Add a second Slack node connected to the error output, pointing to a different channel like #alerts-errors. This way, if Zoho sends a malformed payload or Slack's API is down, the on-call engineer gets notified instead of the failure disappearing silently. Set the error message text to include {{ $json.message }} so you can see the actual error.

  1. 1Right-click (or click ⋯) on the Slack node
  2. 2Select 'Add Error Handler'
  3. 3A red error connector appears — click '+' on it
  4. 4Add another Slack node connected to this error output
  5. 5Set its Channel to '#alerts-errors' and Text to 'VIP case alert failed: {{ $json.message }}'
What you should see: The canvas shows your main Slack node with a normal green connector and a red error connector going to a second Slack node targeting your error channel.
10

n8n Canvas > Webhook Node > Production URL | Canvas Top-Right > Active Toggle

Activate the workflow and swap to Production URL

Before activating, go back to your Webhook node and copy the Production URL (not the Test URL — it starts with /webhook/ not /webhook-test/). Update your Zoho CRM webhook configuration to use this Production URL. Then toggle the workflow Active in n8n using the toggle in the top-right corner. Run one more real test in Zoho by creating a VIP case and confirm the Slack message arrives within 15 seconds.

  1. 1Click the Webhook node and copy the 'Production URL'
  2. 2Go to Zoho CRM > Setup > Automation > Workflow Rules > your rule > Edit Webhook action
  3. 3Replace the Test URL with the Production URL
  4. 4Save the webhook in Zoho
  5. 5Back in n8n, click the Active toggle (top right) to turn it on — it should turn blue
What you should see: The workflow shows 'Active' status in n8n. Creating a VIP case in Zoho CRM triggers a Slack message in your support channel within 15 seconds.
Common mistake — If you forget to swap to the Production URL, the workflow will appear active in n8n but Zoho will be posting to the test endpoint which n8n only listens to during manual test sessions. You'll get silence in Slack with no error — hard to debug.

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 n8n for this if your team is comfortable maintaining a self-hosted instance or you're on n8n Cloud, you need custom filtering logic that goes beyond what Zoho's native conditions support, or you want to route alerts differently based on account owner, region, or case type without paying per-task fees. The one scenario where you'd skip n8n: if your team has zero technical staff and needs this live in 20 minutes — Zapier's Zoho CRM integration with a pre-built Slack step is faster to configure, even if it costs more at scale.

Cost

n8n Cloud costs $20/month for the Starter plan covering 2,500 executions. This workflow uses 1 execution per case. At 100 VIP cases per month, that's $20/month flat. Zapier's equivalent setup (Zoho CRM trigger + Filter + Slack action) costs $49.99/month on the Professional plan for the same volume because you need multi-step Zaps. Make sits in between at $9/month for 10,000 operations — each run uses 2-3 operations, so 100 cases costs roughly $0.03 in operations. n8n is cheaper than Zapier by $30/month here and comparable to Make, but Make doesn't require infrastructure management if you're on Make Cloud.

Tradeoffs

Zapier's Zoho CRM trigger is the most reliable of the three in terms of polling speed — it checks every 1-2 minutes on paid plans and the Zoho integration has been maintained for years with good field coverage. Make's Zoho CRM module supports instant triggers via webhooks and has a cleaner visual filter tool for the VIP condition without needing code. Power Automate has a Zoho CRM connector but it's a premium connector requiring a $15/user/month Power Automate Premium license — absurdly expensive for a single notification workflow. Pipedream offers the same webhook-based approach as n8n with slightly better built-in Slack formatting helpers but less visual debugging. n8n wins here because the Code node gives you full control over message formatting and VIP routing logic in one place, and at 100+ cases/month the per-execution pricing is predictable and low.

Two things you'll hit after setup. First, Zoho's webhook retry behavior is quiet — if your n8n instance has a 2-minute restart window during an update, cases created in that window are permanently missed with no log in Zoho after the retry window closes. Check Zoho's Notification History regularly in the first week. Second, Slack's legacy Attachments format (which n8n's Slack node uses by default) renders fine today but Slack has been nudging developers toward Block Kit for two years. If Slack removes Attachment support, your colored sidebars will break. Build using Blocks from the start if you want the workflow to be durable — it requires using the raw JSON body option in n8n's Slack node, but it takes an extra 15 minutes and saves a future migration headache.

Ideas for what to build next

  • Add a Zoho Case Reply When Slack Thread Gets a ResponseUse n8n's Slack trigger to watch for replies in the #support-vip thread and automatically post a note back on the Zoho CRM case. This keeps case history complete without requiring reps to copy-paste Slack updates into Zoho manually.
  • Escalate Unacknowledged VIP Cases After 15 MinutesAdd a Wait node after the Slack alert. If the case status in Zoho hasn't changed from 'Open' after 15 minutes (checked via a Zoho CRM HTTP Request node), fire a second Slack alert tagging the support manager directly. Catches cases that slip through during shift handovers.
  • Build a Daily VIP Case DigestCreate a separate n8n workflow on a daily 9am schedule that queries Zoho CRM for all open VIP cases via the Search Records operation and posts a summary table to #support-vip. Gives the team a morning briefing without requiring anyone to open Zoho.

Related guides

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