Global Customer Support Ticket Classifier
Route English support tickets from customers anywhere to billing, refunds, orders, account, subscription, technical, privacy or FAQ teams with a small model that runs on a CPU.
An English support ticket classifier that sorts each message into eight categories a global help desk staffs separately, or none, offline on a CPU. It answers yes or no for each category, so a ticket that raises two problems reaches both teams and a greeting, thank-you or spam reaches none. It is built for the English a global desk actually receives: native US, UK and Australian customers, and second-language writers from India, the Philippines, Singapore, Malaysia, Nigeria, Kenya, Europe and Latin America, across email, live chat, in-app chat, social media and app-store reviews. Refunds and chargebacks, subscriptions, and privacy requests (GDPR, CCPA) with fraud have their own categories, because they have their own teams and deadlines. The model is MiniLM (microsoft/MiniLM-L12-H384-uncased) exported as an INT8 ONNX graph. Examples: "charged twice for one order" is billing_payment, "my refund for the return hasn't arrived" is refund_return, "cancel my plan before it renews" is subscription_plan, "delete all my personal data" is privacy_security, and "hi there" is none.
What it answersEvery category whose score clears the threshold, with a score for each of the 8. An empty list means the message makes no request.
Also available inIndonesian
Specs
Under the hood
| English | |
|---|---|
| Base model | microsoft/MiniLM-L12-H384-uncased |
| Parameters | 33.2M |
| Size | 34.0 MB |
| Format | ONNX INT8 |
| Max tokens | 256 |
Distilled from the base model by keeping fewer layers and trimming the vocabulary to the languages served, then quantised to INT8 so it fits a CPU, an edge device or embedded hardware.
Use cases
What you can do with it
Global help-desk triage
Label every new ticket on arrival and assign it to payments, returns, fulfilment, account, retention, technical support, trust & safety or the FAQ team: both teams when it raises two problems, nobody when it is a greeting or spam.
Privacy request deadlines
Catch `privacy_security` tickets (data access and deletion requests, account takeovers, fraud) the moment they arrive, so the legal clock on a GDPR or CCPA request does not start in a general queue.
Retention and deflection
Send `subscription_plan` cancellations to a retention flow, answer `product_inquiry` from your knowledge base, and keep agents for the categories where something went wrong.
Example results
Example results
Real outputs of this exact build on held-out rows — data it never saw in training. Each shows the input, what the model answered, and the reference label it was checked against. Nothing here is written by hand.
>>> classify("You reversed my failed transfer of 80,000 NGN but only 79,500 came back. Where is the 500? That is my transport money.")
{ "labels": [ "refund_return" ], "scores": { "billing_payment": 0.0572, "refund_return": 0.8093, "order_shipping": 0.0822, "account_access": 0.0125, "subscription_plan": 0.0202, "technical_issue": 0.0234, "privacy_security": 0.0225, "product_inquiry": 0.0401 } }# Reference: refund_return ✗ Differs
>>> classify("hey, sorry, my physical gift card for my sister never arrived and her birthday's on saturday 😭")
{ "labels": [ "order_shipping" ], "scores": { "billing_payment": 0.0079, "refund_return": 0.0918, "order_shipping": 0.7474, "account_access": 0.0255, "subscription_plan": 0.0246, "technical_issue": 0.0989, "privacy_security": 0.0122, "product_inquiry": 0.0432 } }# Reference: order_shipping ✗ Differs
>>> classify("Good day po, ma'am. I cannot get into my account. 1. On 6 October I clicked 'forgot password'. 2. The email never arrived, sir, I checked spam and promotions for 3 days. 3. My correct email is the one ending 777, I am sure of it. 4. Our payroll sheet is inside and payday is Friday. Please help me reset. One star.")
{ "labels": [ "account_access" ], "scores": { "billing_payment": 0.0171, "refund_return": 0.007, "order_shipping": 0.0148, "account_access": 0.4496, "subscription_plan": 0.0175, "technical_issue": 0.2008, "privacy_security": 0.2968, "product_inquiry": 0.0055 } }# Reference: account_access ✗ Differs
>>> classify("i was charged for another year but i meant to cancel. can you reverse that renewal?")
{ "labels": [ "subscription_plan" ], "scores": { "billing_payment": 0.2214, "refund_return": 0.0291, "order_shipping": 0.0446, "account_access": 0.0351, "subscription_plan": 0.7896, "technical_issue": 0.0624, "privacy_security": 0.0147, "product_inquiry": 0.0211 } }# Reference: subscription_plan ✗ Differs
>>> classify("Your balance does not refresh after a transfer. I have to close and reopen app. Sync problem.")
{ "labels": [ "technical_issue" ], "scores": { "billing_payment": 0.0099, "refund_return": 0.0232, "order_shipping": 0.2005, "account_access": 0.2527, "subscription_plan": 0.0584, "technical_issue": 0.7018, "privacy_security": 0.0479, "product_inquiry": 0.0113 } }# Reference: technical_issue ✗ Differs
Training data
Training data
Synthetic English customer-support messages generated across fourteen industries, nine channels, seven customer roles, nine writing styles and eight varieties of English at four fluency levels, labelled with one rubric; a quarter of every batch sits on the boundary between two categories, and the rest includes tickets with two problems and messages with none.
The classes this model learned to recognise:
| Label | Meaning |
|---|---|
billing_payment | Wrong, double or unrecognised charges, failed or pending payments, invoices, tax, payment method. |
refund_return | Refunds not received, returns, exchanges, return labels, chargebacks and bank disputes. |
order_shipping | An order or booking already made: tracking, late, lost, customs, damaged or wrong item, cancel before shipping. |
account_access | Login, password reset, 2FA codes, locked accounts, verification, changing account details. |
subscription_plan | Cancel, renew, upgrade or downgrade a plan, seats, trials turning paid. |
technical_issue | The app, site, API, device or connection is not working: errors, crashes, outages. |
privacy_security | GDPR/CCPA data requests, unsubscribe, account takeover, fraud, phishing, abuse. |
product_inquiry | A question with nothing gone wrong: prices, shipping countries, availability, how-to, policies. |
The first five example rows, with the label each one carries:
| # | Text | Label |
|---|---|---|
| 0 | You reversed my failed transfer of 80,000 NGN but only 79,500 came back. Where is the 500? That is my transport money. | refund_return |
| 1 | hey, sorry, my physical gift card for my sister never arrived and her birthday's on saturday 😭 | order_shipping |
| 2 | Good day po, ma'am. I cannot get into my account. 1. On 6 October I clicked 'forgot password'. 2. The email never arrived, sir, I checked spam and promotions for 3 days. 3. My correct email is the one ending 777, I am sure of it. 4. Our payroll sheet is inside and payday is Friday. Please help me reset. One star. | account_access |
| 3 | i was charged for another year but i meant to cancel. can you reverse that renewal? | subscription_plan |
| 4 | Your balance does not refresh after a transfer. I have to close and reopen app. Sync problem. | technical_issue |
intura-ai script
Run it with the intura-ai SDK
- 1
Get it
Sign in on this site and press Get it. The model goes to your library with every version.
- 2
Create a download key
On your account page, create a download key and set it as INTURA_API_KEY. It only downloads what you own.
- 3
Install
pip install "intura-ai[local]" — the SDK plus the CPU runtime it uses to run a model on your machine.
- 4
Run it
Run the script. It downloads the build once and checks each file's SHA-256, then runs on your CPU, edge box or embedded Linux — no network call after the download.
# pip install "intura-ai>=3.0.0"
# export INTURA_API_KEY=... # a download key from your account
from intura_ai import Intura, LocalModel
client = Intura()
# Downloads once into ./chat-customer-support-ticket-en/v1.0; later runs reuse the files on disk.
model_dir = client.models.download("chat-customer-support-ticket-en", version="v1.0")
model = LocalModel.load(model_dir) # CPU, no network from here on
print(model.predict('You reversed my failed transfer of 80,000 NGN but only 79,500 came back. Where is the 500? That is my transport money.'))
# {"labels": [...], "scores": {...}}Pass the customer's first message as plain text. Order numbers, amounts and dates help: they are in the training data.
Want to see what it answers before you get it? Read the Example results
Versions
Versions
Every version stays downloadable once you own the model. A version id names exactly the bytes you download.
v1.0RecommendedONNX INT834.0 MBReleased Oct 16, 2026
Feedback
Need something changed in this model?
Ask for a new label or language, tell us where it misses on your data, get help running it, or report a bug. A person reads every message and replies by email.
Find the model for your task.
Search by what it has to do, read real example results, and download it to run on your own CPU — from $9 during early bird.