Blog · October 11, 2026

How to Route Support Tickets in n8n With Confidence Thresholds

Route support tickets in n8n with confidence thresholds: a build-along with the Saina Helm node or plain HTTP, a review queue for fallbacks, and testing.

Saina · October 11, 2026 · 5 min read

This is a build-along. By the end you'll have a workflow that routes support tickets in n8n automatically: it reads each ticket, asks a decision model (a small model that scores the options you give it and returns probabilities, instead of writing text) which team should handle it, and sends anything it isn't sure about to a review queue instead of guessing. Two paths are shown: the Saina Helm community node (self-hosted n8n only) and a plain HTTP Request version that works on n8n Cloud.

The routing quality comes from a confidence threshold (how sure the model must be before it acts), a margin (how far the winner must beat the runner-up) and a fallback branch that a human actually watches.

The n8n workflow for routing support tickets

Trigger → Decision step → Switch on the route
                         ↘ Fallback → Review queue (Slack/email/sheet)

You don't have to build it from scratch. Both paths below have a ready-made template in the run-saina/n8n-nodes repository under workflows/: support-routing.json for the community node, and http-request-portable.json for plain HTTP. Import one, then adapt it as you read.

Path A: the Saina Helm node (self-hosted n8n)

Install the community node @run-saina/n8n-nodes-saina. It's a community package that has not been verified by n8n, so it runs on self-hosted n8n only, not on n8n Cloud:

cd ~/.n8n/nodes && npm install @run-saina/n8n-nodes-saina

Then restart n8n. The node wraps Helm's /v1/ask and, in decision mode, gives you two outputs:

Inference errors (server down, timeout) stop the workflow by default. They reach Fallback only if you set the node's error handling to use the Fallback output, which the support-routing.json template does.

1. Trigger. Whatever starts your flow: email, form, webhook, a new row. The template starts with a manual trigger and an Example input node; replace both with your real trigger and map its fields.

2. Saina Helm node. Configure credentials (your server URL and API key), then fill in three fields:

Everything else lives under Advanced:

3. Switch on the route. Read the answer from {{ $json.saina.answers.route.selection }} (with the default Result Key it's saina.answers.answer.selection) and route to your team queues. The template does it in one Switch expression:

{{ ["Billing", "Technical support", "Other"].indexOf($json.saina.answers.route.selection) }}

4. The Fallback output is the feature. Wire it to wherever a human looks: a Slack channel, a Google Sheet, an email digest. Each rejected decision carries the probabilities and a reason code, so the reviewer can see why it was unsure. Error items are different: their saina.reason is inference_error and they carry no probabilities, so give them their own message ("routing failed, please triage").

Path B: HTTP Request version (n8n Cloud, or any decision API)

The http-request-portable.json template needs no community package, so it works on n8n Cloud. It's one HTTP Request node against /v1/ask and one Switch.

{
  "model": "saina-helm-0.8b",
  "mode": "decision",
  "state": "{{ $json.message }}",
  "questions": {
    "team": {
      "type": "single_choice",
      "question": "Which team should handle this request?",
      "options": {
        "billing": "Charges, invoices, refunds, subscription changes",
        "technical": "Outages, errors, bugs, account access",
        "other": "Anything that does not fit the teams above"
      }
    }
  },
  "threshold": 0.8,
  "min_margin": 0.05
}

Which endpoint? n8n Cloud can't reach a server on localhost or your internal network. Point it at a public HTTPS endpoint with auth in front (reverse proxy or tunnel). The same HTTP Request slot can also call another hosted decision API, such as OpenAI's GPT-6 Luna Decisions; it has its own request shape and response fields, so adapt the body and the branch expression to its docs.

Setting thresholds and margins

Testing before you trust it

The full test-set and shadow-mode steps live in the automated ticket routing guide.

Logging fallbacks

Log every fallback with: ticket ID, probabilities, reason code, timestamp, and the reviewer's eventual decision. Two payoffs: you can see which categories generate uncertainty (option-design feedback), and reviewed fallbacks become labeled evaluation data.

Checklist