{
  "name": "AI Meeting Task Manager - Extract Action Items from Google Meet Notes to CRM",
  "tags": [],
  "nodes": [
    {
      "id": "146fe564-9ae2-4d45-b105-5b46b917dbd4",
      "name": "DAILY ORGANIZATION TRIGGER",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "68823d9a-22bc-429a-8cb8-7b3439ffa25b",
      "name": "FIND MEETING RECORD FOLDER",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        208,
        0
      ],
      "parameters": {
        "filter": {
          "folderId": {
            "__rl": true,
            "mode": "url",
            "value": "YOUR_MEETING_RECORDS_FOLDER_URL"
          }
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "081af236-8cba-46ed-9402-8cb27ede734a",
      "name": "SPLIT OUT NOTES, CHAT, RECORDINGS",
      "type": "n8n-nodes-base.code",
      "position": [
        432,
        0
      ],
      "parameters": {
        "jsCode": "// Get the input items\nconst documents = $input.all().map(item => item.json);\n\n// Initialize arrays for each category\nconst recordings = [];\nconst notes = [];\nconst chats = [];\n\n// Process each document\ndocuments.forEach(doc => {\n  const name = doc.name.toLowerCase();\n  \n  // Skip the \"RECORDINGS\" folder itself\n  if (name === 'recordings') {\n    return;\n  }\n  \n  // Categorize based on the document name\n  if (name.includes('- recording')) {\n    recordings.push(doc);\n  } else if (name.includes('- notes by gemini')) {\n    notes.push(doc);\n  } else if (name.includes('- chat')) {\n    chats.push(doc);\n  }\n});\n\n// Return as separate items for each category\nconst output = [];\n\n// Add recordings as individual items\nrecordings.forEach(rec => {\n  output.push({\n    json: {\n      type: 'recording',\n      ...rec\n    }\n  });\n});\n\n// Add notes as individual items\nnotes.forEach(note => {\n  output.push({\n    json: {\n      type: 'note',\n      ...note\n    }\n  });\n});\n\n// Add chats as individual items\nchats.forEach(chat => {\n  output.push({\n    json: {\n      type: 'chat',\n      ...chat\n    }\n  });\n});\n\nreturn output;"
      },
      "typeVersion": 2
    },
    {
      "id": "9ea31bd2-e736-449b-9498-87ce6eff1544",
      "name": "ROUTE FILE TYPES",
      "type": "n8n-nodes-base.switch",
      "position": [
        640,
        -16
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "RECORDINGS",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "dbe87f14-43e5-4d10-86f0-05dff2d90386",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "recording"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "NOTES",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "1d9d68bb-6cea-4ecb-8b4b-55b1365f64fc",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "note"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "CHAT",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "cf026be9-4147-4a19-8736-043bece44463",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "chat"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "allMatchingOutputs": true
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "c923016d-f00d-47b4-918d-7c1f6be265b2",
      "name": "MOVE RECORDINGS TO RECORDINGS FOLDER",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        880,
        -176
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "YOUR_RECORDINGS_FOLDER_URL"
        },
        "operation": "move"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "009cac6f-de8b-408d-88fe-eba2381d90e0",
      "name": "MOVE NOTES TO NOTES FOLDER",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        880,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "YOUR_NOTES_FOLDER_URL"
        },
        "operation": "move"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "9a6b2626-13ec-40db-ae73-761caaf85af8",
      "name": "MOVE CHAT TO CHAT FOLDER",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        880,
        176
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "YOUR_CHAT_FOLDER_URL"
        },
        "operation": "move"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "0d9bab22-295d-4152-86e3-632a4fed90c5",
      "name": "COMBINE ALL",
      "type": "n8n-nodes-base.merge",
      "position": [
        1168,
        -16
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "f7afbd30-3dc2-4fb6-9bc9-be648a6aae8a",
      "name": "SUMMARIZE AND CREATE TASK LIST",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1616,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "0907bcbb-6926-4048-92ae-8cb69c5a27be",
      "name": "GET NOTES",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1856,
        144
      ],
      "parameters": {
        "simple": false,
        "operation": "get",
        "documentURL": "={{ $json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "ffebb6b4-9eca-4244-8472-57d00ad9b7f1",
      "name": "FILTER FOR NOTES",
      "type": "n8n-nodes-base.filter",
      "position": [
        1376,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ce97798f-dde3-4a2d-b016-06b502af53df",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.mimeType }}",
              "rightValue": "application/vnd.google-apps.document"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e0b76c0c-5701-417a-8d2a-d4ef3075d842",
      "name": "PREP DATA",
      "type": "n8n-nodes-base.set",
      "position": [
        2272,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "709a32b0-d781-4fd1-85d6-791a88217c2b",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.summary }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f9cd8877-6ec3-49cd-ab43-14a676c45c3b",
      "name": "ORGANIZATION AGENT",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2480,
        144
      ],
      "parameters": {
        "text": "=Here are the meeting notes to process. Extract all action items assigned to me (Leo) and create tasks in GoHighLevel for the appropriate contact.\n\n---\n\nMEETING NOTES:\n\n{{ $json.summary }}\n\n---\n\nInstructions:\n1. Identify who I met with from the meeting title/content\n2. Search for that contact in GoHighLevel\n3. Create individual tasks for each action item I need to complete\n4. If there's a timeframe mentioned, use it for the due date. Otherwise default to 3 business days from today.\n\nToday's date: {{ $now.format('yyyy-MM-dd') }}",
        "options": {
          "systemMessage": "You are a task extraction and organization assistant. Your job is to process meeting notes and create actionable tasks in GoHighLevel for follow-up.\nYour workflow:\n\nAnalyze the meeting notes provided to you. Focus on:\n\nThe \"Suggested next steps\" section (primary source of tasks)\nAny commitments, promises, or action items mentioned throughout\nDeadlines or timeframes mentioned\n\n\nIdentify the contact from the meeting title or notes content. The meeting title format is typically \"[Name] & [Name] - [Meeting Type] - [Date]\". Extract the external participant's name (not \"Leo\") and use the FIND CONTACT IN GHL tool to search for them. Search by first name, last name, or full name.\nCreate tasks using the CREATE TASKS IN GHL tool for each action item. For each task:\n\ncontactId: Use the contact ID returned from your search\ntitle: Clear, actionable task title (start with a verb)\ndueDate: If a timeframe is mentioned, calculate the date. If no timeframe is specified, set it for 3 business days from now. Use ISO 8601 format.\nbody: Include context from the meeting notes - what was discussed, why this task matters, any relevant details\n\n\n\nTask extraction guidelines:\n\nExtract tasks assigned to Leo (the user), not tasks for the other party\nBe specific - \"Follow up on email setup\" is better than \"Follow up\"\nIf multiple tasks exist, create them separately\nSkip vague items that aren't truly actionable\n\nExample task creation:\nFrom notes saying \"Leo Lara will send Barry Hill a text message when the info and the Barry emails are working\":\n\nTitle: \"Text Barry when email setup is complete\"\nBody: \"Per 11/30 meeting: Confirm user@example.com and user@example.com are both working, then text Barry to confirm.\"\n\nIf you cannot find a matching contact, still list the tasks you would have created so the user can manually assign them."
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "d7c7fbe4-f169-4d19-a698-11e8d1baa911",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2480,
        320
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5.1",
          "cachedResultName": "gpt-5.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "1aad255a-d541-4708-b2b3-8853bee3599d",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        2576,
        512
      ],
      "parameters": {
        "sessionKey": "={{ $('PREP DATA').item.json.documentId }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8b010576-2860-4ee4-99dd-ffccddd60e8e",
      "name": "FIND CONTACT IN GHL",
      "type": "n8n-nodes-base.highLevelTool",
      "position": [
        2848,
        256
      ],
      "parameters": {
        "filters": {
          "query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Query', ``, 'string') }}"
        },
        "options": {
          "order": "desc"
        },
        "operation": "getAll",
        "returnAll": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Return_All', ``, 'boolean') }}",
        "requestOptions": {}
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "f2cb9866-8e2d-4f1c-a53b-99a1ff6609d9",
      "name": "CREATE TASKS IN GHL",
      "type": "n8n-nodes-base.highLevelTool",
      "position": [
        3024,
        256
      ],
      "parameters": {
        "title": "={{ $fromAI('Title', ``, 'string') }}",
        "dueDate": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Due_Date', ``, 'string') }}",
        "resource": "task",
        "contactId": "={{ $fromAI('Contact_ID', 'The GHL contact ID to attach this task to', 'string') }}",
        "requestOptions": {},
        "additionalFields": {
          "body": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Body', ``, 'string') }}",
          "assignedTo": "YOUR_GHL_USER_ID"
        }
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d8cf4b23-95f2-449a-a714-9a969ba76900",
      "name": "COMBINE OUTPUTS",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2064,
        -16
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "output"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a45434a1-bfcc-4ee4-8b30-da74c489de84",
      "name": "SUMMARIZATION AGENT",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3376,
        -16
      ],
      "parameters": {
        "text": "=Here are the results from processing today's meeting notes. Summarize what was done and send me an email update.\n\n---\n\nORGANIZATION AGENT OUTPUT:\n\n{{ $json.output }}\n\n---\n\nCompose and send an email summary showing:\n1. Which contacts had tasks created\n2. What tasks were created  \n3. When they're due\n4. Any issues or failures\n\nUse the SEND EMAIL TO LEO tool to send the email.\n\nToday's date: {{ $now.format('yyyy-MM-dd') }}",
        "options": {
          "systemMessage": "You are a summary and reporting assistant. Your job is to analyze the Organization Agent output and send Leo an email summary using the SEND EMAIL TO LEO tool.\n\n**What to extract from the output:**\n- Date: Today's date formatted nicely (e.g., \"December 2, 2025\")\n- Meeting_Count: How many meetings were processed\n- Status_Message: \"All tasks created successfully\" or describe any issues\n- Contact_Sections: HTML blocks for each contact (the tool description shows the exact format)\n\n**For Contact_Sections, generate one HTML block per contact:**\n- Replace CONTACT NAME with the person's name\n- Replace COMPANY with their company (or \"No company\")\n- Replace X with task count\n- Replace DATE with due date (e.g., \"Dec 5\")\n- Replace TASK_ROWS with a row for each task\n- Replace TASK TITLE with the actual task title\n\n**Subject line format:**\n\u2705 Meeting Tasks Created: [Primary Contact Name] ([Total Task Count] tasks) - [Short Date]\n\n**Important:** \n- Use the SEND EMAIL TO LEO tool to send the email\n- The HTML template is already in the tool - just fill in the dynamic parts"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "d2cf7cbe-924b-4f0f-9080-c865350a5dff",
      "name": "Simple Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        3472,
        448
      ],
      "parameters": {
        "sessionKey": "summary",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "4c1447f5-1ae7-4e0f-8228-7d355c61419e",
      "name": "SEND EMAIL TO LEO",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        3760,
        96
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n</head>\n<body style=\"margin: 0; padding: 0; background-color: #f4f4f5; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\">\n  <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #f4f4f5; padding: 40px 20px;\">\n    <tr>\n      <td align=\"center\">\n        <table width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\">\n          \n          <!-- Header -->\n          <tr>\n            <td style=\"background: linear-gradient(135deg, #1e293b 0%, #334155 100%); padding: 32px 40px;\">\n              <h1 style=\"margin: 0; color: #ffffff; font-size: 24px; font-weight: 600;\">\ud83d\udccb Task Summary</h1>\n              <p style=\"margin: 8px 0 0 0; color: #94a3b8; font-size: 14px;\">{{ $fromAI('Date', 'Todays date formatted like December 2 2025', 'string') }} \u2022 {{ $fromAI('Meeting_Count', 'Number of meetings processed', 'string') }} meeting(s) processed</p>\n            </td>\n          </tr>\n          \n          <!-- Status Banner -->\n          <tr>\n            <td style=\"background-color: #10b981; padding: 16px 40px;\">\n              <p style=\"margin: 0; color: #ffffff; font-size: 14px; font-weight: 500;\">\u2713 {{ $fromAI('Status_Message', 'Brief status like All tasks created successfully or Issues occurred', 'string') }}</p>\n            </td>\n          </tr>\n          \n          <!-- Contact Sections -->\n          <tr>\n            <td style=\"padding: 32px 40px 16px 40px;\">\n              {{ $fromAI('Contact_Sections', 'For each contact generate HTML using this exact format per contact: <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #f8fafc; border-radius: 8px; border-left: 4px solid #3b82f6; margin-bottom: 16px;\"><tr><td style=\"padding: 20px;\"><h2 style=\"margin: 0 0 4px 0; color: #1e293b; font-size: 18px; font-weight: 600;\">CONTACT NAME</h2><p style=\"margin: 0 0 16px 0; color: #64748b; font-size: 13px;\">COMPANY \u2022 X tasks \u2022 Due DATE</p><table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">TASK_ROWS</table></td></tr></table> where TASK_ROWS uses this format per task: <tr><td style=\"padding: 8px 0;\"><table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"><tr><td width=\"24\" valign=\"top\"><div style=\"width: 18px; height: 18px; background-color: #dbeafe; border-radius: 4px; text-align: center; line-height: 18px; font-size: 10px; color: #3b82f6;\">\u2713</div></td><td style=\"padding-left: 12px;\"><p style=\"margin: 0; color: #334155; font-size: 14px;\">TASK TITLE</p></td></tr></table></td></tr>', 'string') }}\n            </td>\n          </tr>\n          \n          <!-- Footer -->\n          <tr>\n            <td style=\"padding: 24px 40px 32px 40px; border-top: 1px solid #e2e8f0;\">\n              <p style=\"margin: 0; color: #94a3b8; font-size: 12px; text-align: center;\">Generated by Organization Agent \u2022 Tasks synced to GoHighLevel</p>\n            </td>\n          </tr>\n          \n        </table>\n      </td>\n    </tr>\n  </table>\n</body>\n</html>\n```",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9ce0a564-c371-454d-ab70-9d749edbbe51",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3376,
        192
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "3fe1e508-3633-437d-8b13-b26bb675e544",
      "name": "EXTRACT DATE AND CONTENT",
      "type": "n8n-nodes-base.code",
      "position": [
        2064,
        144
      ],
      "parameters": {
        "jsCode": "// Extract title and content from Google Docs JSON payload\n\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n  // Get the document data - handle both array and object formats\n  let docData = item.json;\n  \n  // If it's an array (like your payload), get the first element\n  if (Array.isArray(docData)) {\n    docData = docData[0];\n  }\n  \n  const title = docData.title || 'Untitled Document';\n  const content = docData.body?.content || [];\n  \n  // Extract all text content\n  let fullText = '';\n  \n  for (const element of content) {\n    if (element.paragraph) {\n      const paragraph = element.paragraph;\n      \n      for (const elem of paragraph.elements || []) {\n        // Regular text\n        if (elem.textRun?.content) {\n          fullText += elem.textRun.content;\n        }\n        // Person mentions\n        if (elem.person?.personProperties?.name) {\n          fullText += elem.person.personProperties.name;\n        }\n        // Rich links\n        if (elem.richLink?.richLinkProperties?.title) {\n          fullText += `[${elem.richLink.richLinkProperties.title}]`;\n        }\n      }\n    }\n  }\n  \n  // Clean up the text - remove excessive whitespace but preserve structure\n  const cleanedContent = fullText\n    .replace(/\\n{3,}/g, '\\n\\n')  // Max 2 newlines in a row\n    .trim();\n  \n  results.push({\n    json: {\n      title: title,\n      content: cleanedContent,\n      summary: `## ${title}\\n\\n${cleanedContent}`\n    }\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "sticky-main-doc",
      "name": "\ud83d\udccb Main Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -200
      ],
      "parameters": {
        "content": "## \ud83e\udd16 AI Meeting Task Manager\n\n**What this workflow does:**\nAutomatically extracts action items from Google Meet notes and creates tasks in GoHighLevel CRM, then emails you a beautiful summary.\n\n**How it works:**\n1. \ud83d\udcc5 Runs daily to scan your meeting records folder\n2. \ud83d\udcc1 Organizes files into Recordings, Notes, and Chat folders\n3. \ud83d\udd0d Extracts content from Google Docs meeting notes\n4. \ud83e\udd16 AI Agent identifies action items and creates CRM tasks\n5. \ud83d\udce7 Sends you an HTML email summary\n\n**Setup Required:**\n- Google Drive OAuth credentials\n- Google Docs OAuth credentials\n- GoHighLevel OAuth credentials\n- Gmail OAuth credentials\n- OpenAI API credentials\n\n**Customize:**\n- Update folder URLs in Google Drive nodes\n- Set your email in the Gmail tool\n- Set your GoHighLevel user ID for task assignment"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-file-org",
      "name": "\ud83d\udcc1 File Organization Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -250
      ],
      "parameters": {
        "content": "## \ud83d\udcc1 File Organization\n\nThis section scans your Google Meet recordings folder and sorts files:\n- **Recordings** \u2192 Recordings folder\n- **Notes by Gemini** \u2192 Notes folder  \n- **Chat logs** \u2192 Chat folder\n\n\u2699\ufe0f **Setup:** Replace the folder URLs with your own Google Drive folders"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-ai-section",
      "name": "\ud83e\udd16 AI Task Extraction Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2400,
        -100
      ],
      "parameters": {
        "content": "## \ud83e\udd16 AI Task Extraction\n\nThe Organization Agent:\n1. Reads meeting notes\n2. Finds the contact in GoHighLevel\n3. Creates tasks with proper due dates\n\n\u2699\ufe0f **Customize:** Update the system prompt to match your task naming conventions"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-email-section",
      "name": "\ud83d\udce7 Email Summary Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3300,
        -250
      ],
      "parameters": {
        "content": "## \ud83d\udce7 Email Summary\n\nSends a beautifully formatted HTML email with:\n- Meeting count processed\n- Tasks created per contact\n- Due dates\n- Status of operations\n\n\u2699\ufe0f **Setup:** Change the email address in the Gmail tool"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "GET NOTES": {
      "main": [
        [
          {
            "node": "EXTRACT DATE AND CONTENT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PREP DATA": {
      "main": [
        [
          {
            "node": "ORGANIZATION AGENT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "COMBINE ALL": {
      "main": [
        [
          {
            "node": "FILTER FOR NOTES",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "ORGANIZATION AGENT",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory1": {
      "ai_memory": [
        [
          {
            "node": "SUMMARIZATION AGENT",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "COMBINE OUTPUTS": {
      "main": [
        [
          {
            "node": "SUMMARIZATION AGENT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FILTER FOR NOTES": {
      "main": [
        [
          {
            "node": "SUMMARIZE AND CREATE TASK LIST",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ROUTE FILE TYPES": {
      "main": [
        [
          {
            "node": "MOVE RECORDINGS TO RECORDINGS FOLDER",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "MOVE NOTES TO NOTES FOLDER",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "MOVE CHAT TO CHAT FOLDER",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "ORGANIZATION AGENT",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "SEND EMAIL TO LEO": {
      "ai_tool": [
        [
          {
            "node": "SUMMARIZATION AGENT",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "ORGANIZATION AGENT": {
      "main": [
        [
          {
            "node": "SUMMARIZE AND CREATE TASK LIST",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "SUMMARIZATION AGENT",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "CREATE TASKS IN GHL": {
      "ai_tool": [
        [
          {
            "node": "ORGANIZATION AGENT",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "FIND CONTACT IN GHL": {
      "ai_tool": [
        [
          {
            "node": "ORGANIZATION AGENT",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "EXTRACT DATE AND CONTENT": {
      "main": [
        [
          {
            "node": "PREP DATA",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MOVE CHAT TO CHAT FOLDER": {
      "main": [
        [
          {
            "node": "COMBINE ALL",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "DAILY ORGANIZATION TRIGGER": {
      "main": [
        [
          {
            "node": "FIND MEETING RECORD FOLDER",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FIND MEETING RECORD FOLDER": {
      "main": [
        [
          {
            "node": "SPLIT OUT NOTES, CHAT, RECORDINGS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MOVE NOTES TO NOTES FOLDER": {
      "main": [
        [
          {
            "node": "COMBINE ALL",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "SUMMARIZE AND CREATE TASK LIST": {
      "main": [
        [
          {
            "node": "COMBINE OUTPUTS",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "GET NOTES",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SPLIT OUT NOTES, CHAT, RECORDINGS": {
      "main": [
        [
          {
            "node": "ROUTE FILE TYPES",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MOVE RECORDINGS TO RECORDINGS FOLDER": {
      "main": [
        [
          {
            "node": "COMBINE ALL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}