This workflow corresponds to n8n.io template #8592 — we link there as the canonical source.
This workflow follows the Agent → Google Gemini Chat 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 →
{
"name": "Meeting Transcript \u2192 Tasks (Universal Template)",
"nodes": [
{
"id": "webhook-trigger",
"name": "Firefly Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-48,
0
],
"parameters": {
"path": "meeting-transcript-webhook",
"options": {},
"httpMethod": "POST"
}
},
{
"id": "get-transcript",
"name": "Get a transcript",
"type": "@firefliesai/n8n-nodes-fireflies.fireflies",
"typeVersion": 1,
"position": [
160,
0
],
"parameters": {
"transcriptId": "={{ $json.body.meetingId }}"
}
},
{
"id": "split-out",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
384,
0
],
"parameters": {
"options": {},
"fieldToSplitOut": "data.sentences"
}
},
{
"id": "aggregate",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
576,
0
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "raw_text"
}
]
}
}
},
{
"id": "ai-model",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
848,
176
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-exp"
}
},
{
"id": "ai-agent",
"name": "Summary Generator",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2.2,
"position": [
832,
0
],
"parameters": {
"text": "=Please generate a summary of this meeting transcript in 5-6 lines maximum. The summary should be sent to team in simple and easy words with a medium length text.\n\nAlso create a list of action items from the meeting. For each action item provide:\n- name: under 100 character title\n- description: detailed description of the task\n\nHere is the meeting Transcript:\n\n{{ $json.raw_text }}\n\nReturn your answer as JSON with keys: summary, action_items",
"options": {},
"promptType": "define"
}
},
{
"id": "clean-json",
"name": "Cleans AI response",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1248,
0
],
"parameters": {
"jsCode": "// Parse AI response and clean JSON\ntry {\n const output = $input.first().json.output;\n const cleaned = output.replace(/```json|```/g, '').trim();\n return [{ json: JSON.parse(cleaned) }];\n} catch (e) {\n return [{\n json: {\n summary: \"Failed to parse AI response\",\n action_items: [],\n error: e.message\n }\n }];\n}"
}
},
{
"id": "extract-tasks",
"name": "Extracts action items",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1440,
-112
],
"parameters": {
"jsCode": "const items = $input.first().json.action_items || [];\n\nif (!Array.isArray(items) || items.length === 0) {\n return [];\n}\n\n// Convert each {name, description} into {title, description}\nreturn items.map(ai => ({\n json: {\n title: ai.name || \"Untitled\",\n description: ai.description || \"\"\n }\n}));"
}
},
{
"id": "slack-notify",
"name": "Send a message",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.3,
"position": [
1680,
64
],
"parameters": {
"text": "={{ $json.summary }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "YOUR_CHANNEL_ID"
},
"otherOptions": {},
"authentication": "oAuth2"
}
},
{
"id": "clickup-task",
"name": "Create a task",
"type": "n8n-nodes-base.clickUp",
"typeVersion": 1,
"position": [
1680,
-112
],
"parameters": {
"list": "YOUR_LIST_ID",
"name": "={{ $json.title }}",
"team": "YOUR_TEAM_ID",
"space": "YOUR_SPACE_ID",
"folderless": true,
"authentication": "oAuth2",
"additionalFields": {
"content": "={{ $json.description }}"
}
}
},
{
"id": "note-guide",
"name": "\ud83d\udcda GUIDE: \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-600,
-300
],
"parameters": {
"width": 460,
"height": 780,
"color": 7,
"content": "# \ud83d\udcda Meeting Transcript \u2192 Tasks\n## \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\n\n---\n\n### \ud83c\udfaf \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 workflow:\n1. **\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442** \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u044e \u0432\u0441\u0442\u0440\u0435\u0447\u0438\n2. **\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442** \u0442\u0435\u043a\u0441\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\n3. **AI \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442** \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442:\n - Summary (\u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435)\n - Action Items (\u0437\u0430\u0434\u0430\u0447\u0438)\n4. **\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442** summary \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\n5. **\u0421\u043e\u0437\u0434\u0430\u0451\u0442** \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 task-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435\n\n---\n\n### \ud83d\udd27 \u041a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c:\n\n**1. Credentials**\n- Fireflies API key\n- Google Gemini API key \n- Slack OAuth\n- ClickUp OAuth\n\n**2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439 ClickUp node:**\n- Team ID\n- Space ID \n- List ID\n\n**3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439 Slack node:**\n- Channel ID\n\n**4. Fireflies Webhook:**\n- \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439 Production URL\n- \u0412\u0441\u0442\u0430\u0432\u044c \u0432 Fireflies Settings \u2192 Integrations\n\n---\n\n### \ud83d\udcd6 \u0421\u043c. \u0446\u0432\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438:\n- \ud83d\udfe1 **\u0416\u0451\u043b\u0442\u044b\u0439** = Transcription adapters\n- \ud83d\udfe2 **\u0417\u0435\u043b\u0451\u043d\u044b\u0439** = AI model options\n- \ud83d\udd35 **\u0421\u0438\u043d\u0438\u0439** = Task systems\n- \ud83d\udfe0 **\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439** = Notifications\n\n---\n\n### \u26a1 Production Tips:\n```\n\u2705 \u0414\u043e\u0431\u0430\u0432\u044c Error Workflow\n\u2705 \u041b\u043e\u0433\u0438\u0440\u0443\u0439 \u0432 Google Sheets\n\u2705 \u0414\u043e\u0431\u0430\u0432\u044c retry \u0434\u043b\u044f API calls\n\u2705 \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439 \u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445\n```"
}
},
{
"id": "note-trigger",
"name": "\ud83d\udd04 ADAPT: Transcription Source",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-112,
280
],
"parameters": {
"width": 520,
"height": 580,
"color": 4,
"content": "## \ud83d\udd04 \u0417\u0430\u043c\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0442\u043e\u0440\u0430\n\n### \u0422\u0435\u043a\u0443\u0449\u0438\u0439: Fireflies.ai\nWebhook \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 `meetingId` \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0446\u0438\u0438\n\n---\n\n### \ud83c\udfaf Fathom (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439)\n```\nWebhook URL: \u0442\u043e\u0442 \u0436\u0435\nBody: { \"transcript_merged\": [...] }\n\u0417\u0430\u043c\u0435\u043d\u0438 'Get a transcript' \u043d\u0430 Set node\n\u041f\u043e\u043b\u0435: $json.body.transcript_merged\n```\n\n### \ud83c\udfaf Otter.ai\n```\nWebhook: POST \u0441 transcript_id\nHTTP Request: GET https://otter.ai/api/v1/speeches/{id}\nAuth: Bearer Token\n```\n\n### \ud83c\udfaf Zoom Cloud Recording\n```\nTrigger: Zoom node \u2192 Recording Completed\nHTTP Request \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f VTT\n\u041f\u0430\u0440\u0441\u0438\u043d\u0433 VTT \u2192 \u0442\u0435\u043a\u0441\u0442\n\u26a0\ufe0f \u0422\u0440\u0435\u0431\u0443\u0435\u0442 Zoom Pro\n```\n\n### \ud83c\udfaf Google Meet (\u0447\u0435\u0440\u0435\u0437 Calendar)\n```\nGoogle Calendar Trigger \u2192 Meeting End\nGoogle Drive \u2192 \u0441\u043a\u0430\u0447\u0430\u0442\u044c transcript\n\u0422\u0440\u0435\u0431\u0443\u0435\u0442 Google Workspace\n```\n\n### \ud83c\udfaf MeetGeek\n```\nWebhook: meeting.transcription.finished\nHTTP Request: GET /meetings/{id}/transcript\n```\n\n### \ud83c\udfaf Manual Upload\n```\n\u0417\u0430\u043c\u0435\u043d\u0438 Webhook \u043d\u0430 Form Trigger\n\u041f\u043e\u043b\u0435: textarea \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430\n\u0418\u043b\u0438 File Upload \u0434\u043b\u044f .txt/.vtt\n```"
}
},
{
"id": "note-ai",
"name": "\ud83e\udd16 ADAPT: AI Model",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
768,
400
],
"parameters": {
"width": 460,
"height": 520,
"color": 5,
"content": "## \ud83e\udd16 \u0417\u0430\u043c\u0435\u043d\u0430 AI \u043c\u043e\u0434\u0435\u043b\u0438\n\n### \u0422\u0435\u043a\u0443\u0449\u0438\u0439: Google Gemini\n\n---\n\n### \ud83c\udfaf OpenAI GPT-4\n```\n\u0417\u0430\u043c\u0435\u043d\u0438 'Google Gemini Chat Model' \u043d\u0430:\n\u2192 OpenAI Chat Model\nModel: gpt-4o \u0438\u043b\u0438 gpt-4o-mini\n\u2705 \u041b\u0443\u0447\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e extraction\n```\n\n### \ud83c\udfaf Claude (Anthropic)\n```\n\u2192 Anthropic Chat Model \nModel: claude-sonnet-4-20250514\n\u2705 \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\n```\n\n### \ud83c\udfaf Ollama (Self-hosted)\n```\n\u2192 Ollama Chat Model\nModel: llama3.2, mistral, qwen2.5\n\u2705 \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\n\u26a0\ufe0f \u041d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0432\u0435\u0440\n```\n\n### \ud83c\udfaf DeepSeek\n```\n\u2192 OpenAI Chat Model (compatible)\nBase URL: https://api.deepseek.com\nModel: deepseek-chat\n\u2705 \u0414\u0451\u0448\u0435\u0432\u043e, \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\n```\n\n### \ud83d\udca1 Prompt Tips\n```\n\u0414\u043e\u0431\u0430\u0432\u044c \u0432 \u043f\u0440\u043e\u043c\u043f\u0442:\n- \u042f\u0437\u044b\u043a \u0432\u044b\u0432\u043e\u0434\u0430 (\u0440\u0443\u0441\u0441\u043a\u0438\u0439/\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439)\n- \u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442 (DD.MM.YYYY)\n- \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u0434\u0430\u0447 (high/medium/low)\n- Assignee \u0435\u0441\u043b\u0438 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\n```"
}
},
{
"id": "note-tasks",
"name": "\ud83d\udccb ADAPT: Task System",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1632,
280
],
"parameters": {
"width": 460,
"height": 640,
"color": 6,
"content": "## \ud83d\udccb \u0417\u0430\u043c\u0435\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u0430\u0434\u0430\u0447\n\n### \u0422\u0435\u043a\u0443\u0449\u0438\u0439: ClickUp\n\n---\n\n### \ud83c\udfaf Monday.com\n```json\n\u0417\u0430\u043c\u0435\u043d\u0438 'Create a task' \u043d\u0430 HTTP Request:\nPOST https://api.monday.com/v2\nBody (GraphQL):\nmutation {\n create_item(\n board_id: YOUR_BOARD_ID,\n item_name: \"{{$json.title}}\",\n column_values: \"{\\\"text\\\":\\\"{{$json.description}}\\\"}\"\n ) { id }\n}\nAuth: Authorization: YOUR_API_KEY\n```\n\n### \ud83c\udfaf Notion\n```\n\u2192 Notion node \u2192 Create Database Item\nDatabase: \u0432\u044b\u0431\u0435\u0440\u0438 \u0431\u0430\u0437\u0443 \u0437\u0430\u0434\u0430\u0447\nTitle: {{$json.title}}\nProperties: description, status, date\n```\n\n### \ud83c\udfaf Asana\n```\n\u2192 Asana node \u2192 Create Task\nProject: \u0432\u044b\u0431\u0435\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\nName: {{$json.title}}\nNotes: {{$json.description}}\n```\n\n### \ud83c\udfaf Jira\n```\n\u2192 Jira node \u2192 Create Issue\nProject: KEY\nIssue Type: Task\nSummary: {{$json.title}}\nDescription: {{$json.description}}\n```\n\n### \ud83c\udfaf Airtable\n```\n\u2192 Airtable node \u2192 Create Record\nBase: \u0432\u044b\u0431\u0435\u0440\u0438 \u0431\u0430\u0437\u0443\nTable: Tasks\nFields: title, description, status\n```\n\n### \ud83c\udfaf Todoist\n```\n\u2192 Todoist node \u2192 Create Task\nContent: {{$json.title}}\nDescription: {{$json.description}}\nProject: Meeting Tasks\n```"
}
},
{
"id": "note-notify",
"name": "\ud83d\udce2 ADAPT: Notifications",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2120,
-288
],
"parameters": {
"width": 400,
"height": 480,
"color": 3,
"content": "## \ud83d\udce2 \u0417\u0430\u043c\u0435\u043d\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439\n\n### \u0422\u0435\u043a\u0443\u0449\u0438\u0439: Slack\n\n---\n\n### \ud83c\udfaf Microsoft Teams\n```\n\u2192 Microsoft Teams node\n\u2192 Send Message\nChannel: \u0432\u044b\u0431\u0435\u0440\u0438 \u043a\u0430\u043d\u0430\u043b\nMessage: {{$json.summary}}\n```\n\n### \ud83c\udfaf Discord\n```\n\u2192 Discord node \u2192 Send Message\nWebhook URL: \u0442\u0432\u043e\u0439 webhook\nContent: {{$json.summary}}\n```\n\n### \ud83c\udfaf Telegram\n```\n\u2192 Telegram node \u2192 Send Message\nChat ID: group/channel ID\nText: {{$json.summary}}\n```\n\n### \ud83c\udfaf Email (Gmail/SMTP)\n```\n\u2192 Gmail node \u2192 Send Email\nTo: team@company.com\nSubject: Meeting Summary\nBody: {{$json.summary}}\n```\n\n### \ud83c\udfaf Webhook (Custom)\n```\n\u2192 HTTP Request node\nPOST to your endpoint\nBody: { summary, action_items }\n```\n\n### \ud83d\udca1 \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c!\nSlack + Email\nTeams + Notion\nDiscord + Jira"
}
},
{
"id": "note-webhook",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-112,
-208
],
"parameters": {
"width": 416,
"height": 448,
"content": "## Webhook + Transcript Retrieval\n\n**Webhook:** Trigger when Fireflies finishes a meeting transcription. Receives meetingId.\n\n**Get a transcript:** Fetches the full transcript from Fireflies using the provided meetingId."
}
},
{
"id": "note-processing",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
336,
-208
],
"parameters": {
"width": 400,
"height": 448,
"content": "## Transcript Processing\n\n**Split Out:** Splits transcript into individual sentences (data.sentences).\n\n**Aggregate:** Rejoins sentences into one block of raw text for summarization."
}
},
{
"id": "note-ai-processing",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
768,
-304
],
"parameters": {
"width": 400,
"height": 656,
"content": "## AI Processing\n\n**Summary Generator:** Sends transcript text to the LLM with instructions to generate:\n\n\u25c9 A summary (5\u20136 lines, simple wording).\n\n\u25c9 A list of action items (each with a short title and description).\n\n**Google Gemini Chat Model:** Connected as the LLM provider to power the AI Agent."
}
},
{
"id": "note-postprocess",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1200,
-304
],
"parameters": {
"width": 400,
"height": 544,
"content": "## Post-processing AI Output\n\n**Cleans AI response:** Parses JSON, removes code fences.\n\n**Extracts action items:** Extracts each action item, ensuring format {title, description} for tasks."
}
},
{
"id": "note-outputs",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1632,
-288
],
"parameters": {
"width": 352,
"height": 528,
"content": "## Outputs\n\n**Slack (Send a message):** Posts the meeting summary directly to the team channel.\n\n**ClickUp (Create a task):** Creates tasks in ClickUp for each action item generated by AI."
}
}
],
"connections": {
"Firefly Webhook": {
"main": [
[
{
"node": "Get a transcript",
"type": "main",
"index": 0
}
]
]
},
"Get a transcript": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Summary Generator",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Summary Generator",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Summary Generator": {
"main": [
[
{
"node": "Cleans AI response",
"type": "main",
"index": 0
}
]
]
},
"Cleans AI response": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
},
{
"node": "Extracts action items",
"type": "main",
"index": 0
}
]
]
},
"Extracts action items": {
"main": [
[
{
"node": "Create a task",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "all",
"saveManualExecutions": true
},
"meta": {
"templateId": "8592",
"templateCredsSetupCompleted": false
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Meeting Transcript → Tasks (Universal Template). Uses @firefliesai/n8n-nodes-fireflies, lmChatGoogleGemini, agent, slack. Webhook trigger; 20 nodes.
Source: https://gist.github.com/retailbox-automation/925b586b2082ae449d81128b91c51010 — 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.
Webhook Trigger: The workflow starts when Fireflies notifies that a transcription has finished. Transcript Retrieval: The transcript is pulled from Fireflies based on the meeting ID. Pre-processing: T
Know that feeling when a "low priority" ticket turns into a production fire? Or when your on-call rotation starts showing signs of serious burnout from alert overload?
This AI-powered workflow transcribes Zoom/Google Meet recordings, extracts decisions and tasks using AI, then creates tickets in Jira/ClickUp/Linear and assigns them to team members automatically. Tri
This workflow converts raw ClickUp task updates—received directly through a webhook—into fully automated release documentation. It validates incoming payloads, fetches and cleans task details, enriche
When a meeting ends in Fireflies, the transcript is automatically retrieved and sent to OpenAI for analysis. The AI evaluates objection handling, call effectiveness, and extracts key objections raised