This workflow corresponds to n8n.io template #5194 — we link there as the canonical source.
This workflow follows the Emailreadimap → Emailsend recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "z73TMqpaMzylBZqT",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Multi-language Customer Support Automation",
"tags": [],
"nodes": [
{
"id": "f1e842e5-c61a-45ef-8669-d81805fd8c1d",
"name": "WhatsApp Trigger",
"type": "n8n-nodes-base.whatsAppTrigger",
"position": [
-1620,
600
],
"parameters": {
"options": {},
"updates": [
"messages"
]
},
"credentials": {
"whatsAppTriggerApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "6ecfadcb-aa27-4850-8c83-a91a9d7db388",
"name": "Email Trigger (IMAP)",
"type": "n8n-nodes-base.emailReadImap",
"position": [
-1620,
800
],
"parameters": {
"options": {}
},
"credentials": {
"imap": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "d5aa938b-2ab7-454b-9855-e82bdade20be",
"name": "Data Normalizer & Validator",
"type": "n8n-nodes-base.code",
"position": [
-1400,
700
],
"parameters": {
"jsCode": "// Normalize input data from different sources\nconst inputData = $input.first().json;\nlet messageText = '';\nlet sourceType = '';\nlet sourceId = '';\nlet timestamp = new Date().toISOString();\n\n// Handle WhatsApp input\nif (inputData.messages) {\n messageText = inputData.messages[0]?.text?.body || '';\n sourceType = 'whatsapp';\n sourceId = inputData.messages[0]?.from || 'unknown';\n} \n// Handle Email input\nelse if (inputData.subject || inputData.text) {\n messageText = inputData.text || inputData.subject || '';\n sourceType = 'email';\n sourceId = inputData.from || 'unknown';\n}\n// Handle direct text input\nelse if (inputData.text) {\n messageText = inputData.text;\n sourceType = 'direct';\n sourceId = 'system';\n} else {\n messageText = JSON.stringify(inputData);\n sourceType = 'unknown';\n sourceId = 'system';\n}\n\n// Basic validation\nif (!messageText || messageText.trim().length === 0) {\n throw new Error('No message content found in input');\n}\n\nif (messageText.length > 5000) {\n messageText = messageText.substring(0, 5000) + '... [truncated]';\n}\n\nreturn {\n json: {\n originalMessage: messageText,\n sourceType: sourceType,\n sourceId: sourceId,\n timestamp: timestamp,\n messageLength: messageText.length\n }\n};"
},
"typeVersion": 2
},
{
"id": "75a79ce9-993a-4bab-b99a-0945539179e1",
"name": "Smart Language Translator",
"type": "n8n-nodes-base.googleTranslate",
"position": [
-1180,
700
],
"parameters": {
"text": "={{ $json.originalMessage }}",
"translateTo": "en",
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "a13ebe33-15f1-42cb-a9c3-1684d12c0f3c",
"name": "Enhanced Summary & Priority Processor",
"type": "n8n-nodes-base.code",
"position": [
-960,
700
],
"parameters": {
"jsCode": "// Enhanced summarization with multiple algorithms\nconst input = $input.first().json;\nconst detectedLang = input.detectedSourceLanguage || 'unknown';\nconst translatedText = input.translatedText || input.originalMessage;\nconst sourceType = $('Data Normalizer & Validator').first().json.sourceType;\nconst sourceId = $('Data Normalizer & Validator').first().json.sourceId;\nconst timestamp = $('Data Normalizer & Validator').first().json.timestamp;\n\n// Advanced summarization function\nfunction generateSummary(text, maxLength = 150) {\n if (!text || text.length <= maxLength) return text;\n \n // Extract key information\n const sentences = text.split(/[.!?]+/).filter(s => s.trim().length > 0);\n \n if (sentences.length <= 2) {\n return text.substring(0, maxLength) + (text.length > maxLength ? '...' : '');\n }\n \n // Prioritize first and last sentences, plus any with keywords\n const keywords = ['urgent', 'help', 'problem', 'issue', 'support', 'error', 'bug', 'complaint'];\n const importantSentences = [];\n \n // Always include first sentence\n if (sentences[0]) importantSentences.push(sentences[0].trim());\n \n // Add sentences with keywords\n sentences.forEach(sentence => {\n if (keywords.some(keyword => sentence.toLowerCase().includes(keyword))) {\n if (!importantSentences.includes(sentence.trim())) {\n importantSentences.push(sentence.trim());\n }\n }\n });\n \n // Add last sentence if different from first\n const lastSentence = sentences[sentences.length - 1].trim();\n if (lastSentence !== sentences[0].trim() && !importantSentences.includes(lastSentence)) {\n importantSentences.push(lastSentence);\n }\n \n let summary = importantSentences.join('. ');\n \n if (summary.length > maxLength) {\n summary = summary.substring(0, maxLength - 3) + '...';\n }\n \n return summary;\n}\n\n// Determine priority based on content\nfunction getPriority(text) {\n const urgentKeywords = ['urgent', 'emergency', 'asap', 'immediately', 'critical'];\n const highKeywords = ['problem', 'issue', 'error', 'bug', 'complaint', 'help'];\n \n const lowerText = text.toLowerCase();\n \n if (urgentKeywords.some(keyword => lowerText.includes(keyword))) {\n return 'HIGH';\n } else if (highKeywords.some(keyword => lowerText.includes(keyword))) {\n return 'MEDIUM';\n }\n return 'LOW';\n}\n\n// Generate enhanced summary\nconst summary = generateSummary(translatedText);\nconst priority = getPriority(translatedText);\nconst wordCount = translatedText.split(/\\s+/).length;\n\n// Prepare structured output\nconst processedData = {\n // Core data\n originalLanguage: detectedLang,\n translatedText: translatedText,\n summary: summary,\n priority: priority,\n \n // Metadata\n sourceType: sourceType,\n sourceId: sourceId,\n timestamp: timestamp,\n wordCount: wordCount,\n \n // For notifications\n emailSubject: `[${priority}] Customer Message from ${sourceType.toUpperCase()} - ${detectedLang.toUpperCase()}`,\n notificationText: `Priority: ${priority}\\nSource: ${sourceType.toUpperCase()}\\nLanguage: ${detectedLang.toUpperCase()}\\nSummary: ${summary}`,\n \n // For logging\n logEntry: {\n timestamp: timestamp,\n source: sourceType,\n sourceId: sourceId,\n originalLanguage: detectedLang,\n priority: priority,\n wordCount: wordCount,\n summary: summary\n }\n};\n\nreturn { json: processedData };"
},
"typeVersion": 2
},
{
"id": "3fadf1aa-43dc-45e9-8615-f26eb51a5d7d",
"name": "Log to Database",
"type": "n8n-nodes-base.googleSheets",
"position": [
-520,
300
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": "Customer_Messages_Log",
"documentId": "your-google-sheets-id",
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4
},
{
"id": "5c755da5-ffba-49f9-ade4-f543f1f55443",
"name": "Admin Email Notification",
"type": "n8n-nodes-base.emailSend",
"position": [
-520,
500
],
"parameters": {
"options": {},
"subject": "={{ $json.emailSubject }}",
"toEmail": "user@example.com",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "0a71c247-4c04-41d9-9fed-efff40527ff1",
"name": "Admin WhatsApp Alert",
"type": "n8n-nodes-base.whatsApp",
"position": [
-520,
1100
],
"parameters": {
"textBody": "\ud83d\udea8 Customer Support Alert\\n{{ $json.notificationText }}\\n\\nFull message: {{ $json.translatedText }}",
"operation": "send",
"phoneNumberId": "your-phone-id",
"additionalFields": {},
"recipientPhoneNumber": "admin-phone-number"
},
"credentials": {
"whatsAppApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "9301c937-35ea-4233-a960-b89b36f58b02",
"name": "Check Message Source",
"type": "n8n-nodes-base.if",
"position": [
-740,
800
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition-source-whatsapp",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.sourceType }}",
"rightValue": "whatsapp"
}
]
}
},
"typeVersion": 2
},
{
"id": "79eae5b4-2216-4016-a19c-717f6422c4ce",
"name": "Customer WhatsApp Auto-Response",
"type": "n8n-nodes-base.whatsApp",
"position": [
-520,
700
],
"parameters": {
"textBody": "Thank you for contacting us! We've received your message and our team will respond within 24 hours. Your message has been translated and forwarded to our support team.\\n\\nReference ID: {{ $json.timestamp }}",
"operation": "send",
"phoneNumberId": "your-phone-id",
"additionalFields": {},
"recipientPhoneNumber": "={{ $('Data Normalizer & Validator').first().json.sourceId }}"
},
"credentials": {
"whatsAppApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "317f765d-07e2-49ec-8f7b-bc7a79f85860",
"name": "Customer Email Auto-Response",
"type": "n8n-nodes-base.emailSend",
"position": [
-520,
900
],
"parameters": {
"options": {},
"subject": "We've received your message - Reference #{{ $json.timestamp }}",
"toEmail": "={{ $('Data Normalizer & Validator').first().json.sourceId }}",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "7ea5edd9-2989-4757-bbb4-47d8c04d772f",
"name": "Workflow Completion & Metrics",
"type": "n8n-nodes-base.code",
"position": [
-300,
700
],
"parameters": {
"jsCode": "// Final completion and metrics calculation\nconst startTime = new Date($('Data Normalizer & Validator').first().json.timestamp);\nconst endTime = new Date();\nconst processingTime = endTime - startTime;\n\nconst metrics = {\n processingTimeMs: processingTime,\n totalStepsCompleted: 8,\n sourceType: $('Enhanced Summary & Priority Processor').first().json.sourceType,\n priority: $('Enhanced Summary & Priority Processor').first().json.priority,\n originalLanguage: $('Enhanced Summary & Priority Processor').first().json.originalLanguage,\n wordCount: $('Enhanced Summary & Priority Processor').first().json.wordCount,\n timestamp: endTime.toISOString(),\n status: 'COMPLETED',\n workflowVersion: '2.0'\n};\n\nconsole.log('Workflow completed successfully:', metrics);\n\nreturn {\n json: {\n success: true,\n message: 'Multi-language customer support workflow completed successfully',\n metrics: metrics,\n summary: `Processed ${metrics.sourceType} message in ${metrics.originalLanguage}, translated to English, priority: ${metrics.priority}, completed in ${processingTime}ms`\n }\n};"
},
"typeVersion": 2
},
{
"id": "ad8bf732-9d89-4d1b-a7b1-94ed5209ca55",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2100,
140
],
"parameters": {
"color": 3,
"width": 540,
"height": 420,
"content": "### What this workflow does:\nAutomatically handles customer messages in any language by translating them to English, creating smart summaries, sending admin notifications, logging everything, and responding professionally to customers.\n\n### Why businesses need it:\n\nHandle global customers without language barriers\nNever miss important messages with priority detection\nSave 80% of manual work with automation\nKeep complete records for compliance/analytics\nProvide professional customer experience.\n\n### How to implement:\nSetup process with clear instructions for connecting accounts, setting up credentials, and activating the workflow."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "30770594-2dbc-4593-9d2b-fd457f215ed1",
"connections": {
"Log to Database": {
"main": [
[
{
"node": "Workflow Completion & Metrics",
"type": "main",
"index": 0
}
]
]
},
"WhatsApp Trigger": {
"main": [
[
{
"node": "Data Normalizer & Validator",
"type": "main",
"index": 0
}
]
]
},
"Admin WhatsApp Alert": {
"main": [
[
{
"node": "Workflow Completion & Metrics",
"type": "main",
"index": 0
}
]
]
},
"Check Message Source": {
"main": [
[
{
"node": "Customer WhatsApp Auto-Response",
"type": "main",
"index": 0
}
],
[
{
"node": "Customer Email Auto-Response",
"type": "main",
"index": 0
}
]
]
},
"Email Trigger (IMAP)": {
"main": [
[
{
"node": "Data Normalizer & Validator",
"type": "main",
"index": 0
}
]
]
},
"Admin Email Notification": {
"main": [
[
{
"node": "Workflow Completion & Metrics",
"type": "main",
"index": 0
}
]
]
},
"Smart Language Translator": {
"main": [
[
{
"node": "Enhanced Summary & Priority Processor",
"type": "main",
"index": 0
}
]
]
},
"Data Normalizer & Validator": {
"main": [
[
{
"node": "Smart Language Translator",
"type": "main",
"index": 0
}
]
]
},
"Customer Email Auto-Response": {
"main": [
[
{
"node": "Workflow Completion & Metrics",
"type": "main",
"index": 0
}
]
]
},
"Customer WhatsApp Auto-Response": {
"main": [
[
{
"node": "Workflow Completion & Metrics",
"type": "main",
"index": 0
}
]
]
},
"Enhanced Summary & Priority Processor": {
"main": [
[
{
"node": "Log to Database",
"type": "main",
"index": 0
},
{
"node": "Admin Email Notification",
"type": "main",
"index": 0
},
{
"node": "Admin WhatsApp Alert",
"type": "main",
"index": 0
},
{
"node": "Check Message Source",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleApiimapsmtpwhatsAppApiwhatsAppTriggerApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
AI-Powered Multi-language Customer Support
Source: https://n8n.io/workflows/5194/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Email AI Auto-responder. Summerize and send email. Uses emailReadImap, emailSend, httpRequest, googleDrive. Event-driven trigger; 78 nodes.
Email AI Auto-responder. Summerize and send email. Uses emailReadImap, emailSend, httpRequest, googleDrive. Event-driven trigger; 78 nodes.
Email AI Auto-responder. Summerize and send email. Uses emailReadImap, emailSend, httpRequest, googleDrive. Event-driven trigger; 26 nodes.
Email AI Auto-responder. Summerize and send email. Uses emailReadImap, emailSend, httpRequest, googleDrive. Event-driven trigger; 26 nodes.
This n8n template demonstrates how to create an automated construction progress notification system for real estate companies. The workflow triggers daily at 8:00 AM IST to check a Google Sheet for co