A full n8n + Claude workflow that pulls Freshdesk/Zoho tickets, classifies severity and product area, and drafts replies for human approval — node-by-node.
Hrishikesh Baidya
May 2, 202613 min read
0%
n8n's official template library now includes 14 production AI ticket-triage workflows, but most cost more to debug than they save. We rebuilt one in March 2026 for a Mumbai SaaS company with a 200-ticket/day Freshdesk queue — Claude Haiku 4.5 doing classification + draft replies, n8n orchestrating the loop. Result: 78% of tickets pre-tagged correctly, 52% with a draft reply that the agent sent without edits, ₹4,800/month total cost. This post is the exact node graph, the prompt template, and the failure modes nobody warns you about.
## TL;DR — what this triage workflow does and what it costs
Pulls open tickets from Freshdesk/Zoho Desk every 5 minutes → classifies severity (P0/P1/P2/P3) and product area → assigns to the right team → drafts a reply using Claude Haiku 4.5 grounded in your help-doc corpus → routes to a human for approval. Cost at 200 tickets/day: ₹4,800/month including Claude, n8n self-hosted, and a small Postgres. Setup time: 4 hours.
78%
Tickets Auto-Classified Correctly
52%
Draft Replies Sent Without Edits
80%
Reduction in Manual Sorting Time
₹4,800
Monthly Run Cost (200 tickets/day)
## Why this matters now (May 2026)
n8n v1.74 (April 2026) added a stable Anthropic node with structured output support — meaning you can ask Claude for a strict JSON response and have n8n parse it directly into downstream variables. Combined with Claude Haiku 4.5 at $1/$5 per million tokens, the per-ticket classification cost dropped to ~₹0.18. Below the cost threshold where "is this worth automating?" stops being a question.
## The actual workflow — node-by-node
⏰
1. Cron Trigger (every 5 min)
Polls Freshdesk/Zoho for tickets created in last 5 min OR updated and unclassified. Webhooks work too — cron is more forgiving on connection blips.
📥
2. Fetch Ticket + Conversation
Get full ticket body and conversation history. Truncate to last 6 messages to control token cost. Hash the content to skip already-classified tickets.
🧠
3. Claude Classify + Draft
Single Claude call returns JSON with severity, product area, suggested team, and a draft reply. One call cheaper than two.
✉️
4. Update Ticket + Notify
Apply tags, assign to team, post draft as a private note. Slack the assigned agent so they know to review.
## The cost math vs hiring a tier-1 agent
The workflow doesn't replace a human — it makes one human do the work of two-and-a-half. The math turns positive at roughly 70 tickets/day.
## The DIY walkthrough — every n8n node, every config
We run this on a self-hosted n8n v1.74.1 instance on Hetzner CX22 (₹740/month), Postgres for the workflow's audit log, and Freshdesk's REST API v2.
### Step 1 — n8n Cron Trigger node
### Step 4 — the Claude prompt that does classification + draft in one call
This is the prompt that does the work. We append it to the ticket body via the Set node, then send to the Anthropic node.
text
You are a support triage assistant for SaasCo, a billing automation platform.
Analyze the ticket below and return ONLY valid JSON in this exact shape:
{
"severity": "P0|P1|P2|P3",
"product_area": "billing|invoicing|api|account|onboarding|other",
"team": "engineering|customer-success|finance|tier1",
"sentiment": "frustrated|neutral|happy",
"draft_reply": "<2-4 sentence reply in the customer's tone>",
"confidence": 0.0-1.0,
"needs_human": true|false,
"reasoning": ""
}
Severity rules:
- P0: production down, data loss, security issue
- P1: feature broken, blocking customer workflow
- P2: bug with workaround, billing question
- P3: feature request, how-to question
If the question is answered in the help docs (provided below), include the answer in draft_reply with a doc link.
If you are <0.7 confident, set needs_human=true.
NEVER make up policy, prices, or refund amounts.
Help docs context:
{{$node["Get Help Docs"].json["context"]}}
Customer ticket:
Subject: {{$json["subject"]}}
Body: {{$json["description_text"]}}
Last 3 conversation turns: {{$json["recent_turns"]}}
Customer plan: {{$json["custom_fields"]["plan"]}}
### Step 5 — Anthropic node config
json
{
"node": "Anthropic",
"parameters": {
"model": "claude-haiku-4-5",
"maxTokens": 600,
"temperature": 0.1,
"system": "Return only valid JSON. No prose, no markdown fences.",
"responseFormat": "json"
}
}
The responseFormat: json flag forces structured output — n8n parses the response into {{ $json.severity }}, {{ $json.draft_reply }} etc. without a separate JSON.parse step.
### Step 6 — branch on severity (Switch node)
### Step 7 — Update Freshdesk ticket + post draft as private note
For P0 tickets, the workflow pings the on-call engineer in Slack and assigns the ticket. For P1/P2, it tags the ticket, assigns to the right team, and posts the draft as a private note — the agent reviews and sends with one click.
You should now see — within 5 minutes of a new Freshdesk ticket — three tags applied (ai-triaged, the product area, the severity), the ticket assigned to the correct team, and a private note containing a draft reply visible to your support agent.
## Common mistakes — five things that break this workflow
Mistake 1 — Letting Claude auto-send replies. Don't. Put the draft as a private note, let a human approve. The 7% of cases where Claude gets it wrong are exactly the cases where auto-sending would damage trust. Once you have 3 months of data with 95%+ accuracy on a category, then auto-send for that category.
Mistake 2 — Not hashing tickets to skip already-processed ones. Cron polls every 5 minutes. If you don't dedupe, you re-classify the same ticket 12 times an hour and burn API credits. We hash (ticket_id + last_updated_at) and store in Postgres. Skip any hash already seen.
Mistake 3 — No JSON schema validation. Claude usually returns valid JSON, but ~1% of the time it adds prose around it ("Here is the JSON: {...}"). Always wrap the parse in a try/catch and route failures to a "needs human review" queue. Don't let one malformed response break your workflow.
Mistake 4 — Sending entire conversation history. A 50-message thread blows past your token budget and dilutes the model's focus. Truncate to last 6 messages or 4,000 tokens, whichever comes first. Summarize older context if needed.
Mistake 5 — Skipping the eval set. Build a 50-ticket eval set with hand-labeled severity + correct draft. Run it after every prompt change. Track accuracy per severity class. The day someone changes the prompt and accuracy on P0 drops 12 points, you want to know before production.
PII gotcha: Tickets contain customer emails, phone numbers, sometimes payment metadata. If you send these to Claude, you've exported PII to Anthropic. Strip PII before sending — replace with [EMAIL_REDACTED], [PHONE_REDACTED] tokens. Or use Claude via Anthropic Bedrock if you need data residency in AWS Mumbai. We use a 30-line Python presidio-analyzer pre-processor.
## How this compares to commercial alternatives
Three commercial AI triage tools (Freshdesk Freddy AI, Zendesk AI Suite, Intercom Fin) sit between this self-built workflow and doing nothing. Freddy AI starts at $29/agent/month — for a 4-agent team that's ₹9,800/month, almost twice the run cost of the self-built version. Zendesk's AI Suite adds $50/agent/month on top of base subscriptions. Intercom Fin charges per resolution (~$0.99/conversation). The trade is: commercial tools ship in days, this workflow ships in hours. Commercial tools lock you into their data model; this workflow keeps every ticket and classification in your own Postgres, queryable however you want.
For SMBs already paying for Freshdesk or Zoho Desk on the lowest tier, the self-built workflow is the cheapest credible AI layer you can add. For teams already on Freshdesk Pro or Zendesk Suite Professional, evaluate the bundled AI features first — if they cover 60% of what you'd build, the lift may not be worth it. We've recommended both paths to clients depending on what they were already paying.
## Real example — 200-ticket/day SaaS, Mumbai
Our client runs a B2B billing-automation SaaS, ~140 paying customers, 200 inbound tickets/day across Freshdesk. Before triage workflow: 4 tier-1 agents, average first-response time 47 minutes, 12% of P0 issues missed SLA. After deploying this exact workflow (April 2026): 2 tier-1 agents, average first-response 4 minutes, 0 P0 SLA misses in the first 30 days. Saved ₹76,000/month in headcount, customer NPS up 14 points.
The interesting unexpected outcome was the operational visibility. Once every ticket was tagged automatically with severity and product area, the founder could finally answer "which feature generates the most P1 tickets?" — turned out their billing-export feature was driving 31% of P1 volume despite being used by only 8% of customers. They paused new feature work for two weeks and shipped a fix. Support volume dropped 19% the following month. The triage workflow paid for itself in surfaced product debt, not just headcount savings.
Same automation discipline we apply to client builds informs the architecture of our in-house edtech product [PenLeap](https://penleap.com), where AI-graded student writing routes through similar triage logic — high-confidence rubric matches auto-score, edge cases route to human reviewers, every decision logged for model improvement.
You handle ≥70 tickets/day across Freshdesk, Zoho Desk, or Zendesk
You have at least 2 tier-1 support agents currently doing manual triage
You self-host n8n on Hetzner / DigitalOcean / your own server (n8n Cloud also works)
You have a Postgres instance for the dedupe + audit log
You have at least 30 hand-labeled tickets to use as an eval set
You strip PII before sending tickets to Claude (presidio-analyzer or equivalent)
You set drafts as private notes — never auto-send for the first 3 months
You set up Slack alerts for low-confidence (<0.7) classifications
You measure accuracy per severity class weekly
## FAQ
### Will this work with Zendesk or Intercom instead of Freshdesk?
Yes. Replace the Freshdesk HTTP nodes with Zendesk or Intercom equivalents — the rest of the workflow is identical. Zendesk's Conversations API is cleaner than Freshdesk's; Intercom's webhook fires faster than polling. The Claude prompt is platform-agnostic.
### Can I use GPT-5.5 Instant or Gemini Flash instead of Claude?
Yes. GPT-5.5 Instant ships with structured outputs and runs ~25% cheaper for short classification tasks. Gemini 2.5 Flash is even cheaper but trips on draft-reply tone. For pure classification, all three are interchangeable; for the draft reply step, Claude Haiku produces the most "human" output in our blind tests.
### How do I handle multilingual support tickets (Hindi, Tamil)?
Add a language detection node before the Claude call (or include detection in the prompt). For Hinglish queries, Claude Haiku 4.5 handles the classification + reply natively. For pure Tamil/Hindi, drop a one-line "Match the customer's language" rule into the prompt. Sample a week of tickets to see if language coverage even matters for your customer base.
### What's the realistic time to deploy this from scratch?
For a developer who knows n8n: 4-6 hours. Day one: cron + Freshdesk fetch + Claude classify + tag update. Day two: draft reply + Slack notification + eval set + monitoring. Add a third day for production polish (retry logic, dead-letter queue, dashboard).
### How do I monitor this workflow in production?
Three dashboards: (1) per-day classification accuracy vs eval set, (2) Claude API costs per day, (3) ticket throughput + queue depth. We push n8n execution metrics to a small Grafana instance. The day accuracy drops 5 points, you want to know.
### Can the workflow auto-resolve tickets, not just draft replies?
For specific ticket categories where you have 95%+ accuracy and 3 months of human-approved data, yes. Common candidates: password reset, plan downgrade confirmation, "where do I find X" docs questions. Always log the auto-resolution and let customers reply if the resolution was wrong — that reply re-opens the ticket and routes to a human.
### Where can I find the n8n template repo to start from?
The [n8n template library](https://n8n.io/workflows/) has 14+ AI ticket triage workflows as of May 2026. The "AI-powered ticket triage with multi-model classification & knowledge base" template is the closest starting point. Fork it, replace the OpenAI node with Anthropic, swap the prompt for the one above.
Want This Triage Workflow Live for Your Support Team?
We build n8n + Claude support triage workflows for SMBs handling 70-2,000 tickets/day across Freshdesk, Zoho Desk, Zendesk, or Intercom. Setup in 5 working days. Typical project ₹65,000 fixed scope, ₹4,800-₹18,000 monthly run cost. Eval harness and dashboards included.