Back to Alchemy
Alchemy RecipeIntermediateautomation

Multi-language customer support ticket triage and response drafting

Support teams handling multiple languages face a familiar bottleneck: tickets arrive in German, Spanish, Mandarin, and Japanese, but your team speaks English. Someone manually translates each ticket, reads it, drafts a response, then translates that response back. By the time a customer sees a reply, hours have passed. Quality varies because fatigue sets in, context gets lost in translation, and routing decisions become inconsistent. The problem compounds in distributed organisations. A ticket might sit in an inbox for two days waiting for someone who speaks Portuguese, when your system could have automatically transcribed, translated, categorised, and drafted a response in minutes. This workflow shows how to build an automated ticket triage and response system that handles multiple languages without requiring human translation or manual routing. You'll use voice transcription, language detection, and text generation to process incoming tickets faster and more consistently than any manual process. For more on this, see Multilingual customer support ticket automation with resp....

The Automated Workflow

The core logic is straightforward: receive a ticket (text or audio), detect its language, transcribe if needed, translate to English, categorise it, draft a response, and translate the response back to the customer's language. All of this happens in sequence without human intervention.

Why this matters:

A ticket that would take 15 minutes to handle manually (find translator, read, draft, translate back) takes under 2 minutes from receipt to draft completion.

Architecture overview The workflow uses n8n as the orchestration layer because it handles conditional logic, variable mapping, and API calls cleanly.

You'll connect it to: - Whisper API (for transcribing audio tickets or voice notes)

  • OpenAI GPT-4.1 for language detection, summarisation, and response drafting
  • A translation service (built into Claude Opus 4.6 or using a dedicated API)
  • Your ticketing system (Zendesk, Jira, Freshdesk, etc.)
  • ElevenLabs Turbo v2.5 for converting drafted responses to audio if your team prefers verbal responses

Data flow:

Ticket arrives → Detect language → Transcribe audio (if needed) → Translate to English → Categorise (urgent, billing, technical, etc.) → Generate response → Translate response back → Store in ticket system → Optionally generate audio version.

Setting up n8n Start by creating a new workflow in n8n.

You'll need: - A webhook trigger to receive incoming tickets from your ticketing system

  • Nodes for API calls to OpenAI and Claude
  • Conditional logic to handle different languages
  • An output node to write the response back to your ticket system Create a webhook in n8n:
POST /webhook/support-triage

Configure your ticketing system to send ticket data to this endpoint whenever a new ticket arrives. The payload should include:

json
{ "ticket_id": "TKT-12345", "customer_name": "Maria", "message": "Hola, tengo un problema con mi factura", "language_hint": null, "audio_url": null, "created_at": "2026-03-15T10:30:00Z"
}

Step 1:

Language detection and transcription Add an HTTP Request node in n8n to call OpenAI GPT-4o for language detection:

POST https://api.openai.com/v1/chat/completions
Authorization: Bearer YOUR_OPENAI_API_KEY

The request body:

json
{ "model": "gpt-4o", "messages": [ { "role": "user", "content": "Detect the language of this text and respond with only the ISO 639-1 code (e.g. 'es', 'de', 'fr', 'zh', 'ja'). Text: [INSERT_TICKET_MESSAGE]" } ], "temperature": 0
}

Extract the detected language code from the response. Store it in a variable, say $detected_language. If the ticket includes an audio URL, add another HTTP node to transcribe it using Whisper API:

POST https://api.openai.com/v1/audio/transcriptions
Authorization: Bearer YOUR_OPENAI_API_KEY

The request uses multipart form data:

model=whisper-1
file=[AUDIO_FILE_BINARY]
language=[DETECTED_LANGUAGE_CODE]

Whisper returns a JSON response with a text field. Use this as your ticket message instead of the original audio.

Step 2:

Translation to English Add a Claude API node using Claude Opus 4.6 to translate the ticket message to English if it's not already in English:

POST https://api.anthropic.com/v1/messages
Authorization: x-api-key YOUR_ANTHROPIC_API_KEY

Request body:

json
{ "model": "claude-opus-4.6", "max_tokens": 1024, "messages": [ { "role": "user", "content": "Translate the following message from [DETECTED_LANGUAGE] to English. Return only the translation, nothing else.\n\nMessage: [TICKET_MESSAGE]" } ]
}

Store the translated message as $english_message.

Step 3:

Categorisation and routing Add another Claude node to categorise the ticket and assign priority:

POST https://api.anthropic.com/v1/messages
Authorization: x-api-key YOUR_ANTHROPIC_API_KEY

Request body:

json
{ "model": "claude-opus-4.6", "max_tokens": 256, "messages": [ { "role": "user", "content": "Categorise this support ticket. Respond in JSON format with fields 'category' (billing, technical, account, general), 'priority' (critical, high, medium, low), and 'team' (sales, engineering, support). Ticket: [ENGLISH_MESSAGE]" } ]
}

