This workflow corresponds to n8n.io template #8639 — we link there as the canonical source.
This workflow follows the Form Trigger → Gmail 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": "wtRwIBJPAbnyUbe9",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Only Onform submission_Two-Source Audio Transcription--> AI summary & Sentiment Analysis--> Gmail delivery",
"tags": [],
"nodes": [
{
"id": "45c9716a-3d65-4fdc-bdc1-8feb130ecf38",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
-304,
-240
],
"parameters": {
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "b1163157-dc8c-4573-a967-93a9dea55dcf",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
64,
-240
],
"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": "62aec10f-d637-4cbb-b457-f9bd7a086932",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1264,
-144
],
"parameters": {
"color": 4,
"width": 736,
"height": 432,
"content": "### Execution flow Form submission + Local file\n#### Upload an audio file \n"
},
"typeVersion": 1
},
{
"id": "8b93808e-44cb-4f86-aac7-c8ead6cca669",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-384,
-368
],
"parameters": {
"color": 2,
"width": 608,
"height": 352,
"content": "### Generate Transcript from Voice to text"
},
"typeVersion": 1
},
{
"id": "bb2672af-35a4-4e59-8654-baba7b97d624",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
256,
-368
],
"parameters": {
"color": 6,
"width": 608,
"height": 352,
"content": "### Generate summary, Sentiment Analysis and send E-mail"
},
"typeVersion": 1
},
{
"id": "ea81f226-67de-4a39-92d8-bf315845cd28",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-992,
-96
],
"parameters": {
"color": 5,
"width": 432,
"height": 272,
"content": " ### Assembly AI\n"
},
"typeVersion": 1
},
{
"id": "d9e4b12c-80e2-480d-980d-379c751c9531",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-160,
-304
],
"parameters": {
"color": 5,
"width": 192,
"height": 224,
"content": " ### Assembly AI\n"
},
"typeVersion": 1
},
{
"id": "f0d81a15-4490-47bf-8414-56c6348ec1bd",
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
-96,
-240
],
"parameters": {
"url": "=https://api.assemblyai.com/v2/transcript/{{ $json.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<< PROVIDE YOUR ASSEMBLY API KEY >>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "1957c1fe-7bc3-4db9-ab6e-f25daf24b5e7",
"name": "Transcript Analysis (AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
320,
-256
],
"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": "6c2e15bf-ee10-43b0-befc-49001a41a9e6",
"name": "Send Analysis Email",
"type": "n8n-nodes-base.gmail",
"position": [
512,
-256
],
"parameters": {
"sendTo": "=<< PROVIDE YOUR GMAIL 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": "19968c49-4e8b-41e4-89f6-54460867dbff",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1248,
-720
],
"parameters": {
"color": 3,
"width": 736,
"height": 528,
"content": "### Execution flow Form submission + Google Drive link\n#### Receive Google Drive Link "
},
"typeVersion": 1
},
{
"id": "65a9f81c-f35a-445e-89d4-17388693fbef",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-992,
-448
],
"parameters": {
"color": 5,
"width": 448,
"height": 240,
"content": " ### Assembly AI\n"
},
"typeVersion": 1
},
{
"id": "30f56c7f-ede6-4037-bce3-a5c43227e28f",
"name": "The End",
"type": "n8n-nodes-base.noOp",
"position": [
704,
-256
],
"parameters": {},
"typeVersion": 1
},
{
"id": "00ade2c9-7a3e-4e92-abff-342c71c0bc8f",
"name": "Extract File ID from Link",
"type": "n8n-nodes-base.code",
"position": [
-1040,
-592
],
"parameters": {
"jsCode": "const link =\n $json['Provide the URL/Link of the audio file'] ||\n $json.drive_link ||\n '';\n\nconst m = link.match(/(?:\\/d\\/|id=)([A-Za-z0-9_-]{20,})/);\nif (!m) {\n throw new Error('Could not extract Google Drive file ID from the form field.');\n}\n\nreturn [{ fileId: m[1] }];\n"
},
"typeVersion": 2
},
{
"id": "9b86268c-57e6-4778-981b-f55d587be75d",
"name": "Fetch File from Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-784,
-592
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.fileId }}"
},
"options": {
"binaryPropertyName": "file"
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "504cfac0-19d2-4d0a-b7e8-97be9f450212",
"name": "Upload File to AssemblyAI",
"type": "n8n-nodes-base.httpRequest",
"position": [
-928,
-368
],
"parameters": {
"url": "https://api.assemblyai.com/v2/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<< PROVIDE YOUR ASSEMBLY API KEY >>"
}
]
},
"inputDataFieldName": "file"
},
"typeVersion": 4.2
},
{
"id": "2b514d7f-49b2-4e82-aaa9-6ead8b7154bf",
"name": "Upload Audio file to Assembly AI1",
"type": "n8n-nodes-base.httpRequest",
"position": [
-944,
-64
],
"parameters": {
"url": "https://api.assemblyai.com/v2/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<< PROVIDE YOUR ASSEMBLY API KEY >>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"inputDataFieldName": "Upload_file"
},
"typeVersion": 4.2
},
{
"id": "25c8cc0e-f416-4d3b-b0e6-e96388cff8e8",
"name": "Request Transcript from AssemblyAI",
"type": "n8n-nodes-base.httpRequest",
"position": [
-688,
-368
],
"parameters": {
"url": "https://api.assemblyai.com/v2/transcript",
"method": "POST",
"options": {},
"jsonBody": "={\n \"audio_url\": \"{{$json.upload_url}}\",\n \"speaker_labels\": false,\n \"auto_highlights\": true,\n \"punctuate\": true\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "authorization",
"value": "<< PROVIDE YOUR ASSEMBLY API KEY >>"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "78b5a8c9-8f58-41c1-bcee-b149a183d1c0",
"name": "Request Transcript from AssemblyAI1",
"type": "n8n-nodes-base.httpRequest",
"position": [
-704,
-64
],
"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": "<< PROVIDE YOUR ASSEMBLY API KEY >>"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "9fac3888-e100-4d1c-8af7-9764a930177f",
"name": "Audio_on form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-1232,
-592
],
"parameters": {
"options": {},
"formTitle": "Upload your Audio file",
"formFields": {
"values": [
{
"fieldLabel": "Name of the Audio file",
"requiredField": true
},
{
"fieldLabel": "Provide the URL/Link of the audio file",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "E-mail",
"placeholder": "user@example.com",
"requiredField": true
}
]
},
"formDescription": "The audio file will be transcribed, Analysed and summarised. "
},
"typeVersion": 2.3
},
{
"id": "6faa3fbf-269b-4bd3-9ff3-633ba4e88603",
"name": "Audio_on form submission1",
"type": "n8n-nodes-base.formTrigger",
"position": [
-1216,
48
],
"parameters": {
"options": {},
"formTitle": "Upload your Audio file",
"formFields": {
"values": [
{
"fieldLabel": "Name of the Audio file",
"requiredField": true
},
{
"fieldType": "file",
"fieldLabel": "Upload file",
"requiredField": true,
"acceptFileTypes": "e.g .MP4"
},
{
"fieldType": "email",
"fieldLabel": "E-mail",
"placeholder": "user@example.com",
"requiredField": true
}
]
},
"formDescription": "The audio file will be transcribed, Analysed and summarised. "
},
"typeVersion": 2.3
},
{
"id": "28b5a48c-2a91-4583-bd8a-aae180890768",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2016,
-752
],
"parameters": {
"width": 656,
"height": 1200,
"content": "# Try It Out!\n\nThis n8n template demonstrates how to use AI to transform audio files into **actionable insights**. \nIt supports both **local file uploads** and **Google Drive links**. \n\n## How it works\n\n- Users upload an audio file **via form** or provide a **Google Drive link** \n- Files are passed to **AssemblyAI** for transcription \n- AssemblyAI converts audio \u2192 text with punctuation and highlights \n- A loop with **Wait + If** ensures the transcript is ready before moving forward \n- Transcript text is passed to **OpenAI** (via n8n LangChain) \n- OpenAI generates a **structured summary** including: \n - Executive summary \n - Sentiment label + score \n - Key points and highlights \n - Action items (if detected) \n - Notable quotes \n - Topics \n- The AI output is formatted into a **rich HTML email** \n- Gmail node sends the email to the provided recipient \n- The workflow ends with a clean, structured delivery \n\n---\n\n## How to use\n\n- Replace the **manual trigger** with your own (e.g., webhook or form submission) \n- Provide either a **local audio file** or a **Google Drive link** \n- Ensure AssemblyAI and Gmail credentials are set in n8n \n- Run the workflow end-to-end to generate insights \n- Check your email inbox for the **analysis report** \n- Use it for meetings, lectures, or podcasts instantly \n\n---\n\n## Requirements\n\n- n8n instance with HTTP + Gmail integration \n- **AssemblyAI account** for transcription \n- **OpenAI account** (or equivalent LLM integration) for analysis \n- Google Drive (optional, if using Drive links) \n\n---\n\n## Need Help?\n\n- Join the [n8n Forum](https://community.n8n.io) \n- Or connect with the n8n Discord community \n\nHappyAutomating !!! \n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "719df1dc-95af-42bb-9cca-3a83b2f4b6b6",
"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 Transcript": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Send Analysis Email": {
"main": [
[
{
"node": "The End",
"type": "main",
"index": 0
}
]
]
},
"Audio_on form submission": {
"main": [
[
{
"node": "Extract File ID from Link",
"type": "main",
"index": 0
}
]
]
},
"Transcript Analysis (AI)": {
"main": [
[
{
"node": "Send Analysis Email",
"type": "main",
"index": 0
}
]
]
},
"Audio_on form submission1": {
"main": [
[
{
"node": "Upload Audio file to Assembly AI1",
"type": "main",
"index": 0
}
]
]
},
"Extract File ID from Link": {
"main": [
[
{
"node": "Fetch File from Google Drive",
"type": "main",
"index": 0
}
]
]
},
"Upload File to AssemblyAI": {
"main": [
[
{
"node": "Request Transcript from AssemblyAI",
"type": "main",
"index": 0
}
]
]
},
"Fetch File from Google Drive": {
"main": [
[
{
"node": "Upload File to AssemblyAI",
"type": "main",
"index": 0
}
]
]
},
"Upload Audio file to Assembly AI1": {
"main": [
[
{
"node": "Request Transcript from AssemblyAI1",
"type": "main",
"index": 0
}
]
]
},
"Request Transcript from AssemblyAI": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Request Transcript from AssemblyAI1": {
"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.
gmailOAuth2googleDriveOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow enables seamless speech-to-text transcription, AI-powered summarization, sentiment analysis, and automated email delivery. It supports two different input modes: Form Upload (Local File) Form Submission (Google Drive Link) Input Form 1: Upload an audio file (e.g.,…
Source: https://n8n.io/workflows/8639/ — 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.
What it is An automated LinkedIn content system that takes a simple form (idea + optional file), generates LinkedIn posts with OpenAI, stores them in Notion, builds Google Slides carousels, and auto-p
AI Proposal Generator System
Goal: This workflow demonstrates the full fluidX THE EYE integration — starting a live session, inviting both the customer (via SMS) and the service agent (via email), and then accessing the media (ph
This workflow is ideal for content creators, training providers, agencies, and businesses that need to quickly turn raw videos into polished, captioned, or narrated content — without hiring editors or
Automate the entire process of converting any website or domain into clean, structured, AI-ready knowledge bases for Large Language Models (LLMs), semantic search, and chatbot development. URL Input v