This workflow corresponds to n8n.io template #14799 — we link there as the canonical source.
This workflow follows the Agent → Airtable 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": "22022dfd-8c25-441a-8a35-83a676d6b94e",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-976,
672
],
"parameters": {
"color": 4,
"width": 540,
"height": 1012,
"content": "## Sales Call AI Analyzer \u2014 Whisper + GPT-4o\n\nFor sales managers and revenue teams who want automatic AI analysis of every sales call without manual review. A sales rep submits a call recording link via a web form. The workflow downloads the audio, transcribes it using OpenAI Whisper, and sends the full transcript to a GPT-4o agent for deep analysis. Results include sentiment, objections, buying signals, deal risk, next steps, a coaching tip, and a ready-to-send follow-up email. Everything is saved to Airtable, posted to Slack, and shown to the rep as a rich results page.\n\n## How it works\n- **1. Form \u2014 Sales Rep Submits Call** collects rep details, prospect info, deal stage, and audio link\n- **2. Code \u2014 Clean and Validate Form Data** normalizes inputs and creates a unique submission ID\n- **3. HTTP \u2014 Download Audio File** downloads the audio from the provided URL\n- **4. OpenAI \u2014 Transcribe with Whisper** sends the audio to Whisper and returns a full transcript\n- **5. Code \u2014 Merge Transcript with Call Data** combines the transcript with all call metadata\n- **6. AI Agent \u2014 GPT-4o Sales Analysis** analyses the transcript and returns structured JSON\n- **8. Code \u2014 Parse and Combine AI Analysis** cleans and merges the GPT-4o response\n- **9. Airtable \u2014 Save Full Analysis** saves the complete record to your Airtable base\n- **10. Slack \u2014 Post Analysis to Channel** posts a summary alert to your sales Slack channel\n- **11. Code \u2014 Build HTML Confirmation Page** builds the rep-facing results page\n- **12. Webhook \u2014 Show Results Page to Rep** returns the HTML page directly to the rep\n\n## Set up steps\n1. In **4. OpenAI \u2014 Transcribe with Whisper** \u2014 replace YOUR_TOKEN_HERE with your OpenAI API key using an n8n Header Auth credential\n2. In **7. OpenAI \u2014 Chat Model (GPT-4o)** \u2014 connect your OpenAI credential\n3. In **9. Airtable \u2014 Save Full Analysis** \u2014 connect your Airtable credential and select your base and table\n4. In **10. Slack \u2014 Post Analysis to Channel** \u2014 connect your Slack webhook credential\n5. Activate the workflow and share the form URL with your sales team"
},
"typeVersion": 1
},
{
"id": "39c73128-1125-404b-93e5-ada5677ebbc7",
"name": "Section \u2014 Form Intake",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
848
],
"parameters": {
"color": 5,
"width": 420,
"height": 484,
"content": "## Form Intake\nSales rep submits call details and a direct audio link. Data is cleaned, validated, and assigned a unique submission ID."
},
"typeVersion": 1
},
{
"id": "c944e335-b275-4321-a4e9-7cfcf9ccf44b",
"name": "Section \u2014 Audio Transcription",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
848
],
"parameters": {
"color": 6,
"width": 628,
"height": 484,
"content": "## Audio Transcription\nAudio file is downloaded from the submitted URL and sent to OpenAI Whisper. The full transcript is merged back with all call metadata."
},
"typeVersion": 1
},
{
"id": "cf90bad6-4949-4c51-9d38-4ab5a54ff2e9",
"name": "Section \u2014 AI Analysis",
"type": "n8n-nodes-base.stickyNote",
"position": [
768,
784
],
"parameters": {
"color": 6,
"width": 276,
"height": 564,
"content": "## AI Analysis\nGPT-4o analyses the transcript and returns structured JSON covering sentiment, objections, buying signals, deal risk, next steps, coaching tip, follow-up email, and a CRM note."
},
"typeVersion": 1
},
{
"id": "65385a83-0da6-481e-b668-7394b743035f",
"name": "Section \u2014 Output and Delivery",
"type": "n8n-nodes-base.stickyNote",
"position": [
1072,
784
],
"parameters": {
"color": 4,
"width": 916,
"height": 564,
"content": "## Output and Delivery\nAnalysis is fanned out to Airtable for long-term records, Slack for team alerts, and an HTML results page shown directly to the rep in the browser."
},
"typeVersion": 1
},
{
"id": "99370c45-fbaa-4234-aab3-726eabdf721e",
"name": "Note \u2014 Exposed API Key",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
1376
],
"parameters": {
"color": 3,
"width": 796,
"content": "## \u26a0\ufe0f API Key Exposed in Plain Text\nThe OpenAI API key is hard-coded as a raw string in this node. Anyone with access to the workflow can read it. Replace YOUR_TOKEN_HERE by creating an n8n Header Auth credential and selecting it via the node credential picker. Never paste API keys directly into request headers."
},
"typeVersion": 1
},
{
"id": "a2c0ce6d-4b56-4905-ae8c-be48a3504d58",
"name": "1. Form \u2014 Sales Rep Submits Call",
"type": "n8n-nodes-base.formTrigger",
"position": [
-368,
1024
],
"parameters": {
"options": {},
"formTitle": "Sales Call Submission",
"formFields": {
"values": [
{
"fieldLabel": "Your Name",
"placeholder": "e.g. Jane Smith",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Your Email",
"placeholder": "e.g. user@example.com",
"requiredField": true
},
{
"fieldLabel": "Prospect Company Name",
"placeholder": "e.g. Acme Corp",
"requiredField": true
},
{
"fieldLabel": "Prospect Contact Name",
"placeholder": "e.g. Bob Johnson",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Prospect Email",
"placeholder": "e.g. user@example.com",
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "Current Deal Stage",
"fieldOptions": {
"values": [
{
"option": "Prospecting"
},
{
"option": "Discovery"
},
{
"option": "Demo"
},
{
"option": "Proposal"
},
{
"option": "Negotiation"
},
{
"option": "Closed Won"
},
{
"option": "Closed Lost"
}
]
},
"requiredField": true
},
{
"fieldType": "number",
"fieldLabel": "Estimated Deal Value (USD)",
"placeholder": "e.g. 15000"
},
{
"fieldType": "url",
"fieldLabel": "Call Recording Direct Link",
"placeholder": "Paste a direct download link to the audio file (mp3, wav, m4a)",
"requiredField": true
},
{
"fieldType": "number",
"fieldLabel": "Call Duration (minutes)",
"placeholder": "e.g. 32"
},
{
"fieldType": "textarea",
"fieldLabel": "Any notes before analysis?",
"placeholder": "Optional \u2014 e.g. prospect mentioned budget cuts, competitor Salesforce"
}
]
},
"responseMode": "lastNode",
"formDescription": "Submit your sales call recording for automatic AI analysis. You will receive a Slack summary with insights, objections, and next steps."
},
"typeVersion": 2.2
},
{
"id": "3d7f33b3-3207-4c1e-a5c6-4afe678bf5e9",
"name": "2. Code \u2014 Clean and Validate Form Data",
"type": "n8n-nodes-base.code",
"position": [
-128,
1024
],
"parameters": {
"jsCode": "// Pull and clean the form submission\nconst form = $input.first().json;\n\n// Build a clean, normalized call record from the form fields\nconst repName = (form['Your Name'] || '').trim();\nconst repEmail = (form['Your Email'] || '').trim().toLowerCase();\nconst company = (form['Prospect Company Name'] || '').trim();\nconst contactName = (form['Prospect Contact Name'] || '').trim();\nconst contactEmail = (form['Prospect Email'] || '').trim().toLowerCase();\nconst dealStage = (form['Current Deal Stage'] || 'Unknown').trim();\nconst dealValue = parseFloat(form['Estimated Deal Value (USD)']) || null;\nconst audioUrl = (form['Call Recording Direct Link'] || '').trim();\nconst durationMins = parseInt(form['Call Duration (minutes)']) || 0;\nconst repNotes = (form['Any notes before analysis?'] || '').trim();\n\n// Basic checks\nif (!repName || !repEmail) throw new Error('Rep name and email are required.');\nif (!company || !contactName) throw new Error('Prospect company and contact name are required.');\nif (!audioUrl) throw new Error('Audio recording link is required.');\n\nconst submissionId = 'CALL-' + Date.now();\n\nreturn [{\n json: {\n submissionId,\n repName,\n repEmail,\n company,\n contactName,\n contactEmail,\n dealStage,\n dealValue,\n audioUrl,\n durationMins,\n repNotes,\n submittedAt: new Date().toISOString()\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "90cfeb2e-d1f6-42d1-b257-e8999a72d420",
"name": "3. HTTP \u2014 Download Audio File",
"type": "n8n-nodes-base.httpRequest",
"position": [
128,
1024
],
"parameters": {
"url": "={{ $json.audioUrl }}",
"options": {
"timeout": 60000,
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2,
"continueOnFail": true
},
{
"id": "8c7a1462-1754-4e5a-99e7-bcc7e01d701c",
"name": "4. OpenAI \u2014 Transcribe with Whisper",
"type": "n8n-nodes-base.httpRequest",
"position": [
368,
1024
],
"parameters": {
"url": "https://api.openai.com/v1/audio/transcriptions",
"method": "POST",
"options": {
"timeout": 180000
},
"sendBody": true,
"contentType": "multipart-form-data",
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "whisper-1"
},
{
"name": "response_format",
"value": "verbose_json"
},
{
"name": "language",
"value": "en"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"typeVersion": 4.2,
"continueOnFail": true
},
{
"id": "9abd2143-9084-4588-a847-3a852b06265f",
"name": "5. Code \u2014 Merge Transcript with Call Data",
"type": "n8n-nodes-base.code",
"position": [
608,
1024
],
"parameters": {
"jsCode": "// Merge Whisper output with the original form data\nconst whisper = $input.first().json;\nconst formData = $('2. Code \u2014 Clean and Validate Form Data').first().json;\n\nif (!whisper || whisper.error) {\n throw new Error('Whisper transcription failed: ' + (whisper?.error?.message || 'Unknown error'));\n}\n\nconst transcript = (whisper.text || '').trim();\nif (!transcript) throw new Error('Transcription came back empty \u2014 audio may be silent or corrupted.');\n\nconst wordCount = transcript.split(/\\s+/).filter(w => w).length;\n\nreturn [{\n json: {\n ...formData,\n transcript,\n wordCount,\n transcribedAt: new Date().toISOString()\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "ab26a9d2-da3f-4b93-b39b-f8de606f740f",
"name": "6. AI Agent \u2014 GPT-4o Sales Analysis",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
816,
1024
],
"parameters": {
"text": "=You are an expert sales call analyst. You will receive a sales call transcript along with call metadata. Your job is to analyze the transcript deeply and return a single valid JSON object \u2014 nothing else. No explanation, no markdown, no code fences. Only raw JSON.\n\n---\n\nINPUT YOU WILL RECEIVE:\n- repName: Name of the sales rep\n- company: Prospect company name\n- contactName: Prospect contact person\n- dealStage: Current deal stage (e.g. Discovery, Demo, Proposal)\n- dealValue: Estimated deal value in USD\n- durationMins: Call duration in minutes\n- repNotes: Any notes added by the rep before analysis\n- transcript: Full text transcript of the sales call\n\n---\n\nYOUR JOB:\nCarefully read the transcript and return this exact JSON structure:\n\n{\n \"summary\": \"A clear 3\u20135 sentence summary of what happened on this call. What was discussed, what the prospect said, and how the call ended.\",\n\n \"overall_sentiment\": \"Positive | Neutral | Negative\",\n\n \"sentiment_score\": A number from 0 to 100. 0 = very negative, 100 = very positive.,\n\n \"primary_intent\": \"One short phrase describing what the prospect mainly wants. Example: 'Evaluating alternatives to current tool' or 'Ready to buy pending legal approval'\",\n\n \"deal_risk\": \"Low | Medium | High\",\n\n \"deal_momentum\": \"Accelerating | Steady | Stalling | Declining\",\n\n \"recommended_stage\": \"The deal stage you recommend AFTER this call. Choose from: Prospecting, Discovery, Demo, Proposal, Negotiation, Closed Won, Closed Lost\",\n\n \"rep_talk_ratio\": \"Estimate of how much the rep talked vs the prospect. Example: '65% rep / 35% prospect'\",\n\n \"objections\": [\n {\n \"type\": \"Price | Timeline | Competition | Authority | Need | Other\",\n \"quote\": \"A short direct quote from the transcript showing this objection\",\n \"was_addressed\": true or false\n }\n ],\n\n \"buying_signals\": [\n \"List each buying signal as a short sentence. Example: 'Prospect asked about onboarding timeline' or 'Prospect mentioned they have budget approved'\"\n ],\n\n \"competitors_mentioned\": [\n \"List any competitor names mentioned on the call. Empty array if none.\"\n ],\n\n \"next_steps\": [\n {\n \"action\": \"What needs to happen next\",\n \"owner\": \"rep | prospect | both\",\n \"commitment\": \"Was this committed to on the call? yes or no\",\n \"deadline\": \"Deadline if mentioned, otherwise null\"\n }\n ],\n\n \"coaching_tip\": \"One specific, actionable coaching tip for the rep based on this call. Be direct and helpful. Example: 'You spoke for 70% of the call \u2014 on the next call, ask more open-ended questions and let the prospect lead.'\",\n\n \"crm_note\": \"A 2\u20133 sentence CRM note ready to paste into a CRM. Professional tone. Include deal stage, key outcomes, and next steps.\",\n\n \"follow_up_email\": \"A ready-to-send follow-up email from the rep to the prospect. Include subject line at the top like 'Subject: ...'. Keep it professional, warm, and under 150 words. Reference something specific from the call.\"\n}\n\n---\n\nSTRICT RULES:\n1. Output ONLY the JSON object above. No text before or after it.\n2. Do not wrap in markdown code blocks or backticks.\n3. If something is not mentioned in the transcript, use an empty array [] or null \u2014 do not guess or hallucinate.\n4. Quotes in the \"objections\" field must come directly from the transcript.\n5. The follow_up_email must feel personal \u2014 reference something the prospect actually said.\n6. Keep all text in English unless the transcript is in another language.",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "5b4f0b02-287d-4e94-8836-16687e8de92c",
"name": "7. OpenAI \u2014 Chat Model (GPT-4o)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
816,
1200
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "63ef9dab-2758-4a97-9468-1de515c96603",
"name": "8. Code \u2014 Parse and Combine AI Analysis",
"type": "n8n-nodes-base.code",
"position": [
1120,
1024
],
"parameters": {
"jsCode": "// Parse GPT-4o JSON response and merge everything\nconst gptResponse = $input.first().json;\nconst callData = $('5. Code \u2014 Merge Transcript with Call Data').first().json;\n\nconst rawText = gptResponse?.choices?.[0]?.message?.content || gptResponse?.output || '';\nif (!rawText) throw new Error('GPT-4o returned an empty response.');\n\nconst clean = rawText.replace(/```json\\s*/gi, '').replace(/```/gi, '').trim();\n\nlet analysis;\ntry {\n analysis = JSON.parse(clean);\n} catch (e) {\n throw new Error('Could not parse GPT-4o output as JSON. Raw: ' + clean.substring(0, 300));\n}\n\nreturn [{\n json: {\n submissionId: callData.submissionId,\n repName: callData.repName,\n repEmail: callData.repEmail,\n company: callData.company,\n contactName: callData.contactName,\n contactEmail: callData.contactEmail,\n dealStage: callData.dealStage,\n dealValue: callData.dealValue,\n durationMins: callData.durationMins,\n wordCount: callData.wordCount,\n submittedAt: callData.submittedAt,\n analysis,\n processedAt: new Date().toISOString()\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "b9344df7-c761-4e7c-a3b9-84fb3d945d4e",
"name": "9. Airtable \u2014 Save Full Analysis",
"type": "n8n-nodes-base.airtable",
"position": [
1328,
896
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_BASE_ID"
},
"table": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_TABLE_ID"
},
"columns": {
"value": {
"Company": "={{ $json.company }}",
"Summary": "={{ $json.analysis.summary }}",
"CRM Note": "={{ $json.analysis.crm_note }}",
"Rep Name": "={{ $json.repName }}",
"Deal Risk": "={{ $json.analysis.deal_risk }}",
"Rep Email": "={{ $json.repEmail }}",
"Sentiment": "={{ $json.analysis.overall_sentiment }}",
"Deal Value": "={{ $json.dealValue }}",
"Word Count": "={{ $json.wordCount }}",
"Coaching Tip": "={{ $json.analysis.coaching_tip }}",
"Contact Name": "={{ $json.contactName }}",
"Processed At": "={{ $json.processedAt }}",
"Submitted At": "={{ $json.submittedAt }}",
"Contact Email": "={{ $json.contactEmail }}",
"Deal Momentum": "={{ $json.analysis.deal_momentum }}",
"Submission ID": "={{ $json.submissionId }}",
"Primary Intent": "={{ $json.analysis.primary_intent }}",
"Rep Talk Ratio": "={{ $json.analysis.rep_talk_ratio }}",
"Objection Count": "={{ ($json.analysis.objections || []).length }}",
"Sentiment Score": "={{ $json.analysis.sentiment_score }}",
"Buying Signal Count": "={{ ($json.analysis.buying_signals || []).length }}",
"Call Duration (min)": "={{ $json.durationMins }}",
"Deal Stage (Before)": "={{ $json.dealStage }}",
"Competitors Mentioned": "={{ ($json.analysis.competitors_mentioned || []).join(', ') }}",
"Follow-up Email Draft": "={{ $json.analysis.follow_up_email }}",
"Deal Stage (AI Recommended)": "={{ $json.analysis.recommended_stage }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "create"
},
"typeVersion": 2.1,
"continueOnFail": true
},
{
"id": "2d6f3d79-9851-4ad1-bab9-8cc6b9481e97",
"name": "10. Slack \u2014 Post Analysis to Channel",
"type": "n8n-nodes-base.slack",
"position": [
1328,
1136
],
"parameters": {
"otherOptions": {},
"authentication": "webhook"
},
"typeVersion": 2.3,
"continueOnFail": true
},
{
"id": "4aef1caa-9d0f-4911-bc9a-5facabed6e69",
"name": "11. Code \u2014 Build HTML Confirmation Page",
"type": "n8n-nodes-base.code",
"position": [
1568,
1024
],
"parameters": {
"jsCode": "// Build a clean confirmation page shown to the rep after form submit\nconst d = $input.first().json;\nconst a = d.analysis || {};\n\nconst nextStepsHtml = (a.next_steps || []).map((s, i) =>\n `<li><strong>${s.action}</strong> \u2014 <em>${s.owner}</em> (${s.commitment}${s.deadline ? ', by ' + s.deadline : ''})</li>`\n).join('') || '<li>None identified</li>';\n\nconst objHtml = (a.objections || []).map(o =>\n `<li><strong>${o.type.toUpperCase()}</strong>: \"${o.quote}\" \u2014 Addressed: ${o.was_addressed ? '\u2705' : '\u274c'}</li>`\n).join('') || '<li>None detected</li>';\n\nconst html = `\n<div style=\"font-family:sans-serif;max-width:680px;margin:40px auto;padding:24px;border:1px solid #e0e0e0;border-radius:12px\">\n <h2 style=\"color:#1a73e8\">\u2705 Call Analysis Complete</h2>\n <p><strong>Submission ID:</strong> ${d.submissionId}</p>\n <p><strong>Company:</strong> ${d.company} | <strong>Contact:</strong> ${d.contactName}</p>\n <p><strong>Deal Stage:</strong> ${d.dealStage} \u2192 <strong>${a.recommended_stage || 'No change'}</strong></p>\n\n <hr/>\n <h3>Summary</h3>\n <p>${a.summary || 'No summary generated.'}</p>\n\n <h3>Sentiment: ${a.overall_sentiment} (${a.sentiment_score}/100)</h3>\n <p>Intent: ${a.primary_intent} | Deal Risk: <strong>${a.deal_risk}</strong> | Momentum: ${a.deal_momentum}</p>\n\n <h3>Objections</h3>\n <ul>${objHtml}</ul>\n\n <h3>Next Steps</h3>\n <ul>${nextStepsHtml}</ul>\n\n <h3>Coaching Tip</h3>\n <p>${a.coaching_tip || 'N/A'}</p>\n\n <h3>Suggested Follow-up Email</h3>\n <pre style=\"background:#f5f5f5;padding:16px;border-radius:8px;white-space:pre-wrap\">${a.follow_up_email || ''}</pre>\n\n <p style=\"color:#888;font-size:12px\">Full analysis saved to Airtable. Slack notification sent to your sales team.</p>\n</div>`;\n\nreturn [{ json: { html, submissionId: d.submissionId } }];\n"
},
"typeVersion": 2
},
{
"id": "3e77b278-cd51-4415-83d5-1dd00a503964",
"name": "12. Webhook \u2014 Show Results Page to Rep",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1808,
1024
],
"parameters": {
"options": {},
"respondWith": "html"
},
"typeVersion": 1.1
}
],
"connections": {
"3. HTTP \u2014 Download Audio File": {
"main": [
[
{
"node": "4. OpenAI \u2014 Transcribe with Whisper",
"type": "main",
"index": 0
}
]
]
},
"7. OpenAI \u2014 Chat Model (GPT-4o)": {
"ai_languageModel": [
[
{
"node": "6. AI Agent \u2014 GPT-4o Sales Analysis",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"1. Form \u2014 Sales Rep Submits Call": {
"main": [
[
{
"node": "2. Code \u2014 Clean and Validate Form Data",
"type": "main",
"index": 0
}
]
]
},
"4. OpenAI \u2014 Transcribe with Whisper": {
"main": [
[
{
"node": "5. Code \u2014 Merge Transcript with Call Data",
"type": "main",
"index": 0
}
]
]
},
"6. AI Agent \u2014 GPT-4o Sales Analysis": {
"main": [
[
{
"node": "8. Code \u2014 Parse and Combine AI Analysis",
"type": "main",
"index": 0
}
]
]
},
"2. Code \u2014 Clean and Validate Form Data": {
"main": [
[
{
"node": "3. HTTP \u2014 Download Audio File",
"type": "main",
"index": 0
}
]
]
},
"11. Code \u2014 Build HTML Confirmation Page": {
"main": [
[
{
"node": "12. Webhook \u2014 Show Results Page to Rep",
"type": "main",
"index": 0
}
]
]
},
"8. Code \u2014 Parse and Combine AI Analysis": {
"main": [
[
{
"node": "9. Airtable \u2014 Save Full Analysis",
"type": "main",
"index": 0
},
{
"node": "10. Slack \u2014 Post Analysis to Channel",
"type": "main",
"index": 0
},
{
"node": "11. Code \u2014 Build HTML Confirmation Page",
"type": "main",
"index": 0
}
]
]
},
"5. Code \u2014 Merge Transcript with Call Data": {
"main": [
[
{
"node": "6. AI Agent \u2014 GPT-4o Sales Analysis",
"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 a call recording and get a full AI-powered analysis delivered automatically. Your recording is transcribed with OpenAI Whisper, then GPT-4o breaks down sentiment, objections, buying signals, deal risk, next steps, and a ready-to-send follow-up email. Results are saved to…
Source: https://n8n.io/workflows/14799/ — 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.
This workflow generates comprehensive B2B leads, from a selected Business type in ANY CITY IN THE WORLD, including: Company name; Website; Email (enriched with AI Agent); Phone number; Address; Main L
Before adding a new npm package as a dependency, you should know if it's actively maintained, widely used, and safe to build on. This workflow does that analysis automatically.
This workflow analyzes any npm package and delivers a data-driven recommendation using Firecrawl + APIs + AI reasoning.
This workflow automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. De
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.