Parse the JSON response and store the category, priority, and team assignment.

Step 4:

Draft a response Add a GPT-4.1 node to generate a response tailored to the category and priority:

POST https://api.openai.com/v1/chat/completions
Authorization: Bearer YOUR_OPENAI_API_KEY

Request body:

json
{ "model": "gpt-4.1", "messages": [ { "role": "system", "content": "You are a friendly, professional support agent. Keep responses concise and actionable. If this is a billing issue, offer specific next steps. If technical, ask clarifying questions only if necessary." }, { "role": "user", "content": "Respond to this support ticket:\n\nTicket: [ENGLISH_MESSAGE]\nCategory: [CATEGORY]\nPriority: [PRIORITY]\n\nDraft a response that addresses the customer's concern and offers a resolution." } ], "temperature": 0.7
}

Store the response as $draft_response.

Step 5:

Translate response back to customer's language If the original language was not English, translate the draft response back using Claude:

POST https://api.anthropic.com/v1/messages
Authorization: x-api-key YOUR_ANTHROPIC_API_KEY

Request body:

json
{ "model": "claude-opus-4.6", "max_tokens": 2048, "messages": [ { "role": "user", "content": "Translate the following response from English to [DETECTED_LANGUAGE]. Preserve the tone and formatting.\n\nResponse: [DRAFT_RESPONSE]" } ]
}

Store the result as $localised_response.

Step 6:

Audio generation (optional) If your team prefers to hear the response, add an ElevenLabs node to generate audio:

POST https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}/stream
Authorization: xi-api-key YOUR_ELEVENLABS_API_KEY

Request body:

json
{ "text": "[LOCALISED_RESPONSE]", "model_id": "eleven_turbo_v2_5", "voice_settings": { "stability": 0.5, "similarity_boost": 0.75 }
}

The response contains an audio stream. Store the URL for reference.

Step 7:

Write back to ticketing system Add a final HTTP node to update the original ticket with the drafted response:

POST https://api.zendesk.com/api/v2/tickets/{ticket_id}/comments
Authorization: Bearer YOUR_ZENDESK_API_KEY

Request body (for Zendesk):

json
{ "comment": { "body": "[LOCALISED_RESPONSE]", "public": true, "author_id": "YOUR_BOT_USER_ID" }
}

Tag the ticket with the assigned category and priority so your team can review and send the response.

The Manual Alternative

If your team needs more control, skip the response drafting and stopping at step 2 (English translation). Have the translated ticket and category assignment appear in a Slack channel or email digest. Your team reviews and approves before sending, which takes 3-4 minutes per ticket instead of 15. You lose some automation, but keep quality gates intact. Alternatively, use Zapier instead of n8n if your team prefers a visual builder and simpler conditional logic. Zapier's built-in actions for OpenAI and Claude make this workflow possible without writing any JSON, though you'll hit API call limits faster on lower plans.

Pro Tips

Rate limiting and costs:

Whisper API charges per minute of audio.

Batch audio transcriptions during off-peak hours if volume is high. Claude Opus 4.6 is more expensive per token than Claude Haiku 4.5, but for categorisation and translation, Haiku is accurate enough and cuts costs by 80 per cent.

Error handling:

Add conditional nodes in n8n to catch API failures. If translation fails, mark the ticket as requiring manual review and send a Slack alert. Store failed requests in a separate database so you can retry them later.

Language detection fallback:

If GPT-4o returns an unexpected language code, default to English. Add a node that checks whether $detected_language is in your supported languages list; if not, flag it for review.

Testing with edge cases:

Test your workflow with code-switching messages (mixing two languages), colloquial spelling, and voice notes with background noise. Claude handles these better than simpler NLP tools.

Cost optimisation:

Use GPT-4o mini instead of GPT-4o for language detection and categorisation; it's 70 per cent cheaper and equally accurate for these tasks. Reserve GPT-4.1 for response drafting only.

Cost Breakdown

ToolPlan NeededMonthly CostNotes
OpenAI API (GPT-4o mini, GPT-4.1, Whisper)Pay-as-you-go£150–300Depends on ticket volume. 1,000 tickets/month = ~£200.
Anthropic API (Claude Opus 4.6, Claude Haiku 4.5)Pay-as-you-go£50–150Use Haiku for categorisation to save costs.
ElevenLabs Turbo v2.5Starter (£0) or Creator (£99)£0–99Starter includes 10,000 characters/month free.
n8nProfessional (£240/month) or Community (free self-hosted)£0–240Community edition sufficient for most workflows.
Ticketing system integrationExistingIncludedAssumes you already use Zendesk, Jira, etc.
Total£200–789/monthFor 1,000–5,000 tickets per month across 3+ languages.