Customer conversations
Route a message to someone who reads that language
A Hong Kong shop selling into the region receives Chinese, English and Thai in the same inbox, and the person who opens it reads two of the three. The routing itself is a classification and a lookup. What decides whether it is worth building is whether anyone is on shift for the third language — and once you leave the service window, every language you support is a separate template and a separate approval.
- Triggers
- Two
- Runs
- On every message
- Stack
- 5 tools
- Durable execution
- Not required
The flow
The top track works out what language arrived. The bottom track knows who is working, and the branch asks whether those two facts meet.
A message arrives
WhatsApp Cloud API
Classify the language
OpenAI · Anthropic
Record the classification
Sheets · Airtable
Hourly shift refresh
n8n 排程
Match language to a person
n8n · Make
Anyone on shift reads it?
n8n IF
Hand it to that person
Slack · WhatsApp
Send to the default queue, flagged
Slack · WhatsApp
Step by step
- 01
A message arrives
WhatsApp Cloud APIThe webhook carries the message body and the sender's profile name. Neither tells you the language reliably — a Thai customer may open in English.
- 02
Classify the language
OpenAI · AnthropicClassification only: which language, and how sure. The model does not translate, does not reply, and does not decide who gets it — a mistranslated reply sent automatically is worse than a slow correct one.
- 03
Record the classification
Sheets · AirtableConversation, detected language, confidence. After a month this table tells you which language you are actually staffed for, which is usually not the one you assumed.
- 04
Hourly shift refresh
n8n 排程Read who is working and which languages they read. Routing to a name is not routing to a person unless that person is on shift.
- 05
Match language to a person
n8n · MakeIntersect the detected language with the current shift. Where two people qualify, prefer whoever already owns a conversation with this customer.
- 06
Anyone on shift reads it?
n8n IFThe question that actually matters. Low confidence counts as no — an uncertain classification sent to the wrong desk arrives as silence.
- 07
Hand it to that person
Slack · WhatsAppPass the original text untranslated. The person receiving it reads the language; a machine translation in front of the original only adds something to distrust.
- 08
Send to the default queue, flagged
Slack · WhatsAppMark it as unrouted rather than hiding it. The count of these is the staffing case — it is the only honest measure of the gap.
What the platform will not allow
Inside the service window language costs you nothing. Outside it, and on Instagram, each language has a separate price.
"While the window is open, you can send any of the service message types listed below to the user", with no advance approval. A person replying in Thai inside the 24-hour window needs nothing prepared; the same reply the next day does.
WhatsApp Cloud API — Send messagesA template is tied to one language — you assign a language code at creation, and "if you create multiple templates with the same name but with different languages, each template counts against your template limit". Supporting four languages outside the window means four separate approvals for what you think of as one message.
WhatsApp Business Management API — Message templatesInstagram caps a text message at "UTF-8, max 1000 bytes" — bytes, not characters. Chinese and Thai characters take three bytes each in UTF-8, so the same reply runs out of room roughly three times sooner than its English version, and a reply drafted to the English limit will be rejected in Chinese.
Instagram Platform — Messaging API
When this is not worth building
Three cases where the upkeep costs more than the mis-sent messages.
Everyone on the team reads every language you receive. Routing then adds a hop and a failure mode to a queue that was already correct.
You hold no shift information. Routing to a name without knowing whether that person is working sends the message to an empty desk, and it looks routed, which is worse than looking unhandled.
The second language is a trickle rather than a stream. A language that appears twice a week is handled by forwarding the message, and a classifier that is wrong once a month on a base that small is not measurably better.