Alert Slack on VIP Zendesk tickets using n8n
Prerequisites
- n8n instance (cloud or self-hosted)
- Zendesk API credentials (email + API token)
- Slack app with Bot Token (
chat:writescope) and a channel for VIP alerts - VIP organizations tagged with "vip" in Zendesk
Overview
This workflow uses the Zendesk Trigger node to detect new tickets, fetches the ticket's organization to check for a VIP tag, and posts a rich Block Kit message to Slack with full customer context when a match is found. Unlike the native Zendesk approach, n8n lets you pull organization custom fields — ARR, plan tier, customer success manager — into the Slack alert, giving agents the context they need before opening the ticket.
Step 1: Set up Zendesk credentials in n8n
- In n8n, go to Credentials → Add credential → Zendesk
- Enter your Zendesk subdomain (e.g.,
acmecorpif your URL isacmecorp.zendesk.com) - For authentication, use API Token:
- Email: your Zendesk agent email
- API Token: generate one in Zendesk under Admin Center → Apps and integrations → APIs → Zendesk API → Add API token
- Save and test the connection
Step 2: Add a Zendesk Trigger node
Add a Zendesk Trigger node to your workflow:
- Event: Ticket Created
This node polls Zendesk for new tickets at regular intervals. Each new ticket flows through the rest of the workflow.
The Zendesk Trigger node uses polling, which means there's a slight delay (1-2 minutes depending on your poll interval) between ticket creation and the Slack alert. For most VIP alerting use cases, this delay is acceptable. If you need sub-minute alerts, use the native Zendesk trigger approach instead.
Step 3: Fetch the organization details
Add an HTTP Request node to look up the ticket's organization:
- Method: GET
- URL:
https://{{$json.subdomain}}.zendesk.com/api/v2/organizations/{{$json.organization_id}}.json - Authentication: Use the Zendesk credentials you set up
- Send Headers: Content-Type →
application/json
If the ticket has no organization (organization_id is null), this step will fail. Add an IF node before it to check that organization_id exists, and route tickets without an organization to the normal queue (end the workflow for those).
Step 4: Check for the VIP tag
Add a Code node to check whether the organization has the "vip" tag:
const org = $input.first().json.organization;
const orgTags = org?.tags || [];
const isVip = orgTags.includes('vip');
return [{
json: {
isVip,
orgName: org?.name || 'Unknown',
orgTags,
}
}];Add an IF node after this:
- Condition:
{{ $json.isVip }}equalstrue - True branch: Continue to update ticket and send Slack alert
- False branch: End (normal queue ticket)
Step 5: Update the ticket with VIP tag and priority
On the True branch, add an HTTP Request node to tag and escalate the ticket:
- Method: PUT
- URL:
https://{{$node["Zendesk Trigger"].json.subdomain}}.zendesk.com/api/v2/tickets/{{$node["Zendesk Trigger"].json.id}}.json - Body (JSON):
{
"ticket": {
"tags": ["vip"],
"priority": "urgent",
"group_id": "VIP_GROUP_ID"
}
}Replace VIP_GROUP_ID with the numeric ID of your VIP Support group. You can find it by calling GET /api/v2/groups.json or checking the URL when you view the group in the Admin Center.
The PUT endpoint above replaces the entire tags array. To preserve existing tags, either use the Tags API (PUT /api/v2/tickets/{'{'}id{'}'}/tags.json with a "tags" array to add) or fetch the current tags first and merge them in a Code node before sending the update.
Step 6: Post a rich Slack alert
Add a Slack node (or an HTTP Request to the Slack API) to send a Block Kit message:
- Resource: Message
- Operation: Send a Message
- Channel: Your VIP support channel ID
Block Kit payload:
{
"channel": "VIP_CHANNEL_ID",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "VIP Customer Ticket",
"emoji": true
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Ticket:* #{{$node['Zendesk Trigger'].json.id}}"
},
{
"type": "mrkdwn",
"text": "*Subject:* {{$node['Zendesk Trigger'].json.subject}}"
},
{
"type": "mrkdwn",
"text": "*Customer:* {{$node['Zendesk Trigger'].json.requester.name}}"
},
{
"type": "mrkdwn",
"text": "*Organization:* {{$node['Code'].json.orgName}}"
}
]
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Priority:* Urgent"
},
{
"type": "mrkdwn",
"text": "*Status:* Escalated to VIP Support"
}
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Ticket"
},
"url": "https://{{$node['Zendesk Trigger'].json.subdomain}}.zendesk.com/agent/tickets/{{$node['Zendesk Trigger'].json.id}}",
"style": "primary"
}
]
}
]
}Replace VIP_CHANNEL_ID with your Slack channel ID.
Use organization custom fields to store account details like ARR, plan tier, or customer success manager. Pull these fields in the HTTP Request that fetches the organization (Step 3) and include them in your Slack Block Kit message. This gives agents context they would otherwise need to look up manually in a CRM.
Step 7: Activate and test
- Create a test ticket from a user who belongs to a VIP-tagged organization
- Wait for the Zendesk Trigger node to poll (or manually execute the workflow)
- Verify:
- The ticket was updated with the "vip" tag, Urgent priority, and VIP Support group assignment
- A formatted Slack message appeared in your VIP channel with ticket and customer details
- The "View Ticket" button links to the correct ticket in Zendesk
- Toggle the workflow to Active
Cost
- n8n Cloud Starter: $0-24/mo. Each VIP ticket triggers roughly 4-5 node executions (trigger, HTTP request, code, HTTP update, Slack). VIP ticket volume is typically low, so this stays well within starter plan limits.
- Self-hosted n8n: Free. Only cost is your server.
Need help implementing this?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.