Makani Tech: Build. Automate. Evolve.

AI Support Ticket Triage with n8n + Claude (free workflow)

How to build an AI support agent that sorts, prioritises and drafts every ticket

FreeWorkflowBy Kishan Makani · updated 19 October 2026 · 7 min read

GmailClaudeSlackGoogle Sheets

Downloads

  • Download the n8n workflow (JSON)

    ai-support-ticket-triage-n8n-claude.json · n8n workflow · 21 steps · starts with Support email · uses Gmail, WhatsApp, Google Sheets, Anthropic, Slack · 37 KB

    Import into n8n: Create Workflow, then the menu, then Import from File.

How to import it into n8n
  1. In n8n, create a new workflow.
  2. Open the ⋯ menu at the top right and choose Import from File, then pick the downloaded .json. (Or open the file, copy everything and paste it on the canvas.)
  3. Open each node with a warning and connect your own account: the file carries no passwords or keys.
  4. Run it once with Test workflow, check the result, then switch it to Active.

What it does

Every message to your support email and your WhatsApp Business number becomes one ticket. Auto-replies and repeats are dropped before any AI cost. n8n looks up the customer's order in your Orders sheet, then Claude labels the ticket (refund, order status, bug, how-to, complaint), sets a priority from P1 to P3, notices when the customer is angry, and drafts a reply in their language using the real order status. A small owner table decides who owns each category and how fast it must be answered. Every ticket is logged in Google Sheets. Angry or P1 tickets ping an escalation channel. The owner approves the draft in Slack and the reply goes back on the same channel it came from.

Who it is for

D2C brands, SaaS teams and service businesses with a shared support inbox and a WhatsApp number, where two to five people answer customers and urgent tickets get lost in the queue.

What you need

  • An n8n account (n8n Cloud or self-hosted)
  • A support Gmail inbox
  • A WhatsApp Business Cloud API number (Meta developer app)
  • An Anthropic API key for Claude
  • A Google Sheet with Orders and Tickets tabs (or swap Look up order for Shopify or Shiprocket)
  • A Slack workspace with one channel per team (refunds, orders, tech) and #support-escalations

How the workflow runs, node by node

The slides show the same steps. Open the workflow in n8n and you will see a sticky note over each one.

Step 1 · Catch every message

Support emails and WhatsApp messages become one ticket format: who, which channel, what they wrote. Out-of-office replies, no-reply mail and anything already ticketed are dropped before any AI cost.

  • Support email: Checks your support inbox every minute for unread mail and passes each email on with its headers.
  • Support WhatsApp: Fires for every message sent to your WhatsApp Business number.
  • Normalise ticket: Turns an email or a WhatsApp message into one ticket: id, channel, contact, name, subject and the new text (quoted history cut, max 3,000 characters). It also flags auto-replies.
  • Skip auto-replies: Drops out-of-office replies, no-reply senders, bounce mail and WhatsApp stickers or reactions before any AI call.
  • Already a ticket?: Remembers every message id. A re-run or a re-delivered webhook never creates a second ticket.

Step 2 · Claude reads it with the order

n8n first finds the customer's order in your Orders sheet. Claude then labels the ticket refund, order status, bug, how-to or complaint, sets P1 to P3, spots anger, and drafts a reply using the real order status.

  • Look up order: Finds the customer's latest order in your Orders tab by email or phone. If there is no order, the ticket still goes on (always output data is on).
  • Triage with Claude: Reads the message with the order on file and returns a category, priority (P1 to P3), sentiment, one-line summary, order id and a reply draft in the customer's language.
  • Claude: Claude (claude-sonnet-5-5) at temperature 0.2, so answers stay consistent from run to run.
  • Ticket schema: Forces fixed fields (category, priority, sentiment, summary, order_id, draft_reply, human_only, confidence), so routing never has to guess.

Step 3 · Right owner, right priority

Each category has an owner and a time limit. The ticket is logged with who owns it and when it is due. Angry or P1 tickets also ping #support-escalations straight away.

  • Assign owner: Looks up the owner, Slack channel and time limit for the category from a small table you edit. Angry or P1 tickets get a 2 hour limit.
  • Log ticket: Writes one row per ticket to the Tickets tab, keyed on Ticket ID, with category, priority, mood, owner, due time and the draft.
  • Angry or urgent?: True for P1 tickets and angry customers. They get an escalation ping before the normal approval.
  • Ping escalation: Posts a short alert to #support-escalations so an angry customer is seen in minutes, not at the bottom of the pile.

