{
  "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
          }
        ]
      ]
    }
  }
}