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

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

  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

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.