Step 4 · The owner approves the reply

The draft lands in the owner's Slack channel with the customer's message and order details. Send reply sends it. 'I'll reply myself' marks the ticket for a manual reply, with the draft kept in the sheet.

  • Approve drafted reply: Posts the customer's message, order details and the draft to the owner's Slack channel and waits up to 20 hours, so WhatsApp replies still land inside the 24 hour window.
  • Approved?: True only when the owner tapped Send reply. 'I'll reply myself' or no answer goes down the false path.
  • Reply channel?: Sends email tickets to the Gmail reply and WhatsApp tickets to the WhatsApp reply.
  • Mark for manual reply: Updates the row to 'Manual reply'. The draft stays in the sheet's Draft column for the owner to copy.

Step 5 · Reply goes back where it came from

Email tickets get a reply in the same Gmail thread. WhatsApp tickets get a WhatsApp reply. The sheet says Replied with the time. If a send fails, the support lead gets an alert.

  • Reply by email: Replies inside the customer's original Gmail thread with the approved text. Its error output goes to the alert.
  • Reply on WhatsApp: Sends the approved reply on WhatsApp. This works inside 24 hours of the customer's last message; after that WhatsApp needs an approved template. Its error output goes to the alert.
  • Mark replied: Updates the ticket row: Status 'Replied' with the time, so you can see response times per owner.
  • Alert support lead: Tells the support lead if Gmail or WhatsApp refused the send, so an approved reply never silently fails.

Setup

  1. In n8n, create a new workflow, open the menu and choose Import from File, then pick the JSON file.
  2. Connect Gmail on Support email and Reply by email, and change support@YOUR_DOMAIN in the trigger's search.
  3. Connect WhatsApp: a WhatsApp OAuth credential on Support WhatsApp and a WhatsApp API credential on Reply on WhatsApp, with your Phone number ID in place of YOUR_PHONE_NUMBER_ID.
  4. Make a Google Sheet with an Orders tab (Order ID, Contact, Name, Product, Amount, Status, AWB, Ordered on) and a Tickets tab (Ticket ID, Received, Channel, Customer, Category, Priority, Mood, Order, Summary, Owner, Due by, Draft, Status, Replied at). Paste its URL in the four sheet nodes.
  5. Create an Anthropic credential on Claude and replace YOUR_BRAND in Triage with Claude.
  6. Edit the owner table at the top of Assign owner: owner name, Slack channel and hours per category.
  7. Connect Slack on Ping escalation, Approve drafted reply and Alert support lead, and create the channels.
  8. Send one test email and one test WhatsApp from another phone, click Execute workflow, and check the sheet row and the Slack card. Then activate.

How to customise it

  • Replace Look up order with a Shopify or Shiprocket HTTP Request to get live tracking instead of a sheet.
  • Add categories such as 'wholesale enquiry' or 'collab request' to the schema enum, the prompt and the owner table.
  • Change the time limits in Assign owner and add a scheduled workflow that pings owners when 'Due by' has passed.
  • Add Instagram DMs as a third trigger through a webhook from the Instagram Graph API.
  • Let P3 how-to tickets with confidence above 0.9 auto-send from a fixed FAQ, and keep approval for everything else.

Guardrails

Every reply waits for the owner's tap in Slack. The AI never promises a refund, amount or date.

  • Claude is told never to promise a refund, replacement, amount or date, and never to invent tracking details.
  • Legal threats, chargebacks and anything medical are flagged for a careful human read.
  • No reply goes out without the owner's tap in Slack. 'I'll reply myself' or no answer sends nothing.
  • Approval waits 20 hours so WhatsApp replies stay inside the 24 hour customer service window.
  • Only the message text and the order line are sent to Claude, not the full customer history.

Troubleshooting

  • WhatsApp messages never arrive. The Meta app's webhook must be subscribed to messages and the number must be in live mode.
  • Look up order never finds anything. Contacts must match exactly. Store emails in lowercase and phones as 91XXXXXXXXXX, the way WhatsApp sends them.
  • The Slack card goes to the wrong channel. The channel comes from the owner table in Assign owner. Check the spelling, including the #.
  • WhatsApp reply fails with a 24 hour error. The customer's last message is older than 24 hours. Send an approved template, or reply by hand.
  • Slack buttons do nothing. Send-and-wait needs n8n to be reachable from the internet and the workflow must be active.

Want the members-only resources too?

A free account unlocks them all, including the ones shared in DMs.

Create a free account