This workflow corresponds to n8n.io template #7029 — we link there as the canonical source.
This workflow follows the HTTP Request → Informationextractor 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": "ff74078e-4506-4750-80ec-6df095b3344d",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"position": [
340,
1440
],
"parameters": {},
"typeVersion": 1
},
{
"id": "e02d44ca-fe4e-414e-80bd-38890b129022",
"name": "Baserow : set rowID",
"type": "n8n-nodes-base.redis",
"position": [
560,
1000
],
"parameters": {
"key": "=setMem0-userId",
"ttl": 3600,
"value": "={{ $json['meeting with']}}",
"expire": true,
"operation": "set"
},
"credentials": {
"redis": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "d3b157f5-c60c-4475-b5ac-2bda2422ad8e",
"name": "vexa-start",
"type": "n8n-nodes-base.webhook",
"position": [
-320,
1260
],
"parameters": {
"path": "vexa-API",
"options": {
"allowedOrigins": "*"
},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "49fe574d-3b08-42f6-8f25-3c6bc123db8a",
"name": "Baserow: Update Status to 'In Progress'",
"type": "n8n-nodes-base.baserow",
"position": [
340,
1000
],
"parameters": {
"rowId": "={{ $('vexa-start').item.json.body.items[0].id}}",
"tableId": 630917,
"fieldsUi": {
"fieldValues": [
{
"fieldId": 5143180,
"fieldValue": "In Progress"
}
]
},
"operation": "update",
"databaseId": 268764
},
"credentials": {
"baserowApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "18de75e4-6d24-4f6b-8481-cb18f034e932",
"name": "Baserow: Update Status to 'Stopped'",
"type": "n8n-nodes-base.baserow",
"position": [
340,
1200
],
"parameters": {
"rowId": "={{ $('vexa-start').item.json.body.items[0].id}}",
"tableId": 630917,
"fieldsUi": {
"fieldValues": [
{
"fieldId": 5143180,
"fieldValue": "Stop Request"
}
]
},
"operation": "update",
"databaseId": 268764
},
"credentials": {
"baserowApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e042c9b4-81c5-4852-b405-a7e346483eec",
"name": "HTTP: Start VEXA Bot",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"maxTries": 2,
"position": [
80,
1020
],
"parameters": {
"url": "https://gateway.dev.vexa.ai/bots",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "platform",
"value": "google_meet"
},
{
"name": "native_meeting_id",
"value": "={{ $json.body.items[0][\"Meeting Link\"].extractUrlPath().replace('/',\"\")}}"
},
{
"name": "language",
"value": "en"
},
{
"name": "bot_name",
"value": "={{ $json.body.items[0][\"Bot Name\"] }}"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 5000
},
{
"id": "d6097c2d-5acb-41ec-b468-e93ef9693b89",
"name": "HTTP: Stop VEXA Bot",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
120,
1260
],
"parameters": {
"url": "=https://gateway.dev.vexa.ai/bots/google_meet/{{ $json.body.items[0]['Meeting Link'].extractUrlPath().slice(1)}}",
"method": "DELETE",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "4183ab08-ddca-4489-8358-dec530778d28",
"name": "Route: Bot Action (Start/Stop)",
"type": "n8n-nodes-base.switch",
"position": [
-100,
1260
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Start_Bot",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "31e88a02-32ed-4407-bcf2-f6aed6079397",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.body.items.first()['Send Bot'].value}}",
"rightValue": "Start_Bot"
}
]
},
"renameOutput": true
},
{
"outputKey": "Stop_Bot",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "be0fb069-7bf0-4a4c-8231-00ba70eb6da8",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.body.items.first()['Send Bot'].value}}",
"rightValue": "Stop_Bot"
}
]
},
"renameOutput": true
}
]
},
"options": {
"fallbackOutput": "extra",
"renameFallbackOutput": "no_action"
},
"looseTypeValidation": true
},
"typeVersion": 3.2
},
{
"id": "40f2c644-6fad-473f-bc17-273b4106d45a",
"name": "Webhook: Transcript Ready",
"type": "n8n-nodes-base.webhook",
"position": [
-280,
1960
],
"parameters": {
"path": "luffy",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "981f41f0-b5aa-4524-a6c1-60c526ed2131",
"name": "VEXA: Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
-60,
2060
],
"parameters": {
"url": "=https://gateway.dev.vexa.ai/transcripts/google_meet/{{ $json.body.native_meeting_id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.2,
"alwaysOutputData": false,
"waitBetweenTries": 5000
},
{
"id": "8e62e7c4-7307-4a65-a9c8-c9e77ec87b43",
"name": "Process: Split Transcript Segments",
"type": "n8n-nodes-base.splitOut",
"position": [
160,
1960
],
"parameters": {
"options": {},
"fieldToSplitOut": "segments"
},
"typeVersion": 1
},
{
"id": "6d690e78-8a51-4b45-82b3-febc02d8a752",
"name": "Prepare: Select Transcript Data",
"type": "n8n-nodes-base.set",
"position": [
380,
1940
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "9dad0189-4fce-4945-8828-894dcf92a0e5",
"name": "speaker",
"type": "string",
"value": "={{ $json.speaker }}"
},
{
"id": "6aa88e65-6cfc-43b0-90d9-7675f37097f1",
"name": "meeting_transcript",
"type": "string",
"value": "={{ $json.text }}"
},
{
"id": "e1725954-5701-4ec6-8e11-2cd39ed69810",
"name": "created_at",
"type": "string",
"value": "={{ $json.created_at }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d0912b45-fe4e-4380-bcb9-be9b0365dad3",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
600,
1860
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineAll"
},
"typeVersion": 3
},
{
"id": "8e838252-400b-4019-a22e-a3268f654db1",
"name": "Prepare: Aggregate for Analysis",
"type": "n8n-nodes-base.aggregate",
"position": [
740,
1860
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "summary "
},
"typeVersion": 1
},
{
"id": "6224428f-723c-4024-bab9-483edcf777fa",
"name": "AI: Analyze Transcript",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
880,
1860
],
"parameters": {
"text": "={{ JSON.stringify ($json)}} ",
"options": {
"systemPromptTemplate": "=<role>\nYou are a Senior Business Analyst specializing in Conversation Intelligence.\n</role>\n\n<task>Your task is to review the provided meeting notes and create a concise summary that captures the essential information, focusing on key takeaways and action items assigned to specific individuals or departments during the meeting. Use clear and professional language, and organize the summary in a logical manner using appropriate formatting such as headings, subheadings, and bullet points. Ensure that the summary is easy to understand and provides a comprehensive but succinct overview of the meeting\u2019s content, with a particular focus on clearly indicating who is responsible for each action item.\n</task>\n\n### tip : Identifying entities and their context to better understand the sentiment"
},
"attributes": {
"attributes": [
{
"name": "summary",
"required": true,
"description": " A concise, 2-3 sentence executive summary of the entire conversation, capturing the main goal, key findings, and overall outcome of the call."
},
{
"name": "overallSentiment",
"description": "Your task is to analyze a conversation transcript and provide a structured breakdown of the sentiment associated with each key entity, followed by a final, conclusive summary."
},
{
"name": "potential red flags",
"required": true,
"description": "=Identify and list any potential risks, deal-breakers, or significant negative signals from the prospect. This includes mentions of serious budget freezes, internal politics, distrust in the proposed solution, or strong preference for a competitor. If no red flags are identified, return an empty array []."
},
{
"name": "nextSteps",
"required": true,
"description": "A list of all agreed-upon action items and next steps for both sides."
},
{
"name": "socialChatter",
"description": " List any non-business, rapport-building topics discussed. If the conversation is strictly business, return an empty array []."
},
{
"name": "user_id",
"required": true,
"description": "=the property name is the user_id. \"propertyName\":\"{{ $json['summary '][0].propertyName }}\""
}
]
}
},
"typeVersion": 1
},
{
"id": "78614e07-62af-4cec-8f7f-d35d9814d615",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
980,
2080
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "gpt-4o"
},
"options": {
"temperature": 0.7
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "724eb262-e53c-4aad-8050-6feb8eea7236",
"name": "Mem0: Add Transcript Memory",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1620,
1860
],
"parameters": {
"url": "https://api.mem0.ai/v1/memories/",
"method": "POST",
"options": {},
"jsonBody": "={{ $json.mem0Payload }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "15125ec1-3ece-4a0e-8221-1d3359c71f7a",
"name": "Redis: Get User ID",
"type": "n8n-nodes-base.redis",
"position": [
380,
1760
],
"parameters": {
"key": "=setMem0-userId",
"options": {
"dotNotation": true
},
"operation": "get"
},
"credentials": {
"redis": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5a32f034-8afe-4747-9581-52d5e2360b3c",
"name": "Stop and Error",
"type": "n8n-nodes-base.stopAndError",
"position": [
240,
2100
],
"parameters": {
"errorMessage": "error"
},
"typeVersion": 1
},
{
"id": "e4435a20-ac5d-4047-bf44-111175034913",
"name": "SET your webhook",
"type": "n8n-nodes-base.httpRequest",
"position": [
1140,
1400
],
"parameters": {
"url": "https://gateway.dev.vexa.ai/user/webhook",
"method": "PUT",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "webhook_url",
"value": "https://stuctstunter.zeabur.app/webhook/luffy"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "b6715064-6c07-44a0-9545-5d9cd8a29f9d",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1000,
880
],
"parameters": {
"width": 480,
"height": 1620,
"content": "### How it works\n\nThis workflow has two distinct parts that work together to manage a meeting's entire lifecycle.\n\n* **Part 1: Bot Management.** A command is received from your CRM (Baserow) to either deploy or remove an AI bot from a Google Meet. This ensures the bot is present only when needed. The workflow instantly updates the status in your Baserow table to `In Progress` or `Stopped`.\n* **Part 2: AI-Powered Analysis.** Upon meeting completion, a separate webhook from VEXA triggers the second part of the workflow. It automatically retrieves the full transcript and uses a powerful AI model (OpenAI) to analyze the conversation. The AI extracts key details like a **summary**, **next steps**, and **potential risks**. This structured output is then logged into a memory layer (Mem0) for a persistent, queryable record of all conversations.\n\n\n### Who's it for\n\nBuilt for non-technical solopreneurs and small business owners who want to effortlessly add conversation intelligence to their workflow. Get a single source of truth for all your meeting data without manual transcription or analysis.\n\n\n### Setup Steps\n\nRapid deployment. Your action plan:\n\n1. **Register Webhook:** First, run the manual trigger in this workflow to send your n8n webhook URL to VEXA. This is a crucial one-time setup step that tells VEXA where to send meeting transcripts after a call.\n2. **Connect Your CRM:** Copy the `vexa-start` webhook URL from n8n and paste it into your Baserow automation. For example, trigger it when you set the \"Send Bot\" field to `Start_Bot` in your table.\n3. **Integrate Platforms:** Set up your VEXA, Mem0, and OpenAI API credentials in n8n.\n4. **Use the Baserow Template:** We provide a free Baserow template that serves as your bot control panel. You can access it here: [https://baserow.io/public/grid/t5kYjovKEHjNix2-6Rijk99y4SDeyQY4rmQISciC14w](https://baserow.io/public/grid/t5kYjovKEHjNix2-6Rijk99y4SDeyQY4rmQISciC14w). This template contains the necessary fields like `Meeting Link`, `Bot Name`, and the `Send Bot` command field that triggers this workflow.\n\n\n### Requirements\n\n* Active n8n instance (self-hosted/cloud).\n* **VEXA.ai** account.\n* **Mem0.ai** account.\n* **Baserow** account for bot management.\n* **OpenAI** account.\n* **Redis Account:** A Redis database is required to temporarily store user IDs.\n* Your Baserow table must include specific fields:\n * **`Meeting Link`**: The URL of your Google Meet.\n * **`Bot Name`**: The name you want your AI bot to have.\n * **`Send Bot`**: A single-select field with `Start_Bot` and `Stop_Bot` as options.\n * **`Status`**: A single-select field for the workflow to update.\n\n### Next Steps\n\nThis workflow provides a powerful foundation. Here are a few ways to extend its value:\n\n* **Automate Follow-ups:** Trigger an automated email or task in your CRM based on AI-identified next steps or red flags.\n* **Integrate Email & Engagements:** Connect your email or other communication platforms to a workflow that uses Mem0 to parse and store all engagements, building a holistic client memory.\n* **Build a Headless CRM:** Use these combined workflows to create a fully AI-powered, headless CRM that handles everything from initial contact to proactive client management without any manual data entry."
},
"typeVersion": 1
},
{
"id": "bdb077ab-ba7e-4145-bed5-4241b09d31ba",
"name": "Register your webhook",
"type": "n8n-nodes-base.manualTrigger",
"position": [
920,
1400
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c7406080-b022-4d12-8344-7bf4b97e822c",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
920,
1280
],
"parameters": {
"color": 6,
"width": 420,
"height": 80,
"content": "## Register Your Webhook\n"
},
"typeVersion": 1
},
{
"id": "0b1fe396-bfa7-410d-91bb-5939337c6100",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
1140
],
"parameters": {
"color": 6,
"width": 260,
"height": 80,
"content": "## BOT Management "
},
"typeVersion": 1
},
{
"id": "c1a973db-26c6-4731-8d02-54785a93cec1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-280,
1820
],
"parameters": {
"color": 6,
"width": 280,
"height": 80,
"content": "## The Notetaking Magic"
},
"typeVersion": 1
},
{
"id": "7d181d4b-fd87-438a-b164-326c5a9a8638",
"name": "Clean up for mem0",
"type": "n8n-nodes-base.code",
"position": [
1240,
1860
],
"parameters": {
"jsCode": "// N8N Code Node: Verwerkt LLM output en assembleert de Mem0 payload.\n// Deze code is ontworpen om de output van een AI-model te structureren voor Mem0.\n\n// YOUR_AWS_SECRET_KEY_HERE===========================\n// I. CONFIGURATION\n// YOUR_AWS_SECRET_KEY_HERE===========================\nconst APP_ID = \"vexa_baserow_project\";\nconst AGENT_ID = \"vexa_baserow_ingestor\";\nconst AGENT_CONTACT_NAMES = [\n { name: \"Stephan\", keywords: [\"stephan\", \"stephan koning\"] },\n // Voeg hier andere agent namen toe\n];\n\n// YOUR_AWS_SECRET_KEY_HERE===========================\n// II. HELPER FUNCTIONS\n// YOUR_AWS_SECRET_KEY_HERE===========================\n\n// Helper: Vertaalt een datumstring naar een Unix timestamp (seconden sinds de epoch).\nfunction getUnixTimestamp(dateString) {\n if (!dateString) return null;\n try {\n const dateObj = new Date(dateString);\n if (isNaN(dateObj.getTime())) return null;\n return Math.floor(dateObj.getTime() / 1000);\n } catch (e) {\n return null;\n }\n}\n\n// Helper: Zoekt naar bekende agentnamen in de tekst.\nfunction determineAgentContactPerson(text) {\n if (!text) return '';\n const searchableText = String(text).toLowerCase();\n for (const agent of AGENT_CONTACT_NAMES) {\n if (agent.keywords.some(keyword => searchableText.includes(keyword))) {\n return agent.name;\n }\n }\n return '';\n}\n\n// Helper: Escaped een string voor JSON-compatibiliteit.\nfunction escapeJsonString(str) {\n if (typeof str !== 'string') return str;\n return JSON.stringify(str).slice(1, -1);\n}\n\n// Helper: Haalt een waarde op uit een object met een fallback voor als de key niet bestaat.\nfunction getWithFallback(obj, key, fallback = null) {\n if (obj && obj.hasOwnProperty(key)) {\n return obj[key] !== null ? obj[key] : fallback;\n }\n return fallback;\n}\n\n// YOUR_AWS_SECRET_KEY_HERE===========================\n// III. MAIN EXECUTION\n// YOUR_AWS_SECRET_KEY_HERE===========================\nconst output_items = [];\n\n// Dit script verwerkt een enkel LLM output-item dat als input wordt gegeven.\ntry {\n const llm_output_item = items[0]; // De LLM output is het eerste item\n const llm_output = llm_output_item.json.output || {};\n\n const meeting_summary = getWithFallback(llm_output, 'summary', \"No summary provided.\");\n const meeting_sentiment = getWithFallback(llm_output, 'overallSentiment', \"Neutral\");\n const meeting_red_flags = getWithFallback(llm_output, 'potential red flags', \"None\");\n const meeting_next_steps = getWithFallback(llm_output, 'nextSteps', \"None\");\n const social_chatter = getWithFallback(llm_output, 'socialChatter', \"None\");\n const client_id = getWithFallback(llm_output, 'user_id', \"user@example.com\");\n\n const agent_contact_person_name = determineAgentContactPerson(meeting_summary);\n\n // --- Samenstellen van de 'content' voor Mem0 ---\n const mem0_content_raw = `Klant had een vergadering met ${agent_contact_person_name || 'een agent'}.\n\nSamenvatting: ${meeting_summary}\nVolgende Stappen: ${meeting_next_steps}`;\n\n const mem0_content = escapeJsonString(mem0_content_raw);\n\n // --- Samenstellen van de 'metadata' ---\n const mem0_metadata = {\n \"type\": \"meeting\",\n \"summary\": escapeJsonString(meeting_summary),\n \"sentiment\": escapeJsonString(meeting_sentiment),\n \"red_flags\": escapeJsonString(meeting_red_flags),\n \"next_steps\": escapeJsonString(meeting_next_steps),\n \"social_chatter\": escapeJsonString(social_chatter),\n \"agent_contact_person_name\": escapeJsonString(agent_contact_person_name),\n \"native_meeting_id\": getWithFallback(llm_output, 'native_meeting_id', 'no_id')\n };\n\n const mem0_categories = [\"meeting\", \"summary\"];\n if (meeting_red_flags.toLowerCase() !== \"none\" && meeting_red_flags.length > 2) {\n mem0_categories.push(\"red_flag\");\n }\n if (meeting_next_steps.toLowerCase() !== \"none\") {\n mem0_categories.push(\"action_items\");\n }\n\n // --- Definitieve Mem0 Payload ---\n const mem0_payload = {\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": mem0_content\n }\n ],\n \"user_id\": client_id,\n \"agent_id\": AGENT_ID,\n \"app_id\": APP_ID,\n \"run_id\": `meeting_${client_id}_${Date.now()}`,\n \"metadata\": mem0_metadata,\n \"infer\": true,\n \"categories\": mem0_categories,\n \"version\": \"v2\",\n \"output_format\": \"v1.1\",\n \"timestamp\": getUnixTimestamp(new Date().toISOString())\n };\n \n output_items.push({\"json\": {\"mem0Payload\": mem0_payload}});\n\n} catch (error) {\n console.error(`Fout bij verwerken van LLM output:`, error.message, error);\n output_items.push({\"json\": {\"error\": true, \"message\": String(error), \"originalItem\": items[0].json}});\n}\n\nreturn output_items;"
},
"typeVersion": 2
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Prepare: Aggregate for Analysis",
"type": "main",
"index": 0
}
]
]
},
"vexa-start": {
"main": [
[
{
"node": "Route: Bot Action (Start/Stop)",
"type": "main",
"index": 0
}
]
]
},
"Clean up for mem0": {
"main": [
[
{
"node": "Mem0: Add Transcript Memory",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI: Analyze Transcript",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Redis: Get User ID": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"HTTP: Stop VEXA Bot": {
"main": [
[
{
"node": "Baserow: Update Status to 'Stopped'",
"type": "main",
"index": 0
}
],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"HTTP: Start VEXA Bot": {
"main": [
[
{
"node": "Baserow: Update Status to 'In Progress'",
"type": "main",
"index": 0
}
]
]
},
"VEXA: Get Transcript": {
"main": [
[
{
"node": "Process: Split Transcript Segments",
"type": "main",
"index": 0
}
],
[
{
"node": "Stop and Error",
"type": "main",
"index": 0
}
]
]
},
"Register your webhook": {
"main": [
[
{
"node": "SET your webhook",
"type": "main",
"index": 0
}
]
]
},
"AI: Analyze Transcript": {
"main": [
[
{
"node": "Clean up for mem0",
"type": "main",
"index": 0
}
]
]
},
"Webhook: Transcript Ready": {
"main": [
[
{
"node": "VEXA: Get Transcript",
"type": "main",
"index": 0
},
{
"node": "Redis: Get User ID",
"type": "main",
"index": 0
}
]
]
},
"Route: Bot Action (Start/Stop)": {
"main": [
[
{
"node": "HTTP: Start VEXA Bot",
"type": "main",
"index": 0
}
],
[
{
"node": "HTTP: Stop VEXA Bot",
"type": "main",
"index": 0
}
],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"Prepare: Aggregate for Analysis": {
"main": [
[
{
"node": "AI: Analyze Transcript",
"type": "main",
"index": 0
}
]
]
},
"Prepare: Select Transcript Data": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Process: Split Transcript Segments": {
"main": [
[
{
"node": "Prepare: Select Transcript Data",
"type": "main",
"index": 0
}
]
]
},
"Baserow: Update Status to 'In Progress'": {
"main": [
[
{
"node": "Baserow : set rowID",
"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.
baserowApihttpHeaderAuthopenAiApiredis
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
I'll be honest, I built this because I was getting lazy in meetings and missing key details. I started with a simple VEXA integration for transcripts, then added AI to pull out summaries and tasks. But that just solved part of the problem.
Source: https://n8n.io/workflows/7029/ — 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.
Episode 18 Scary Stories TikTok final. Uses httpRequest, lmChatOpenAi, lmChatOllama, lmChatDeepSeek. Event-driven trigger; 83 nodes.
The Ultimate Scraper for n8n uses Selenium and AI to retrieve any information displayed on a webpage. You can also use session cookies to log in to the targeted webpage for more advanced scraping need
z-Api. Uses httpRequest, openAi, redis, postgres. Webhook trigger; 61 nodes.
This template automates the extraction of structured data from Thai government letters received via LINE or uploaded to Google Drive. It uses Mistral AI for OCR and OpenAI for information extraction,
1978. Uses informationExtractor, lmChatOpenAi, stopAndError, httpRequest. Event-driven trigger; 24 nodes.