This workflow corresponds to n8n.io template #15664 — 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": "3c4f7b3d-184c-443f-8cd1-6998e863ecfa",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
-320
],
"parameters": {
"color": 4,
"width": 556,
"height": 1220,
"content": "## Customer Support Call to Zendesk Ticket + AI Summary + Google Sheets Log \u2014 WayinVideo Transcription + GPT-4o-mini + Zendesk + Sheets\n\nFor customer support teams, customer success managers, and QA teams who record support calls and want to automatically log structured tickets in Zendesk \u2014 without manually listening to recordings or writing ticket notes after every call. Submit any support call recording URL via the form. WayinVideo Transcription API transcribes the full call with speaker labels and timestamps. GPT-4o-mini reads the transcript and extracts 10 structured fields: ticket subject, issue summary, root cause, resolution given, follow-up actions, key customer quotes, sentiment, priority, CSAT prediction (1\u20135), and tags. A Code node builds the formatted Zendesk ticket body with section headers, maps the priority to Zendesk values, and assembles all fields. An HTTP Request creates the Zendesk ticket via the REST API with the customer as requester. Google Sheets logs all 19 fields including the Zendesk Ticket ID and constructed Ticket URL.\n\n## How it works\n- **1. Form \u2014 Support Call + Details** collects the recording URL, agent name, customer name, customer email, issue category, call date, and product name\n- **2. WayinVideo \u2014 Submit Transcription** submits the URL to the Transcription API\n- **3. Wait \u2014 90 Seconds** gives the API initial processing time\n- **4. WayinVideo \u2014 Get Transcript Results** polls the transcripts results endpoint\n- **5. IF \u2014 Transcription Complete?** checks for SUCCEEDED \u2014 if not, retries via 30-second wait\n- **7. Code \u2014 Format Transcript** formats each segment with speaker label and timestamp, computes duration and word count\n- **8. AI Agent \u2014 Extract Support Summary** uses GPT-4o-mini with 10 labeled output sections to extract structured support intelligence\n- **9. OpenAI \u2014 GPT-4o-mini Model** language model attached to the AI Agent\n- **10. Code \u2014 Parse Support Output** extracts all 10 sections, maps priority to Zendesk values, builds the full ticket body with section headers\n- **11. HTTP Request \u2014 Create Zendesk Ticket** POSTs to the Zendesk REST API with the customer as requester and parsed priority\n- **12. Google Sheets \u2014 Log Support Record** appends 19 columns including Zendesk Ticket ID and constructed Ticket URL\n\n## Set up steps\n1. In **2** and **4** \u2014 replace `YOUR_WAYINVIDEO_API_KEY`\n2. In **9. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **11. HTTP Request \u2014 Create Zendesk Ticket** \u2014 replace `YOUR_ZENDESK_SUBDOMAIN`, `YOUR_ZENDESK_EMAIL`, and `YOUR_ZENDESK_API_TOKEN` (Zendesk Admin \u2192 Apps and Integrations \u2192 APIs \u2192 Add API Token)\n4. In **12. Google Sheets \u2014 Log Support Record** \u2014 connect your Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`\n5. Create a Google Sheet tab named Support Call Log with columns: Call Date, Agent Name, Customer Name, Customer Email, Product, Issue Category, Issue Summary, Root Cause, Resolution Given, Follow-up Required, Sentiment, Priority, CSAT Prediction, Tags, Zendesk Ticket ID, Zendesk Ticket URL, Call Duration (min), Recording URL, Created On"
},
"typeVersion": 1
},
{
"id": "20c6981d-bc69-4951-9d16-d6e5484c7de8",
"name": "Section \u2014 Form Input",
"type": "n8n-nodes-base.stickyNote",
"position": [
-176,
-64
],
"parameters": {
"color": 5,
"width": 344,
"height": 452,
"content": "## Form Input\nAgent submits call recording URL, agent name, customer name, customer email, issue category, call date, and product or service name."
},
"typeVersion": 1
},
{
"id": "e2c7a9cd-6751-495f-8731-1526b799d0f7",
"name": "Section \u2014 WayinVideo Transcription Submit and Poll",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
-16
],
"parameters": {
"color": 6,
"width": 724,
"height": 388,
"content": "## WayinVideo Transcription Submit and Poll\nSubmits the call recording URL to the Transcription API. Waits 90 seconds for initial processing. Polls the results endpoint until status equals SUCCEEDED."
},
"typeVersion": 1
},
{
"id": "43d452b3-9346-4234-875b-63c4f1a01c5b",
"name": "Section \u2014 Transcription Status Check and Retry Loop",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
-272
],
"parameters": {
"color": 6,
"width": 388,
"height": 644,
"content": "## Transcription Status Check and Retry Loop\nIF checks for SUCCEEDED status. TRUE proceeds to transcript formatting. FALSE waits 30 seconds and polls again. Loop continues until transcript is ready."
},
"typeVersion": 1
},
{
"id": "fa7190b1-d4e5-4093-afb9-7785786dc064",
"name": "Section \u2014 Transcript Formatting and AI Support Analysis",
"type": "n8n-nodes-base.stickyNote",
"position": [
1456,
-224
],
"parameters": {
"color": 6,
"width": 564,
"height": 564,
"content": "## Transcript Formatting and AI Support Analysis\nFormats transcript with speaker labels and timestamps. GPT-4o-mini extracts 10 structured fields: ticket subject, issue summary, root cause, resolution, follow-up, key quotes, sentiment, priority, CSAT prediction, and tags."
},
"typeVersion": 1
},
{
"id": "ef1a32ee-c231-45f7-b478-b2dad07f5913",
"name": "Section \u2014 Support Output Parse, Zendesk Ticket Create, and Sheet Log",
"type": "n8n-nodes-base.stickyNote",
"position": [
2112,
-224
],
"parameters": {
"color": 4,
"width": 724,
"height": 340,
"content": "## Support Output Parse, Zendesk Ticket Create, and Sheet Log\nParses 10 labeled sections, maps priority to Zendesk values, builds ticket body. Creates Zendesk ticket via REST API with customer as requester. Logs 19 fields to Google Sheets including Ticket ID and URL."
},
"typeVersion": 1
},
{
"id": "4f9fc161-c749-437e-833d-3e4c829c6b72",
"name": "1. Form \u2014 Support Call + Details",
"type": "n8n-nodes-base.formTrigger",
"position": [
-48,
112
],
"parameters": {
"options": {},
"formTitle": "Support Call to Zendesk Ticket Creator",
"formFields": {
"values": [
{
"fieldLabel": "Call Recording URL",
"placeholder": "https://zoom.us/rec/xxxxxxx or Loom/Google Meet link",
"requiredField": true
},
{
"fieldLabel": "Agent Name",
"placeholder": "e.g. Sarah Johnson",
"requiredField": true
},
{
"fieldLabel": "Customer Name",
"placeholder": "e.g. John Smith",
"requiredField": true
},
{
"fieldLabel": "Customer Email",
"placeholder": "user@example.com",
"requiredField": true
},
{
"fieldLabel": "Issue Category",
"placeholder": "e.g. Billing, Technical Issue, Onboarding, Account, Feature Request",
"requiredField": true
},
{
"fieldLabel": "Call Date",
"placeholder": "e.g. 2025-05-12",
"requiredField": true
},
{
"fieldLabel": "Product / Service Name",
"placeholder": "e.g. Incrementors CRM, Enterprise Plan, Mobile App",
"requiredField": true
}
]
},
"formDescription": "Paste your customer support call recording URL. AI will transcribe the full call, extract the issue summary, and automatically create a Zendesk ticket."
},
"typeVersion": 2.2
},
{
"id": "080b49cf-dcaa-472b-898b-5a37fdce9a41",
"name": "2. WayinVideo \u2014 Submit Transcription",
"type": "n8n-nodes-base.httpRequest",
"position": [
272,
112
],
"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": "5bf45793-960f-476a-95ac-60e1ce24f936",
"name": "3. Wait \u2014 90 Seconds",
"type": "n8n-nodes-base.wait",
"position": [
512,
112
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "4add8ee0-e09f-4215-99ed-8323633458a5",
"name": "4. WayinVideo \u2014 Get Transcript Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
752,
112
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/transcripts/results/{{ $('2. WayinVideo \u2014 Submit Transcription').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "2b2cafd8-42a9-4951-8955-bea9337612d1",
"name": "5. IF \u2014 Transcription Complete?",
"type": "n8n-nodes-base.if",
"position": [
1040,
-32
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "status-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "a512b59a-401b-4e1c-b108-6f9d0db8f3f4",
"name": "6. Wait \u2014 30 Seconds Retry",
"type": "n8n-nodes-base.wait",
"position": [
1248,
128
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "51ff5067-5cea-4913-8f49-428bea1cb0c2",
"name": "7. Code \u2014 Format Transcript",
"type": "n8n-nodes-base.code",
"position": [
1520,
-80
],
"parameters": {
"jsCode": "// Format transcript with speaker labels\nconst segments = $('4. WayinVideo \u2014 Get Transcript Results').item.json.data.transcript || [];\n\nif (segments.length === 0) {\n throw new Error('Transcript is empty \u2014 check if the call recording URL is valid and publicly accessible.');\n}\n\nconst formattedTranscript = segments\n .map(s => {\n const ms = Math.floor(s.start / 1000);\n const mm = Math.floor(ms / 60);\n const ss = ms % 60;\n return `[${s.speaker} | ${mm}:${ss.toString().padStart(2,'0')}] ${s.text.trim()}`;\n })\n .join('\\n');\n\nconst totalMinutes = Math.round((segments[segments.length - 1]?.end || 0) / 60000);\nconst speakers = [...new Set(segments.map(s => s.speaker))];\nconst wordCount = segments.map(s => s.text).join(' ').split(/\\s+/).length;\n\n// Form data\nconst agentName = $('1. Form \u2014 Support Call + Details').item.json['Agent Name'];\nconst customerName = $('1. Form \u2014 Support Call + Details').item.json['Customer Name'];\nconst customerEmail = $('1. Form \u2014 Support Call + Details').item.json['Customer Email'];\nconst issueCategory = $('1. Form \u2014 Support Call + Details').item.json['Issue Category'];\nconst callDate = $('1. Form \u2014 Support Call + Details').item.json['Call Date'];\nconst productName = $('1. Form \u2014 Support Call + Details').item.json['Product / Service Name'];\nconst recordingUrl = $('1. Form \u2014 Support Call + Details').item.json['Call Recording URL'];\n\nreturn [{\n json: {\n formattedTranscript,\n totalMinutes,\n wordCount,\n speakerCount: speakers.length,\n speakers: speakers.join(', '),\n agentName,\n customerName,\n customerEmail,\n issueCategory,\n callDate,\n productName,\n recordingUrl\n }\n}];"
},
"typeVersion": 2
},
{
"id": "e18f42e7-b50e-4f25-a97f-d06b2e2a0369",
"name": "8. AI Agent \u2014 Extract Support Summary",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1760,
-80
],
"parameters": {
"text": "={{ $json.formattedTranscript }}",
"options": {
"systemMessage": "=You are an expert customer support analyst who extracts structured support data from call transcripts.\n\nRead this customer support call transcript and extract a complete structured support summary for the Zendesk ticket.\n\n---\n\n## CALL DETAILS\n- Agent: {{ $json.agentName }}\n- Customer: {{ $json.customerName }} ({{ $json.customerEmail }})\n- Product: {{ $json.productName }}\n- Issue Category: {{ $json.issueCategory }}\n- Call Date: {{ $json.callDate }}\n- Duration: {{ $json.totalMinutes }} minutes\n- Speakers: {{ $json.speakers }}\n- Recording: {{ $json.recordingUrl }}\n\n---\n\n## EXTRACTION RULES\n1. Extract ONLY from what was actually said in the call\n2. Be specific \u2014 vague summaries are not useful for support teams\n3. Issue summary must describe the exact problem the customer reported\n4. Root cause must explain WHY the problem happened (or 'Under investigation' if unclear)\n5. Resolution must describe exactly what was done or said to resolve the issue\n6. Follow-up must be specific actions with owners if mentioned in the call\n7. Sentiment: Very Satisfied / Satisfied / Neutral / Frustrated / Very Frustrated\n8. Priority: Urgent / High / Normal / Low \u2014 based on customer tone and issue severity\n9. CSAT prediction: 1-5 based on how the call ended\n\n---\n\n## OUTPUT FORMAT\nReturn in this exact structure:\n\nTICKET_SUBJECT:\n[One line subject for the Zendesk ticket \u2014 60-80 chars \u2014 clear and specific]\n\nISSUE_SUMMARY:\n[2-3 sentences describing exactly what the customer reported]\n\nROOT_CAUSE:\n[1-2 sentences explaining why the issue occurred \u2014 or 'Under investigation']\n\nRESOLUTION_GIVEN:\n[What the agent did or said to resolve the issue \u2014 or 'Unresolved \u2014 escalation required']\n\nFOLLOW_UP_REQUIRED:\n[Specific follow-up actions needed \u2014 or 'None']\n\nKEY_QUOTES:\n- [Most important thing the customer said]\n- [Second key quote if available]\n\nSENTIMENT:\n[One of: Very Satisfied / Satisfied / Neutral / Frustrated / Very Frustrated]\n\nPRIORITY:\n[One of: Urgent / High / Normal / Low]\n\nCSAT_PREDICTION:\n[Number 1-5]\n\nTAGS:\n[5-8 lowercase tags relevant to this ticket \u2014 comma separated]"
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "f17f29ac-7d9f-4651-9fce-a5271e0001e8",
"name": "9. OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1760,
128
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "d4b3ac40-ce29-4ca2-9abd-95d75214032e",
"name": "10. Code \u2014 Parse Support Output",
"type": "n8n-nodes-base.code",
"position": [
2160,
-80
],
"parameters": {
"jsCode": "// Parse AI support analysis output\nconst output = $input.first().json.output || '';\n\nconst subjectMatch = output.match(/TICKET_SUBJECT:\\s*([\\s\\S]*?)(?=\\nISSUE_SUMMARY:|$)/);\nconst issueSummaryMatch = output.match(/ISSUE_SUMMARY:\\s*([\\s\\S]*?)(?=\\nROOT_CAUSE:|$)/);\nconst rootCauseMatch = output.match(/ROOT_CAUSE:\\s*([\\s\\S]*?)(?=\\nRESOLUTION_GIVEN:|$)/);\nconst resolutionMatch = output.match(/RESOLUTION_GIVEN:\\s*([\\s\\S]*?)(?=\\nFOLLOW_UP_REQUIRED:|$)/);\nconst followUpMatch = output.match(/FOLLOW_UP_REQUIRED:\\s*([\\s\\S]*?)(?=\\nKEY_QUOTES:|$)/);\nconst quotesMatch = output.match(/KEY_QUOTES:\\s*([\\s\\S]*?)(?=\\nSENTIMENT:|$)/);\nconst sentimentMatch = output.match(/SENTIMENT:\\s*([\\s\\S]*?)(?=\\nPRIORITY:|$)/);\nconst priorityMatch = output.match(/PRIORITY:\\s*([\\s\\S]*?)(?=\\nCSAT_PREDICTION:|$)/);\nconst csatMatch = output.match(/CSAT_PREDICTION:\\s*([\\d.]+)/);\nconst tagsMatch = output.match(/TAGS:\\s*([\\s\\S]*)$/);\n\nconst ticketSubject = subjectMatch ? subjectMatch[1].trim() : `Support Call \u2014 ${$('7. Code \u2014 Format Transcript').item.json.issueCategory}`;\nconst issueSummary = issueSummaryMatch ? issueSummaryMatch[1].trim() : '';\nconst rootCause = rootCauseMatch ? rootCauseMatch[1].trim() : '';\nconst resolution = resolutionMatch ? resolutionMatch[1].trim() : '';\nconst followUp = followUpMatch ? followUpMatch[1].trim() : 'None';\nconst keyQuotes = quotesMatch ? quotesMatch[1].trim() : '';\nconst sentiment = sentimentMatch ? sentimentMatch[1].trim() : 'Neutral';\nconst priority = priorityMatch ? priorityMatch[1].trim() : 'Normal';\nconst csatPrediction = csatMatch ? parseFloat(csatMatch[1]) : 3;\nconst tags = tagsMatch ? tagsMatch[1].trim() : '';\n\n// Map priority to Zendesk priority\nconst priorityMap = { 'urgent': 'urgent', 'high': 'high', 'normal': 'normal', 'low': 'low' };\nconst zendeskPriority = priorityMap[priority.toLowerCase()] || 'normal';\n\n// Get call data\nconst callData = $('7. Code \u2014 Format Transcript').item.json;\n\n// Build Zendesk ticket body\nconst ticketBody = [\n `SUPPORT CALL SUMMARY`,\n `Agent: ${callData.agentName} | Customer: ${callData.customerName} | Date: ${callData.callDate} | Duration: ${callData.totalMinutes} min`,\n `Recording: ${callData.recordingUrl}`,\n ``,\n `ISSUE SUMMARY`,\n issueSummary,\n ``,\n `ROOT CAUSE`,\n rootCause,\n ``,\n `RESOLUTION GIVEN`,\n resolution,\n ``,\n `FOLLOW-UP REQUIRED`,\n followUp,\n ``,\n `KEY QUOTES FROM CUSTOMER`,\n keyQuotes,\n ``,\n `CALL INTELLIGENCE`,\n `Sentiment: ${sentiment} | Priority: ${priority} | CSAT Prediction: ${csatPrediction}/5`,\n ``,\n `TAGS`,\n tags\n].join('\\n');\n\nreturn [{\n json: {\n ticketSubject,\n ticketBody,\n issueSummary,\n rootCause,\n resolution,\n followUp,\n keyQuotes,\n sentiment,\n priority,\n zendeskPriority,\n csatPrediction,\n tags,\n agentName: callData.agentName,\n customerName: callData.customerName,\n customerEmail: callData.customerEmail,\n issueCategory: callData.issueCategory,\n callDate: callData.callDate,\n productName: callData.productName,\n recordingUrl: callData.recordingUrl,\n totalMinutes: callData.totalMinutes\n }\n}];"
},
"typeVersion": 2
},
{
"id": "93c42308-b7bd-45b9-8317-622f7c44464e",
"name": "11. HTTP Request \u2014 Create Zendesk Ticket",
"type": "n8n-nodes-base.httpRequest",
"position": [
2400,
-80
],
"parameters": {
"url": "=https://YOUR_ZENDESK_SUBDOMAIN.zendesk.com/api/v2/tickets.json",
"method": "POST",
"options": {},
"jsonBody": "={\n \"ticket\": {\n \"subject\": \"{{ $json.ticketSubject }}\",\n \"comment\": {\n \"body\": \"{{ $json.ticketBody }}\"\n },\n \"requester\": {\n \"name\": \"{{ $json.customerName }}\",\n \"email\": \"{{ $json.customerEmail }}\"\n },\n \"priority\": \"{{ $json.zendeskPriority }}\",\n \"type\": \"problem\",\n \"tags\": {{ JSON.stringify($json.tags.split(',').map(t => t.trim()).filter(Boolean)) }},\n \"custom_fields\": [\n { \"id\": \"satisfaction_score\", \"value\": \"{{ $json.csatPrediction }}\" }\n ]\n }\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Basic {{ Buffer.from('YOUR_ZENDESK_EMAIL/token:YOUR_ZENDESK_API_TOKEN').toString('base64') }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "511ae35d-1ad1-4982-b5e8-318c1f956047",
"name": "12. Google Sheets \u2014 Log Support Record",
"type": "n8n-nodes-base.googleSheets",
"position": [
2640,
-80
],
"parameters": {
"columns": {
"value": {
"Tags": "={{ $('10. Code \u2014 Parse Support Output').item.json.tags }}",
"Product": "={{ $('10. Code \u2014 Parse Support Output').item.json.productName }}",
"Priority": "={{ $('10. Code \u2014 Parse Support Output').item.json.priority }}",
"Call Date": "={{ $('10. Code \u2014 Parse Support Output').item.json.callDate }}",
"Sentiment": "={{ $('10. Code \u2014 Parse Support Output').item.json.sentiment }}",
"Agent Name": "={{ $('10. Code \u2014 Parse Support Output').item.json.agentName }}",
"Created On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
"Root Cause": "={{ $('10. Code \u2014 Parse Support Output').item.json.rootCause }}",
"Customer Name": "={{ $('10. Code \u2014 Parse Support Output').item.json.customerName }}",
"Issue Summary": "={{ $('10. Code \u2014 Parse Support Output').item.json.issueSummary }}",
"Recording URL": "={{ $('10. Code \u2014 Parse Support Output').item.json.recordingUrl }}",
"Customer Email": "={{ $('10. Code \u2014 Parse Support Output').item.json.customerEmail }}",
"Issue Category": "={{ $('10. Code \u2014 Parse Support Output').item.json.issueCategory }}",
"CSAT Prediction": "={{ $('10. Code \u2014 Parse Support Output').item.json.csatPrediction }}",
"Resolution Given": "={{ $('10. Code \u2014 Parse Support Output').item.json.resolution }}",
"Zendesk Ticket ID": "={{ $json.ticket.id }}",
"Follow-up Required": "={{ $('10. Code \u2014 Parse Support Output').item.json.followUp }}",
"Zendesk Ticket URL": "=https://YOUR_ZENDESK_SUBDOMAIN.zendesk.com/agent/tickets/{{ $json.ticket.id }}",
"Call Duration (min)": "={{ $('10. Code \u2014 Parse Support Output').item.json.totalMinutes }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Support Call Log"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
}
],
"connections": {
"3. Wait \u2014 90 Seconds": {
"main": [
[
{
"node": "4. WayinVideo \u2014 Get Transcript Results",
"type": "main",
"index": 0
}
]
]
},
"6. Wait \u2014 30 Seconds Retry": {
"main": [
[
{
"node": "4. WayinVideo \u2014 Get Transcript Results",
"type": "main",
"index": 0
}
]
]
},
"7. Code \u2014 Format Transcript": {
"main": [
[
{
"node": "8. AI Agent \u2014 Extract Support Summary",
"type": "main",
"index": 0
}
]
]
},
"9. OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "8. AI Agent \u2014 Extract Support Summary",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"10. Code \u2014 Parse Support Output": {
"main": [
[
{
"node": "11. HTTP Request \u2014 Create Zendesk Ticket",
"type": "main",
"index": 0
}
]
]
},
"5. IF \u2014 Transcription Complete?": {
"main": [
[
{
"node": "7. Code \u2014 Format Transcript",
"type": "main",
"index": 0
}
],
[
{
"node": "6. Wait \u2014 30 Seconds Retry",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Support Call + Details": {
"main": [
[
{
"node": "2. WayinVideo \u2014 Submit Transcription",
"type": "main",
"index": 0
}
]
]
},
"2. WayinVideo \u2014 Submit Transcription": {
"main": [
[
{
"node": "3. Wait \u2014 90 Seconds",
"type": "main",
"index": 0
}
]
]
},
"8. AI Agent \u2014 Extract Support Summary": {
"main": [
[
{
"node": "10. Code \u2014 Parse Support Output",
"type": "main",
"index": 0
}
]
]
},
"4. WayinVideo \u2014 Get Transcript Results": {
"main": [
[
{
"node": "5. IF \u2014 Transcription Complete?",
"type": "main",
"index": 0
}
]
]
},
"11. HTTP Request \u2014 Create Zendesk Ticket": {
"main": [
[
{
"node": "12. Google Sheets \u2014 Log Support Record",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Submit any customer support call recording URL along with the agent name, customer details, issue category, call date, and product name and the workflow transcribes and analyzes the full call automatically. WayinVideo's Transcription API returns a speaker-labeled timestamped…
Source: https://n8n.io/workflows/15664/ — 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.
🧠 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.
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical
This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL