AutomationFlowsAI & RAG › Transcribe and Analyze Sales Meetings with Deepgram, Gemini, Ghl, Slack & Gmail

Transcribe and Analyze Sales Meetings with Deepgram, Gemini, Ghl, Slack & Gmail

Byiamvaar @iamvaar on n8n.io

This workflow receives a meeting voice recording via webhook, transcribes it with Deepgram, and uses Google Gemini to extract client details and next-step tasks. It then updates GoHighLevel, posts a task summary to Slack, emails the client their action items via Gmail, and logs…

Webhook trigger★★★★★ complexityAI-powered35 nodesHigh LevelAgentGoogle Gemini ChatOutput Parser StructuredGoogle SheetsSlackGmailHTTP Request
AI & RAG Trigger: Webhook Nodes: 35 Complexity: ★★★★★ AI nodes: yes Added:
Transcribe and Analyze Sales Meetings with Deepgram, Gemini, Ghl, Slack & Gmail — n8n workflow card showing High Level, Agent, Google Gemini Chat integration

This workflow corresponds to n8n.io template #16566 — we link there as the canonical source.

This workflow follows the Agent → Gmail 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 →

Download .json
{
  "id": "MDVVb6tlru4wldcF",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Meeting Analyzer: Transcribe, Extract Tasks & Update GHL",
  "tags": [],
  "nodes": [
    {
      "id": "c2cc014f-eb81-4f6e-8a01-d95620b4391a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        1360
      ],
      "parameters": {
        "width": 480,
        "height": 784,
        "content": "## AI Meeting Analyzer: Transcribe, Extract Tasks & Update GHL\n\n### How it works\n\n1. The workflow triggers on a webhook and verifies contact information in GoHighLevel.\n2. It fetches relevant spreadsheet data and processes audio files through Deepgram for transcription.\n3. An AI agent analyzes the transcripts to extract tasks and identifies client information.\n4. The workflow routes task updates to Slack and triggers email notifications based on the analysis.\n5. Final responses are sent back via webhooks to confirm execution.\n\n### Setup steps\n\n- - [ ] Configure the Webhook node URL.\n- - [ ] Connect your GoHighLevel account and authorize API access.\n- - [ ] Add your Deepgram API key to the HTTP request node.\n- - [ ] Set up a Google Sheet with the required contact mapping.\n- - [ ] Authenticate the Slack and Gmail nodes for notifications.\n\n### Customization\n\nYou can adjust the AI prompt in the agent node to change how tasks are extracted or modify the email templates to match your company branding."
      },
      "typeVersion": 1
    },
    {
      "id": "2665824e-0241-4fe1-b32a-7ad209bd40bb",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        1488
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 288,
        "content": "## Webhook and GHL verification\n\nReceives the webhook, validates mobile format, and checks for existing GHL contacts."
      },
      "typeVersion": 1
    },
    {
      "id": "a4afe55f-9735-4d5c-b99f-1394344b2e2f",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1280,
        1456
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 400,
        "content": "## Sync GHL and sheets contact\n\nHandles initial data synchronization, contact creation, and spreadsheet lookup."
      },
      "typeVersion": 1
    },
    {
      "id": "3c0f6a2f-6bad-4549-974d-6f423ee94645",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        1456
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 288,
        "content": "## Process and transcribe audio data\n\nProcesses binary data, performs transcription, and prepares audio transcripts for AI."
      },
      "typeVersion": 1
    },
    {
      "id": "195da62c-cdf6-4ec9-81c4-9f66252b3a3e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2624,
        1440
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 512,
        "content": "## AI agent insights generation\n\nUses an AI model to extract actionable insights from transcriptions."
      },
      "typeVersion": 1
    },
    {
      "id": "96be469e-5e17-4c39-9b90-5364feb2d0f3",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3056,
        1344
      ],
      "parameters": {
        "color": 7,
        "width": 820,
        "height": 496,
        "content": "## Route AI results and tasks\n\nAnalyzes AI findings to decide whether to update GHL or notify the owner via Slack."
      },
      "typeVersion": 1
    },
    {
      "id": "6356ef58-0a3d-4be7-a3b0-202188386464",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3936,
        1328
      ],
      "parameters": {
        "color": 7,
        "width": 820,
        "height": 320,
        "content": "## Task evaluation and email notification\n\nEvaluates task fulfillment and routes final emails based on AI findings."
      },
      "typeVersion": 1
    },
    {
      "id": "676e7d30-d33c-4e1d-8c9b-ba29eb688f47",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3936,
        1696
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 288,
        "content": "## Client messaging and webhook response\n\nHandles messaging logic for task updates and final webhook responses."
      },
      "typeVersion": 1
    },
    {
      "id": "34499a3f-f7d8-4c59-9fd2-e32643ae2922",
      "name": "When Voice Recording Received",
      "type": "n8n-nodes-base.webhook",
      "position": [
        432,
        1616
      ],
      "parameters": {
        "path": "voice-recording",
        "options": {
          "rawBody": false
        },
        "httpMethod": "POST",
        "responseMode": "responseNode",
        "authentication": "headerAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "ebf06839-4725-4812-af76-75000339df8f",
      "name": "Fetch GHL Contact",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        880,
        1600
      ],
      "parameters": {
        "filters": {
          "query": "={{ $json.body.email }}"
        },
        "options": {},
        "operation": "getAll",
        "requestOptions": {}
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "baccc3ad-4d7d-4145-9aea-317446a86c58",
      "name": "Check Email Provided",
      "type": "n8n-nodes-base.if",
      "position": [
        656,
        1616
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f2a19712-eafc-4cf5-8ec5-2347fde30986",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.body.email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "817f5806-7621-4090-b75d-a18aa377aecb",
      "name": "Check Contact Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        1104,
        1600
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30bb8d1a-9af2-4356-b518-7c8a7f486976",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "9e675052-2185-4bbd-a29c-a1e93578d780",
      "name": "Extract Audio Binary",
      "type": "n8n-nodes-base.code",
      "position": [
        2016,
        1568
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nconst webhookItem = $('When Voice Recording Received').first();\n\nif (!webhookItem || !webhookItem.binary) {\n  throw new Error(\"No binary file was found in the Webhook node.\");\n}\n\nconst binaryKey = Object.keys(webhookItem.binary)[0];\nconst binaryFile = webhookItem.binary[binaryKey];\n\nfor (const item of items) {\n  item.binary = {\n    audio: binaryFile\n  };\n}\n\nreturn items;"
      },
      "typeVersion": 2
    },
    {
      "id": "17c8ba06-f5c7-431b-8fee-a504b9497dd1",
      "name": "Upsert GHL Contact",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        1328,
        1680
      ],
      "parameters": {
        "email": "={{ $('When Voice Recording Received').item.json.body.email }}",
        "requestOptions": {},
        "additionalFields": {}
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "29d80a4c-118e-4dcb-b0a6-499f05186285",
      "name": "Meeting Analysis Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2720,
        1568
      ],
      "parameters": {
        "text": "={{ $json.speakerTranscript }}",
        "options": {
          "systemMessage": "You are an expert Business Analyst AI specialized in analyzing B2B sales and discovery call transcripts. \n\nYour objective is to extract clear, actionable next steps for the parties involved in the conversation and output the results STRICTLY as a JSON object. You must not assume or hardcode any names; dynamically extract them from the transcript.\n\nFollow this sequence to build your JSON:\n\n1. ENTITY IDENTIFICATION:\n   - Identify the \"service_provider\": The primary party hosting the call or pitching the service. Do NOT output their company name.\n   - Identify the \"client\": The party evaluating the service. You must extract both the individual's name (client_name) and their company's name (company_name). If either is not mentioned, use \"Unknown\".\n\n2. ACTION EXTRACTION & BOOLEAN LOGIC:\n   - Extract explicit commitments, next steps, and action items declared by each speaker. Ensure these are concrete tasks.\n   - For each entity, evaluate if they have any assigned tasks.\n   - Set the \"had_tasks\" boolean to true if tasks exist, or false if the array is empty.\n\n3. STRICT JSON OUTPUT:\n   - You must output ONLY valid JSON. Do not include introductory text, conversational filler, or markdown formatting like ```json. \n   - Use the exact schema attached.\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "24809f14-74da-481f-98d7-baeb46b71ebe",
      "name": "Google Gemini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        2672,
        1792
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-3.1-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "08a85e09-4552-438d-942e-bd78dd76dee8",
      "name": "Parse Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2864,
        1792
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"service_provider\": {\n    \"had_tasks\": true,\n    \"tasks\": [\n      \"Task 1\",\n      \"Task 2\"\n    ]\n  },\n  \"client\": {\n    \"client_name\": \"[Extracted Person's Name or 'Unknown']\",\n    \"company_name\": \"[Extracted Company Name or 'Unknown']\",\n    \"had_tasks\": true,\n    \"tasks\": [\n      \"Task 1\"\n    ]\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "6dd11c30-f4c3-4e27-97a9-4dbe678b4706",
      "name": "Read Meeting Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1552,
        1584
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('When Voice Recording Received').item.json.body.meeting_id }}",
              "lookupColumn": "meetingid"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit?usp=drivesdk",
          "cachedResultName": "meetings_tasks"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "ae0952e7-cfda-48fd-97c7-892a98a8d734",
      "name": "If New Meeting Found",
      "type": "n8n-nodes-base.if",
      "position": [
        1776,
        1584
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bad19eb3-943b-4636-b947-9eadc132ffda",
              "operator": {
                "type": "number",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.row_number }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b3d6ae54-54b6-49a7-b0f3-1b7b6c0089c5",
      "name": "Upsert Missing Contact",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        3328,
        1472
      ],
      "parameters": {
        "email": "={{ $('When Voice Recording Received').item.json.body.email }}",
        "phone": "=",
        "requestOptions": {},
        "additionalFields": {
          "firstName": "={{ $json.output.client.client_name }}"
        }
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "cf3884d4-97d0-498e-a2b8-b0eaa989ace6",
      "name": "Post Slack Summary",
      "type": "n8n-nodes-base.slack",
      "position": [
        3648,
        1696
      ],
      "parameters": {
        "text": "=Meeting Id: {{ $('When Voice Recording Received').item.json.body.meeting_id }}\nMeeting Email: {{ $('When Voice Recording Received').item.json.body.email }}\nMeeting Date & Time: {{ $('When Voice Recording Received').item.json.body.meeting_datetime }}\n\n{{\n\"Here are your meetings Next Tasks:\\n\\n\" +\n$('Meeting Analysis Agent').item.json.output.service_provider.tasks\n.map((task, index) => `${index + 1}. ${task}`)\n.join('\\n')\n}}\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0B8VH1M5PX",
          "cachedResultName": "general"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "32e300d3-b34d-46e5-b46d-469ee90950ac",
      "name": "Email Tasks to Client",
      "type": "n8n-nodes-base.gmail",
      "position": [
        4208,
        1808
      ],
      "parameters": {
        "sendTo": "={{ $('When Voice Recording Received').item.json.body.email }}",
        "message": "=Hi {{ $('Meeting Analysis Agent').item.json.output.client.client_name }},\n\nHere are your next steps:\n{{ $('Meeting Analysis Agent').item.json.output.client.tasks }}\n\n\nThanks,\nVaar",
        "options": {},
        "subject": "Here are your next steps for the meeting"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "61ba086a-9fe9-49f2-b0ae-ce3d3fe5e067",
      "name": "Respond to Webhook Finished",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        4560,
        1808
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.5
    },
    {
      "id": "b7adaac9-d200-4e92-be95-2195bc0e399f",
      "name": "Check If Name Recognized",
      "type": "n8n-nodes-base.if",
      "position": [
        3984,
        1472
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1100e85b-e0fd-48ad-933c-2f8557e03fc1",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Meeting Analysis Agent').item.json.output.client.had_tasks }}",
              "rightValue": ""
            },
            {
              "id": "02718bbe-9e58-4ef4-8037-6f6cebf60b43",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "dd214c5a-d513-4d19-afbb-17a6299f432b",
      "name": "Check If Tasks Exist",
      "type": "n8n-nodes-base.if",
      "position": [
        3984,
        1824
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1100e85b-e0fd-48ad-933c-2f8557e03fc1",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Meeting Analysis Agent').item.json.output.client.had_tasks }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "c724a262-323d-4ef8-b3f5-6efe3c2d423f",
      "name": "Merge Transcript Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2448,
        1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2c5cb607-2476-4430-9b30-2d1b80410fa8",
              "name": "=speakerTranscript",
              "type": "string",
              "value": "={{$json.body.results.utterances.map(u => `Speaker ${u.speaker}: ${u.transcript}`).join('\\n\\n')}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8d1f1b04-f77a-447b-bb97-d077eedc55d6",
      "name": "Post Tasks to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        3760,
        1472
      ],
      "parameters": {
        "text": "=Meeting Id: {{ $('When Voice Recording Received').item.json.body.meeting_id }}\nMeeting Email: {{ $('When Voice Recording Received').item.json.body.email }}\nMeeting Date & Time: {{ $('When Voice Recording Received').item.json.body.meeting_datetime }}\n\n{{\n\"Here are your meetings Next Tasks:\\n\\n\" +\n$('Meeting Analysis Agent').item.json.output.service_provider.tasks\n.map((task, index) => `${index + 1}. ${task}`)\n.join('\\n')\n}}\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0B8VH1M5PX",
          "cachedResultName": "general"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "c49690c0-fb50-4d6d-828f-902fb7d22c4a",
      "name": "Email Client Tasks",
      "type": "n8n-nodes-base.gmail",
      "position": [
        4208,
        1456
      ],
      "parameters": {
        "sendTo": "={{ $('When Voice Recording Received').item.json.body.email }}",
        "message": "=Hi {{ $('Meeting Analysis Agent').item.json.output.client.client_name }},\n\nHere are your next steps:\n{{ $('Meeting Analysis Agent').item.json.output.client.tasks }}\n\n\nThanks,\nVaar",
        "options": {},
        "subject": "Here are your next steps for the meeting"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9f264958-c763-4b58-a5f3-332b6d47f9b6",
      "name": "Transcribe Audio via Deepgram1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2224,
        1568
      ],
      "parameters": {
        "url": "https://api.deepgram.com/v1/listen?model=nova-2&diarize=true&utterances=true&punctuate=true&smart_format=true",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true,
              "fullResponse": true,
              "responseFormat": "json"
            }
          }
        },
        "sendBody": true,
        "contentType": "binaryData",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "inputDataFieldName": "audio"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "83841c02-a8d8-4f44-8efe-2f2281637732",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        4640,
        1456
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.5
    },
    {
      "id": "fb8acb28-976f-47ca-9174-5fba4d32ca88",
      "name": "Create a task",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        3536,
        1472
      ],
      "parameters": {
        "title": "=Tasks for Meeting Id: {{ $('When Voice Recording Received').item.json.body.meeting_id }}",
        "dueDate": "={{ $now.plus({ days: 1 }).startOf('day').toFormat(\"yyyy-MM-dd'T'HH:mm:ss\") }}",
        "resource": "task",
        "contactId": "={{ $('Fetch GHL Contact').item?.json?.id || $('Upsert GHL Contact').item?.json?.id }}",
        "requestOptions": {},
        "additionalFields": {
          "body": "={{ \"Here are your meetings Next Tasks:\\n\\n\" + $('Meeting Analysis Agent').item.json.output.service_provider.tasks .map((task, index) => `${index + 1}. ${task}`) .join('\\n') }}"
        }
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0049e259-93b4-4a6b-99b4-f4992bc1b951",
      "name": "Check If Contact name is Missing",
      "type": "n8n-nodes-base.if",
      "position": [
        3104,
        1568
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1b485f53-b70e-42d0-84be-a354b19d4399",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $('Fetch GHL Contact').item.json.firstName }}",
              "rightValue": ""
            },
            {
              "id": "d6806303-9c1b-43c7-9b06-eb8250acf582",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.output.client.client_name }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "d2642eb7-c806-4430-8294-2a3636072c94",
      "name": "Create a task1",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        3344,
        1696
      ],
      "parameters": {
        "title": "=Tasks for Meeting Id: {{ $('When Voice Recording Received').item.json.body.meeting_id }}",
        "dueDate": "={{ $now.plus({ days: 1 }).startOf('day').toFormat(\"yyyy-MM-dd'T'HH:mm:ss\") }}",
        "resource": "task",
        "contactId": "={{ $('Fetch GHL Contact').item.json.id }}",
        "requestOptions": {},
        "additionalFields": {
          "body": "={{\n\"Here are your meetings Next Tasks:\\n\\n\" +\n$('Meeting Analysis Agent').item.json.output.service_provider.tasks\n.map((task, index) => `${index + 1}. ${task}`)\n.join('\\n')\n}}"
        }
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6725b672-df79-42f1-aeec-4f55b9bc3194",
      "name": "Append row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4416,
        1456
      ],
      "parameters": {
        "columns": {
          "value": {
            "meetingid": "={{ $('When Voice Recording Received').item.json.body.meeting_id }}",
            "client_email": "={{ $('When Voice Recording Received').item.json.body.email }}",
            "company_name": "={{ $('Meeting Analysis Agent').item.json.output.client.company_name }}",
            "meeting_time": "={{ $('When Voice Recording Received').item.json.body.meeting_datetime }}",
            "actionable_items": "={{ $('Meeting Analysis Agent').item.json.output.client.tasks }}"
          },
          "schema": [
            {
              "id": "meetingid",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meetingid",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "company_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "company_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "actionable_items",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "actionable_items",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meeting_time",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meeting_time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit?usp=drivesdk",
          "cachedResultName": "meetings_tasks"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "bed5c604-e07a-4f39-85e4-d7057a6249d8",
      "name": "Append row in sheet1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4384,
        1808
      ],
      "parameters": {
        "columns": {
          "value": {
            "meetingid": "={{ $('When Voice Recording Received').item.json.body.meeting_id }}",
            "client_email": "={{ $('When Voice Recording Received').item.json.body.email }}",
            "company_name": "={{ $('Meeting Analysis Agent').item.json.output.client.company_name }}",
            "meeting_time": "={{ $('When Voice Recording Received').item.json.body.meeting_datetime }}",
            "actionable_items": "={{ $('Meeting Analysis Agent').item.json.output.client.tasks }}"
          },
          "schema": [
            {
              "id": "meetingid",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meetingid",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "company_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "company_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "actionable_items",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "actionable_items",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meeting_time",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meeting_time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1e7Rt3ZWHIN89ReEqOoaxdi3GJjxo51BqN3psBuqSfmE/edit?usp=drivesdk",
          "cachedResultName": "meetings_tasks"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": true,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "4da61ed2-6d8c-4f1e-a310-6282d9f0f417",
  "nodeGroups": [],
  "connections": {
    "Create a task": {
      "main": [
        [
          {
            "node": "Post Tasks to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a task1": {
      "main": [
        [
          {
            "node": "Post Slack Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch GHL Contact": {
      "main": [
        [
          {
            "node": "Check Contact Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Client Tasks": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Slack Summary": {
      "main": [
        [
          {
            "node": "Check If Tasks Exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Meeting Sheet": {
      "main": [
        [
          {
            "node": "If New Meeting Found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upsert GHL Contact": {
      "main": [
        [
          {
            "node": "Read Meeting Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Model": {
      "ai_languageModel": [
        [
          {
            "node": "Meeting Analysis Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Post Tasks to Slack": {
      "main": [
        [
          {
            "node": "Check If Name Recognized",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet1": {
      "main": [
        [
          {
            "node": "Respond to Webhook Finished",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Contact Exists": {
      "main": [
        [
          {
            "node": "Read Meeting Sheet",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Upsert GHL Contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Email Provided": {
      "main": [
        [
          {
            "node": "Fetch GHL Contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Tasks Exist": {
      "main": [
        [
          {
            "node": "Email Tasks to Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Audio Binary": {
      "main": [
        [
          {
            "node": "Transcribe Audio via Deepgram1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If New Meeting Found": {
      "main": [
        [
          {
            "node": "Extract Audio Binary",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Email Tasks to Client": {
      "main": [
        [
          {
            "node": "Append row in sheet1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Transcript Data": {
      "main": [
        [
          {
            "node": "Meeting Analysis Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Meeting Analysis Agent": {
      "main": [
        [
          {
            "node": "Check If Contact name is Missing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upsert Missing Contact": {
      "main": [
        [
          {
            "node": "Create a task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "Meeting Analysis Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Check If Name Recognized": {
      "main": [
        [
          {
            "node": "Email Client Tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Voice Recording Received": {
      "main": [
        [
          {
            "node": "Check Email Provided",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe Audio via Deepgram1": {
      "main": [
        [
          {
            "node": "Merge Transcript Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Contact name is Missing": {
      "main": [
        [
          {
            "node": "Upsert Missing Contact",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create a task1",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow receives a meeting voice recording via webhook, transcribes it with Deepgram, and uses Google Gemini to extract client details and next-step tasks. It then updates GoHighLevel, posts a task summary to Slack, emails the client their action items via Gmail, and logs…

Source: https://n8n.io/workflows/16566/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

⏺ 🚀 How it works

Agent, Anthropic Chat, Output Parser Structured +6
AI & RAG

leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.

Supabase, Gmail, Form Trigger +13
AI & RAG

🧾 Short Description

Agent, OpenAI Chat, Output Parser Structured +4
AI & RAG

This workflow automates end-to-end concert ticket booking validation and fan experience management using two coordinated AI agents. It is designed for ticketing platforms, event operators, and venue o

OpenAI Chat, Output Parser Structured, Agent +4
AI & RAG

Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct

Chat Trigger, Output Parser Structured, Memory Buffer Window +6