This workflow corresponds to n8n.io template #8605 — we link there as the canonical source.
This workflow follows the Gmail → HTTP Request 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": "x9eRtxMrmt4t7H3o",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Telegram Voice Message_Audio Transcription--> AI summary & Sentiment Analysis--> Gmail delivery",
"tags": [],
"nodes": [
{
"id": "4bf65cfa-267e-4250-82dd-fc78c57d3aae",
"name": "Get a file",
"type": "n8n-nodes-base.telegram",
"position": [
-720,
-480
],
"parameters": {
"fileId": "={{ $json.message.voice.file_id }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "b92120d7-5a72-4707-a7df-1aeb4ba15d89",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
-368,
-464
],
"parameters": {
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "638cc6ea-60e9-4099-8e7a-6b812aeb93d7",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
112,
-464
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d49d90fa-7138-48b8-a149-7dfcc86a1dd9",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "completed"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "ef665440-62d6-4ae5-8041-138990ed6c6c",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1312,
-624
],
"parameters": {
"color": 3,
"width": 784,
"height": 672,
"content": "# Execution flow from Telegram\n#### Send a voice message on Telegram\n"
},
"typeVersion": 1
},
{
"id": "02782777-cd0c-4a15-be14-777c54dcb8b5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-448,
-624
],
"parameters": {
"color": 4,
"width": 736,
"height": 496,
"content": "# Generate Transcript from Voice to text"
},
"typeVersion": 1
},
{
"id": "d3b028c2-a18d-4c17-8c2c-aec10b401fcd",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
-400
],
"parameters": {
"color": 6,
"width": 768,
"height": 416,
"content": "# Generate summary, Sentiment Analysis and send E-mail"
},
"typeVersion": 1
},
{
"id": "b7d8de68-ec69-4783-93c0-2f8cdef6cc0e",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1120,
-288
],
"parameters": {
"color": 5,
"width": 544,
"height": 320,
"content": " ### Assembly AI\n"
},
"typeVersion": 1
},
{
"id": "0f8e297b-5576-46d0-925a-c443b51f6d6e",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-176,
-512
],
"parameters": {
"color": 5,
"width": 192,
"height": 224,
"content": " ### Assembly AI\n"
},
"typeVersion": 1
},
{
"id": "b9b8dd97-fa8b-4b11-a208-1fd0d17d7897",
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
-128,
-464
],
"parameters": {
"url": "=https://api.assemblyai.com/v2/transcript/{{ $json.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<<YOUR_ASSEMBLYAI_API_KEY>>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "63c276ef-b591-422a-9c9a-24292f061904",
"name": "Upload Audio to Assembly AI",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1024,
-208
],
"parameters": {
"url": "https://api.assemblyai.com/v2/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<<YOUR_ASSEMBLYAI_API_KEY>>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"inputDataFieldName": "data"
},
"typeVersion": 4.2
},
{
"id": "077d2d1e-5efb-4b2c-b2e0-10012d8f2650",
"name": "Route: Text vs Audio",
"type": "n8n-nodes-base.switch",
"position": [
-960,
-464
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Voice",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b3324afd-bc0e-4229-8822-f973a143b0a1",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.message.voice.file_id }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "Text message",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8ef0fba3-6691-4f58-9194-93da59599cd8",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.message.text }}",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "ebd661fd-a9e5-4841-826e-b122c20396d0",
"name": "Transcript Analysis (AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
448,
-208
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "={{ \"gpt-4.1-mini\" }}"
},
"options": {},
"messages": {
"values": [
{
"content": "You are a precise meeting analyst. Output must be valid JSON only."
},
{
"role": "system",
"content": "=Analyze the following transcript and return strict JSON:\n\nTranscript:\n{{ $node[\"Get Transcript\"].json[\"text\"] }}\n\nRequirements:\n- summary: 120\u2013180 words, crisp and neutral\n- sentiment_label: one of [\"Positive\",\"Neutral\",\"Negative\"]\n- sentiment_score: number from -1 to 1\n- key_points: 5\u20138 bullet points (short phrases)\n- action_items: array of {owner, task, due?} if present, else []\n- notable_quotes: array of short verbatim quotes (<=120 chars)\n- topics: 3\u20136 tags\n\nReturn JSON with keys in snake_case:\n{\n \"summary\": \"...\",\n \"sentiment_label\": \"Positive\",\n \"sentiment_score\": 0.64,\n \"key_points\": [\"...\"],\n \"action_items\": [{\"owner\":\"Alice\",\"task\":\"...\",\"due\":\"2025-09-30\"}],\n \"notable_quotes\": [\"...\"],\n \"topics\": [\"...\",\"...\"]\n}\nNo preamble or Markdown\u2014JSON only."
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "5a8e489a-44ac-407e-8aae-798ecbcac561",
"name": "Send Analysis Email",
"type": "n8n-nodes-base.gmail",
"position": [
720,
-208
],
"parameters": {
"sendTo": "=<<YOUR_EMAIL ID>>",
"message": "={{\n(() => {\n const d = $node[\"Transcript Analysis (AI)\"].json.message.content;\n\n const row = (label, value, i) =>\n `<tr style=\"background-color:${i % 2 === 0 ? '#f9f9f9' : '#ffffff'};\">\n <td style=\"padding:12px 16px;border:1px solid #ccc;font-weight:bold;width:220px;background:#f2f2f2;\">${label}</td>\n <td style=\"padding:12px 16px;border:1px solid #ccc;\">${value || ''}</td>\n </tr>`;\n\n const ul = arr => `<ul style=\"margin:0;padding-left:22px;\">${(arr || []).map(x => `<li>${x}</li>`).join('')}</ul>`;\n\n const actions = (d.action_items || []).length\n ? `<ol style=\"margin:0;padding-left:22px;\">${d.action_items.map(a =>\n `<li><strong>${a.owner || '\u2014'}</strong>: ${a.task || ''}${a.due ? ' (Due: ' + a.due + ')' : ''}</li>`\n ).join('')}</ol>`\n : \"No explicit action items detected.\";\n\n let html = `\n <div style=\"font-family:Arial,sans-serif;font-size:16px;line-height:1.5;\">\n <h2 style=\"color:#2c3e50;border-bottom:2px solid #2c3e50;padding-bottom:6px;margin-bottom:12px;\">Transcript Analysis</h2>\n <table style=\"border-collapse:collapse;border:1px solid #ccc;width:100%;font-size:16px;\">\n <thead>\n <tr style=\"background:#2c3e50;color:#ffffff;\">\n <th style=\"padding:12px 16px;text-align:left;width:220px;\">Section</th>\n <th style=\"padding:12px 16px;text-align:left;\">Details</th>\n </tr>\n </thead>\n <tbody>\n ${row(\"Executive Summary\", d.summary, 0)}\n ${row(\"Sentiment\", `<strong>Label:</strong> ${d.sentiment_label || ''}<br/><strong>Score:</strong> ${d.sentiment_score ?? ''}`, 1)}\n ${row(\"Key Points\", ul(d.key_points), 2)}\n ${row(\"Action Items\", actions, 3)}\n ${row(\"Notable Quotes\", ul(d.notable_quotes), 4)}\n ${row(\"Topics\", (d.topics || []).join(\", \"), 5)}\n </tbody>\n </table>\n </div>\n `;\n\n return html;\n})()\n}}\n",
"options": {},
"subject": "=Transcript summary & sentiment \u2013 \n {{ $now.toISO() }} \n"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "40a7b17e-71dd-4c05-ac7f-f522ee0195bb",
"name": "The End",
"type": "n8n-nodes-base.noOp",
"position": [
944,
-208
],
"parameters": {},
"typeVersion": 1
},
{
"id": "400a7f1a-9476-4d91-a6bb-120c77b6d00c",
"name": "Request Transcript from AssemblyAI2",
"type": "n8n-nodes-base.httpRequest",
"position": [
-736,
-208
],
"parameters": {
"url": "https://api.assemblyai.com/v2/transcript",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "audio_url",
"value": "={{ $json.upload_url }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<<YOUR_ASSEMBLYAI_API_KEY>>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f690e809-3741-46da-b32d-490fef679062",
"name": "Voice Message",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-1200,
-464
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "1de3e707-c2ef-4d1f-88c0-4a2f1658f99b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2320,
-800
],
"parameters": {
"width": 912,
"height": 1168,
"content": "# Try it Out!\n\n### Capture voice messages from Telegram, transcribe them with AssemblyAI, analyze with AI for summary, key points, action items, and sentiment insights, and get a polished Gmail report.\n### Perfect for SMBs that record meetings as voice notes instead of using Zoom or Teams.\n\n## How it works\n\n### - A voice message is sent to your Telegram Bot \n### - The audio file is uploaded to AssemblyAI \n### - AssemblyAI generates the transcript \n### - OpenAI analyzes the text to create: \n ### - Summary \n ### - Sentiment label & score \n ### - Key points \n ### - Action items \n ### - Notable quotes \n ### - Topics \n### - Gmail sends the formatted transcript analysis as a structured email report \n\n## How to use\n\n ### - Import this workflow into n8n \n ### - Configure credentials: \n ### - Telegram Bot API token \n ### - AssemblyAI API key \n ### - OpenAI API key \n ### - Gmail OAuth2 account \n ### - Replace placeholders (e.g., `<<YOUR_EMAIL ID>>`, `<<YOUR_ASSEMBLYAI_API_KEY>>`) with your ### own values \n ### - Run the workflow \u2014 every Telegram voice message is processed into insights and emailed ### automatically \n\n## Requirements\n\n### - Telegram Bot account (API token) \n### - AssemblyAI API key \n### - OpenAI API key \n### - Gmail OAuth2 credentials in n8n \n### - Active n8n instance \n\n## Need Help?\n\n### Join the [Discord](https://discord.gg/n8n) or ask in the [Forum](https://community.n8n.io)!\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "ee80a2d6-9ef7-41d2-8e33-a6b077e77aa0",
"connections": {
"If": {
"main": [
[
{
"node": "Transcript Analysis (AI)",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Get Transcript",
"type": "main",
"index": 0
}
]
]
},
"Get a file": {
"main": [
[
{
"node": "Upload Audio to Assembly AI",
"type": "main",
"index": 0
}
]
]
},
"Voice Message": {
"main": [
[
{
"node": "Route: Text vs Audio",
"type": "main",
"index": 0
}
]
]
},
"Get Transcript": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Send Analysis Email": {
"main": [
[
{
"node": "The End",
"type": "main",
"index": 0
}
]
]
},
"Route: Text vs Audio": {
"main": [
[
{
"node": "Get a file",
"type": "main",
"index": 0
}
]
]
},
"Transcript Analysis (AI)": {
"main": [
[
{
"node": "Send Analysis Email",
"type": "main",
"index": 0
}
]
]
},
"Upload Audio to Assembly AI": {
"main": [
[
{
"node": "Request Transcript from AssemblyAI2",
"type": "main",
"index": 0
}
]
]
},
"Request Transcript from AssemblyAI2": {
"main": [
[
{
"node": "Wait",
"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.
gmailOAuth2openAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n template demonstrates how to capture Telegram voice messages, transcribe them into text using AssemblyAI, analyze the transcript with AI for summary and sentiment insights, and finally deliver a structured email report via Gmail. Automating meeting or lecture voice note…
Source: https://n8n.io/workflows/8605/ — 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.
Send a target niche and location via Telegram message Workflow discovers businesses via Google Maps API AI enriches contacts with email and LinkedIn data via Serper GPT-4o scores and qualifies each le
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
Transform your Telegram bot into an AI vision system using GPT-4o-Mini and NVIDIA Stable Diffusion 3. Perfect for content moderators, researchers, and developers. At start: Processes Telegram messages
Ask questions like “How much did I spend on food last month?” and get instant answers from your financial data — directly in Telegram.