This workflow corresponds to n8n.io template #14588 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "a988d437-77e0-4a64-a6d0-af5311e6ef10",
"name": "Main \u2014 Overview & Setup",
"type": "n8n-nodes-base.stickyNote",
"position": [
-544,
-192
],
"parameters": {
"width": 400,
"height": 748,
"content": "## Sales Call Auto-Summarizer & CRM Updater\n\n### How it works\nSalesperson pastes a Zoom or Google Meet recording URL into a form along with client details. The workflow sends the recording to WayinVideo for transcription, waits for processing, then uses GPT-4o-mini to extract structured CRM data \u2014 including deal status, action items, objections, and buying signals \u2014 and saves the full report to a shared Google Doc automatically.\n\n### Setup\n1. Replace **YOUR_WAYIN_API_KEY** in nodes 2 and 4 with your WayinVideo bearer token\n2. Connect your **OpenAI** account in node 6 (OpenAI Chat Model)\n3. Replace **YOUR_GOOGLE_DOC_URL_OR_ID** in node 7 with your actual Google Doc ID or URL\n4. Connect your **Google Docs OAuth2** credential in node 7\n5. Activate the workflow and share the form URL with your sales team\n\n### Customization tips\n- Swap GPT-4o-mini for GPT-4o for higher accuracy on complex calls\n- Add a Slack or email node after step 7 to notify the team when a new report is saved\n- Extend the IF loop retry limit by adding a counter variable to avoid infinite loops on failed transcriptions"
},
"typeVersion": 1
},
{
"id": "86fb351e-179d-4c2f-8d48-9dc2f773cf36",
"name": "Section \u2014 Input Form",
"type": "n8n-nodes-base.stickyNote",
"position": [
-112,
-112
],
"parameters": {
"color": 5,
"width": 296,
"height": 116,
"content": "## Section 1 \u2014 Input\nSalesperson fills a form with the recording URL and call details. This triggers the entire automation pipeline."
},
"typeVersion": 1
},
{
"id": "d1cb65d3-f900-4fba-9929-b78e2e24e72d",
"name": "Section \u2014 Transcription",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
-112
],
"parameters": {
"color": 5,
"width": 520,
"height": 116,
"content": "## Section 2 \u2014 Transcription\nRecording URL is submitted to WayinVideo. The workflow waits 45 seconds then polls for the completed speaker-labeled transcript."
},
"typeVersion": 1
},
{
"id": "fa6fc0f8-3fbd-48ec-b67b-16562e3f58a2",
"name": "Section \u2014 Readiness Check",
"type": "n8n-nodes-base.stickyNote",
"position": [
752,
-112
],
"parameters": {
"color": 5,
"width": 344,
"height": 116,
"content": "## Section 3 \u2014 Readiness Check\nIF node checks whether the transcript array is non-empty. If not ready, loops back to wait another 45 seconds and retries."
},
"typeVersion": 1
},
{
"id": "f5f61c59-5246-4217-8b5e-dc744a443365",
"name": "Section \u2014 AI Report & Save",
"type": "n8n-nodes-base.stickyNote",
"position": [
1104,
-112
],
"parameters": {
"color": 5,
"width": 396,
"height": 132,
"content": "## Section 4 \u2014 AI Report & Save\nGPT-4o-mini analyzes the transcript and generates a structured CRM report. The report is appended to the shared Google Doc with a timestamp."
},
"typeVersion": 1
},
{
"id": "075a3a16-2865-480c-b354-d99bf9949a0a",
"name": "Warning \u2014 Infinite Loop Risk",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
288
],
"parameters": {
"color": 3,
"width": 648,
"height": 140,
"content": "## \u26a0\ufe0f WARNING \u2014 Infinite Loop Risk\nIf WayinVideo never returns a transcript (e.g. invalid URL, unsupported format), the IF node will loop indefinitely between Wait and Get Transcript. Add a counter or max-retry limit to prevent runaway executions."
},
"typeVersion": 1
},
{
"id": "3e7dbb0f-32a1-418e-b14e-34ac1041b25e",
"name": "1. Form \u2014 Call Recording + Details",
"type": "n8n-nodes-base.formTrigger",
"position": [
-64,
48
],
"parameters": {
"options": {},
"formTitle": "\ud83d\udcde Sales Call Auto-Summarizer & CRM Updater",
"formFields": {
"values": [
{
"fieldLabel": "Call Recording URL",
"placeholder": "https://zoom.us/rec/xxxxxxx or Google Meet recording link",
"requiredField": true
},
{
"fieldLabel": "Client / Company Name",
"placeholder": "e.g. Rahul Sharma / ABC Digital Solutions",
"requiredField": true
},
{
"fieldLabel": "Salesperson Name",
"placeholder": "e.g. Deepak Verma",
"requiredField": true
},
{
"fieldLabel": "Product / Service Discussed",
"placeholder": "e.g. SEO Package, GEO Services, Social Media Management",
"requiredField": true
}
]
},
"formDescription": "Paste your sales call recording URL \u2014 AI will extract CRM notes, action items, deal status and next steps automatically."
},
"typeVersion": 2.2
},
{
"id": "806f5ab9-f206-420b-a3d2-2a9e7e58a5c7",
"name": "2. WayinVideo \u2014 Submit Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
208,
48
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/transcripts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $json['Call Recording URL'] }}\",\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "c0a3115c-3a9e-4ff0-abda-e7510736d952",
"name": "3. Wait \u2014 45 Seconds",
"type": "n8n-nodes-base.wait",
"position": [
448,
48
],
"parameters": {
"amount": 45
},
"typeVersion": 1.1
},
{
"id": "b20f63a3-d04d-4038-94a5-e47e16db1b0c",
"name": "4. WayinVideo \u2014 Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
688,
48
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/transcripts/results/{{ $('2. WayinVideo \u2014 Submit Transcript').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "ce977fdc-6cfa-4d7e-97fd-1ab786a2bee5",
"name": "OpenAI Chat Model \u2014 GPT-4o-mini",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1104,
256
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "53ff6e69-aa7f-491c-84a9-c309c1dcc442",
"name": "5. IF \u2014 Transcript Ready?1",
"type": "n8n-nodes-base.if",
"position": [
896,
48
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4b631170-4d78-411e-956c-3bc98966bfed",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.data.transcript }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "80d1240d-1c73-4e6f-a5dd-e04ab2d77595",
"name": "6. AI Agent \u2014 Generate CRM Report1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1104,
32
],
"parameters": {
"text": "=You are a CRM specialist. Your job is to analyze a sales call transcript and extract structured CRM data.\n\nIMPORTANT: Speaker 1 is the salesperson. Speaker 2 is the client.\n\nCall Details:\n- Salesperson: {{ $('1. Form \u2014 Call Recording + Details').item.json['Salesperson Name'] }}\n- Client / Company: {{ $('1. Form \u2014 Call Recording + Details').item.json['Client / Company Name'] }}\n- Product / Service Discussed: {{ $('1. Form \u2014 Call Recording + Details').item.json['Product / Service Discussed'] }}\n- Recording URL: {{ $('1. Form \u2014 Call Recording + Details').item.json['Call Recording URL'] }}\n\nFull Call Transcript:\n{{ $('4. WayinVideo \u2014 Get Transcript').item.json.data.transcript.map(s => '[' + s.speaker + ' | ' + Math.floor(s.start/1000) + 's] ' + s.text).join('\\n') }}\n\nExtract the CRM data and write a structured report using this exact format. Do not skip any section.\n\n=== SALES CALL CRM REPORT ===\n\nDATE: [Today's date]\nSALESPERSON: [Salesperson name from above]\nCLIENT: [Client name from above]\nPRODUCT DISCUSSED: [Product name from above]\nCALL RECORDING: [Recording URL from above]\n\n---\n\nCALL SUMMARY:\n[Write 3 to 4 sentences about what was discussed in the call. Include the main topic, what the client asked, and how the conversation ended.]\n\n---\n\nACTION ITEMS:\n[List every task the salesperson must do after this call. One action per line starting with a dash.]\n- \n- \n- \n\n---\n\nDEAL STATUS:\n[Choose exactly one: Hot Lead / Warm Lead / Cold Lead / Negotiating / Closed Won / Closed Lost]\nReason: [Write 1 sentence explaining why you chose this status]\n\n---\n\nCLIENT OBJECTIONS:\n[List every concern or problem the client raised. One per line starting with a dash. If none, write: None raised.]\n- \n\n---\n\nBUYING SIGNALS:\n[List every positive statement or sign of interest from the client. One per line starting with a dash. If none, write: None detected.]\n- \n\n---\n\nPRICING DISCUSSED:\n[Write any price, budget, or discount mentioned during the call. If nothing was discussed, write: Not discussed.]\n\n---\n\nNEXT FOLLOW-UP:\n[Write the exact date or timeline mentioned for the next step. If nothing was mentioned, write: Not specified.]\n\n---\n\nOVERALL CALL SENTIMENT: [Choose one: Positive / Neutral / Negative]\n\n=== END OF REPORT ===",
"options": {},
"promptType": "define"
},
"typeVersion": 3.1
}
],
"connections": {
"3. Wait \u2014 45 Seconds": {
"main": [
[
{
"node": "4. WayinVideo \u2014 Get Transcript",
"type": "main",
"index": 0
}
]
]
},
"5. IF \u2014 Transcript Ready?1": {
"main": [
[
{
"node": "6. AI Agent \u2014 Generate CRM Report1",
"type": "main",
"index": 0
}
],
[
{
"node": "3. Wait \u2014 45 Seconds",
"type": "main",
"index": 0
}
]
]
},
"4. WayinVideo \u2014 Get Transcript": {
"main": [
[
{
"node": "5. IF \u2014 Transcript Ready?1",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model \u2014 GPT-4o-mini": {
"ai_languageModel": [
[
{
"node": "6. AI Agent \u2014 Generate CRM Report1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"2. WayinVideo \u2014 Submit Transcript": {
"main": [
[
{
"node": "3. Wait \u2014 45 Seconds",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Call Recording + Details": {
"main": [
[
{
"node": "2. WayinVideo \u2014 Submit Transcript",
"type": "main",
"index": 0
}
]
]
},
"6. AI Agent \u2014 Generate CRM Report1": {
"main": [
[]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Paste any sales call recording URL into a form — this n8n workflow automatically transcribes the call using WayinVideo, extracts structured CRM data with AI, and saves a complete report directly to your shared Google Doc.** No manual note-taking, no missed action items, no…
Source: https://n8n.io/workflows/14588/ — 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.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.
PixelSensei(ZH). Uses agent, outputParserStructured, formTrigger, lmChatOpenAi. Event-driven trigger; 55 nodes.
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
Lection 9 main. Uses formTrigger, chatTrigger, agent, lmChatOpenAi. Event-driven trigger; 55 nodes.