Alert Slack on VIP Zendesk tickets using n8n

low complexityCost: $0-24/mo

Prerequisites

Prerequisites
  • n8n instance (cloud or self-hosted)
  • Zendesk API credentials (email + API token)
  • Slack app with Bot Token (chat:write scope) and a channel for VIP alerts
  • VIP organizations tagged with "vip" in Zendesk

Why n8n?

n8n is the best option when you need richer Slack alerts than the native Zendesk integration can provide. The key advantage: n8n can fetch organization custom fields — ARR, plan tier, customer success manager, contract renewal date — and include them in a Block Kit message. Agents get full account context without opening the ticket or checking a CRM.

The trade-off is a slight latency penalty. The Zendesk Trigger node polls for new tickets (1-2 minute delay vs. instant native triggers). For most VIP alerting, this delay is acceptable. Self-hosted n8n is free; Cloud starts at $24/mo.

How it works

  • Zendesk Trigger node polls for new tickets at regular intervals
  • HTTP Request fetches the ticket's organization details including custom fields
  • Code node checks for the VIP tag on the organization
  • IF node routes VIP tickets to the escalation branch, non-VIP tickets stop
  • HTTP Request updates the ticket with vip tag, Urgent priority, and VIP Support group
  • Slack node posts a Block Kit message with full customer context and a "View Ticket" button

Step 1: Set up Zendesk credentials in n8n

  1. In n8n, go to CredentialsAdd credentialZendesk
  2. Enter your Zendesk subdomain (e.g., acmecorp if your URL is acmecorp.zendesk.com)
  3. For authentication, use API Token:
    • Email: your Zendesk agent email
    • API Token: generate one in Zendesk under Admin CenterApps and integrationsAPIsZendesk APIAdd API token
  4. 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.

Polling vs. webhooks

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 }} equals true
  • 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.

Tag merging

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.

Add organization custom fields for richer context

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

  1. Create a test ticket from a user who belongs to a VIP-tagged organization
  2. Wait for the Zendesk Trigger node to poll (or manually execute the workflow)
  3. 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
  4. Toggle the workflow to Active

Troubleshooting

Common questions

How fast is the Zendesk Trigger node?

The n8n Zendesk Trigger polls at configurable intervals (default varies by plan). Set it to 1 minute for the fastest detection. If you need sub-minute alerts, create a Zendesk trigger that sends an Outbound Message to an n8n Webhook node instead.

Can I include CRM data like ARR in the Slack message?

Yes — this is the main reason to use n8n over native triggers. Store account data in Zendesk organization custom fields (synced from your CRM), then pull those fields in the HTTP Request that fetches the organization. Include them in the Block Kit payload.

What if VIP ticket volume is very low?

VIP tickets are typically a small percentage of total volume. Even on n8n Cloud, this workflow stays well within starter plan limits. The per-execution cost is negligible.

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.

Looking to scale your AI operations?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.