AutomationFlowsAI & RAG › Automate Meeting Summaries & Action Items with Google Meet, Assemblyai &…

Automate Meeting Summaries & Action Items with Google Meet, Assemblyai &…

Original n8n title: Automate Meeting Summaries & Action Items with Google Meet, Assemblyai & Claude AI

ByDominic GS @dominicgs on n8n.io

The Google Meet AI Assistant workflow provides intelligent meeting analysis by integrating Google Calendar, Google Drive, AssemblyAI transcription, Anthropic Claude AI, Slack, and Notion. It automates the complete process of fetching meeting data, retrieving recordings,…

Event trigger★★★★☆ complexityAI-powered25 nodesGoogle CalendarGoogle DriveStop And ErrorHTTP RequestAnthropic ChatAgentSlackNotion
AI & RAG Trigger: Event Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Google Calendar 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": "HwyNECzMAzk3eVUe",
  "name": "Google Meet AI Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "be749770-d9c1-4707-8c05-58207dd4c75f",
      "name": "whenClickingTestWorkflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        96,
        192
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "dae33e76-da7b-43ba-905d-af14763b5db6",
      "name": "getRecentMeetings",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        320,
        192
      ],
      "parameters": {
        "limit": 10,
        "options": {
          "timeMax": "={{ $now.toISO() }}",
          "timeMin": "={{ $now.minus({ hours: 24 }).toISO() }}"
        },
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "907a8f8d-f947-44fd-a262-e5aa7d9d4191",
      "name": "filterGoogleMeetEvents",
      "type": "n8n-nodes-base.filter",
      "position": [
        528,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "object",
                "operation": "exists"
              },
              "leftValue": "={{ $json.conferenceData }}",
              "rightValue": ""
            },
            {
              "id": "condition2",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.conferenceData.conferenceSolution.name }}",
              "rightValue": "Google Meet"
            },
            {
              "id": "condition3",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "confirmed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "39cb30a1-cf8e-467c-bd54-7b440664753f",
      "name": "extractMeetingData",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assign1",
              "name": "meetingId",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "assign2",
              "name": "meetingTitle",
              "type": "string",
              "value": "={{ $json.summary }}"
            },
            {
              "id": "assign3",
              "name": "meetingStart",
              "type": "string",
              "value": "={{ $json.start.dateTime }}"
            },
            {
              "id": "assign4",
              "name": "participants",
              "type": "string",
              "value": "={{ $json.attendees ? $json.attendees.map(a => a.email).join(', ') : 'No attendees' }}"
            },
            {
              "id": "assign5",
              "name": "recordingUrl",
              "type": "string",
              "value": "={{ $json.conferenceData?.entryPoints?.[0]?.uri || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e6e628bf-774a-4575-aeb9-44f95f352205",
      "name": "findRecordingInDrive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        928,
        192
      ],
      "parameters": {
        "operation": "search"
      },
      "typeVersion": 3
    },
    {
      "id": "7bef5275-9b55-4096-bbf2-e9571bd3f3c2",
      "name": "hasRecording",
      "type": "n8n-nodes-base.if",
      "position": [
        1120,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "cond1",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "e678555f-ab47-4c90-89be-003425443df8",
      "name": "noRecordingError",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1344,
        384
      ],
      "parameters": {
        "errorMessage": "No recording found for this meeting. Please ensure the meeting was recorded and saved to Google Drive."
      },
      "typeVersion": 1
    },
    {
      "id": "64882cca-e12d-4ee7-a921-5998e61a2b82",
      "name": "downloadRecording",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1344,
        192
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "googleFileConversion": {}
        },
        "operation": "download"
      },
      "typeVersion": 3
    },
    {
      "id": "c58ac16d-cdfd-45b4-ae7b-2f56edb967d9",
      "name": "uploadToAssemblyAI",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1568,
        192
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "05301b4a-8de3-4cd1-902e-e1f39a75f7c1",
      "name": "requestTranscription",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1760,
        192
      ],
      "parameters": {
        "url": "https://api.assemblyai.com/v2/transcript",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"audio_url\": \"{{ $json.upload_url }}\",\n  \"speaker_labels\": true,\n  \"auto_highlights\": true,\n  \"sentiment_analysis\": true\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "378e9268-d441-49c1-84db-62116d6d70bc",
      "name": "pollTranscriptionStatus",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1952,
        192
      ],
      "parameters": {
        "url": "=https://api.assemblyai.com/v2/transcript/{{ $json.id }}",
        "options": {
          "timeout": 300000
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ca5eee30-718e-43d5-be40-a02b12d2e26d",
      "name": "formatTranscript",
      "type": "n8n-nodes-base.set",
      "position": [
        2128,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assign1",
              "name": "transcript",
              "type": "string",
              "value": "={{ $json.text }}"
            },
            {
              "id": "assign2",
              "name": "speakers",
              "type": "string",
              "value": "={{ $json.utterances ? $json.utterances.map(u => `Speaker ${u.speaker}: ${u.text}`).join('\\n') : $json.text }}"
            },
            {
              "id": "assign3",
              "name": "highlights",
              "type": "string",
              "value": "={{ $json.auto_highlights_result ? $json.auto_highlights_result.results.map(h => h.text).join(', ') : '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "78024c86-9c1a-451d-9305-2f59498a095d",
      "name": "claudeChatModel",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        2384,
        400
      ],
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "36b8070d-686d-4cac-935a-661e6b2ce4e4",
      "name": "analyzeMeetingWithAI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2352,
        192
      ],
      "parameters": {
        "text": "=## Meeting Analysis Task\n\nYou are an AI meeting assistant analyzing a Google Meet recording.\n\n### Meeting Details:\n- **Title**: {{ $('extractMeetingData').item.json.meetingTitle }}\n- **Date**: {{ $('extractMeetingData').item.json.meetingStart }}\n- **Participants**: {{ $('extractMeetingData').item.json.participants }}\n\n### Transcript:\n{{ $json.speakers }}\n\n### Your Tasks:\n1. Create a concise meeting summary (2-3 paragraphs)\n2. Extract all action items with responsible parties\n3. Identify any mentioned dates or deadlines\n4. Determine overall meeting sentiment\n\nFormat your response as:\n\n**Meeting Summary:**\n[Summary here]\n\n**Action Items:**\n- [Item] (Assigned to: [Person], Due: [Date])\n\n**Key Dates:**\n- [Date]: [Context]\n\n**Sentiment:** [Positive/Neutral/Negative]",
        "agent": "conversationalAgent",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "b05f988b-a06b-47a4-a301-e5416755cd4a",
      "name": "parseAIOutput",
      "type": "n8n-nodes-base.code",
      "position": [
        2656,
        192
      ],
      "parameters": {
        "jsCode": "const input = $input.first().json.output;\nconst meetingData = $('extractMeetingData').first().json;\n\n// Parse the AI output to extract structured data\nconst sections = input.split('**');\nlet summary = '';\nlet actionItems = [];\nlet keyDates = [];\nlet sentiment = 'Neutral';\n\nfor (let i = 0; i < sections.length; i++) {\n  if (sections[i].includes('Meeting Summary:')) {\n    summary = sections[i + 1].trim();\n  }\n  if (sections[i].includes('Action Items:')) {\n    const items = sections[i + 1].trim().split('\\n').filter(line => line.startsWith('-'));\n    actionItems = items.map(item => {\n      const match = item.match(/- (.+?) \\(Assigned to: (.+?), Due: (.+?)\\)/);\n      if (match) {\n        return {\n          task: match[1],\n          assignee: match[2],\n          dueDate: match[3]\n        };\n      }\n      return { task: item.replace('- ', ''), assignee: 'Unassigned', dueDate: 'No date' };\n    });\n  }\n  if (sections[i].includes('Key Dates:')) {\n    const dates = sections[i + 1].trim().split('\\n').filter(line => line.startsWith('-'));\n    keyDates = dates.map(d => d.replace('- ', ''));\n  }\n  if (sections[i].includes('Sentiment:')) {\n    sentiment = sections[i + 1].trim();\n  }\n}\n\nreturn {\n  json: {\n    meetingTitle: meetingData.meetingTitle,\n    meetingDate: meetingData.meetingStart,\n    participants: meetingData.participants,\n    summary: summary,\n    actionItems: actionItems,\n    keyDates: keyDates,\n    sentiment: sentiment,\n    rawOutput: input\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "770cdc0c-c73e-461e-ace1-55ac5f95ad9f",
      "name": "postToSlack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2912,
        0
      ],
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "CHANNEL_ID",
          "cachedResultName": "general"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "b64a05d1-8d9d-4f33-b568-a3de7bfd582c",
      "name": "splitActionItems",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        3152,
        176
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1,
      "fieldToSplitOut": "actionItems"
    },
    {
      "id": "c7b881cd-6e8c-4ec2-8ced-7175218f003a",
      "name": "hasActionItems",
      "type": "n8n-nodes-base.if",
      "position": [
        2912,
        192
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "cond1",
              "operator": {
                "type": "array",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.actionItems }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "99e2b222-dd3d-4583-ab9a-880a564c01fb",
      "name": "createNotionTask",
      "type": "n8n-nodes-base.notion",
      "position": [
        3344,
        176
      ],
      "parameters": {
        "title": "={{ $json.task }}",
        "pageId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "options": {}
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "393d7712-467d-4886-9bb9-05cded6ac745",
      "name": "stickyNoteOverview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        -224
      ],
      "parameters": {
        "color": 6,
        "width": 700,
        "height": 636,
        "content": "## \ud83c\udfaf Workflow Overview\n\n### Google Meet AI Assistant\n\nThis workflow provides intelligent meeting analysis using:\n\n**Data Sources:**\n- Google Calendar (meeting data)\n- Google Drive (recordings)\n- AssemblyAI (transcription)\n\n**AI Analysis:**\n- Anthropic Claude for summarization\n- Action item extraction\n- Sentiment analysis\n\n**Outputs:**\n- Slack notifications\n- Notion task creation\n- Structured meeting insights\n\n\n**Further help**\n\nFor any questions or support, please contact:\nLinkedIn: https://www.linkedin.com/in/dominicsaraum/"
      },
      "typeVersion": 1
    },
    {
      "id": "c5203d08-2866-4955-a86e-01e22e6efba3",
      "name": "stickyNoteStep1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        0
      ],
      "parameters": {
        "width": 596,
        "height": 416,
        "content": "## \ud83d\udce5 Step 1: Fetch Meetings\n\nRetrieves Google Calendar events from the last 24 hours and filters for confirmed Google Meet events."
      },
      "typeVersion": 1
    },
    {
      "id": "754ded78-9eca-477a-8268-7b2c170738f7",
      "name": "stickyNoteStep2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        0
      ],
      "parameters": {
        "width": 600,
        "height": 564,
        "content": "## \ud83c\udfa5 Step 2: Get Recording\n\nSearches Google Drive for the meeting recording and downloads it for transcription."
      },
      "typeVersion": 1
    },
    {
      "id": "67c148a4-e36c-4396-97f1-b15f1fde0834",
      "name": "stickyNoteStep3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        0
      ],
      "parameters": {
        "width": 756,
        "height": 452,
        "content": "## \ud83c\udfa4 Step 3: Transcribe\n\nUses AssemblyAI to transcribe the recording with speaker labels, highlights, and sentiment analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "0c7752e4-573b-4d69-a24f-a426d95ae608",
      "name": "stickyNoteStep4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2304,
        0
      ],
      "parameters": {
        "width": 516,
        "height": 548,
        "content": "## \ud83e\udd16 Step 4: AI Analysis\n\nClaude analyzes the transcript to extract summary, action items, key dates, and sentiment."
      },
      "typeVersion": 1
    },
    {
      "id": "83adb253-08e9-4533-8bca-5a8d16be3744",
      "name": "stickyNoteStep5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2848,
        -128
      ],
      "parameters": {
        "width": 692,
        "height": 564,
        "content": "## \ud83d\udce4 Step 5: Distribute\n\nPosts summary to Slack and creates tasks in Notion for all action items."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "dd8606ee-6368-46ef-a222-b74ec8d367e3",
  "connections": {
    "hasRecording": {
      "main": [
        [
          {
            "node": "downloadRecording",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "noRecordingError",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parseAIOutput": {
      "main": [
        [
          {
            "node": "postToSlack",
            "type": "main",
            "index": 0
          },
          {
            "node": "hasActionItems",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "hasActionItems": {
      "main": [
        [
          {
            "node": "splitActionItems",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "claudeChatModel": {
      "ai_languageModel": [
        [
          {
            "node": "analyzeMeetingWithAI",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "formatTranscript": {
      "main": [
        [
          {
            "node": "analyzeMeetingWithAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "splitActionItems": {
      "main": [
        [
          {
            "node": "createNotionTask",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "downloadRecording": {
      "main": [
        [
          {
            "node": "uploadToAssemblyAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "getRecentMeetings": {
      "main": [
        [
          {
            "node": "filterGoogleMeetEvents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "extractMeetingData": {
      "main": [
        [
          {
            "node": "findRecordingInDrive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "uploadToAssemblyAI": {
      "main": [
        [
          {
            "node": "requestTranscription",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "analyzeMeetingWithAI": {
      "main": [
        [
          {
            "node": "parseAIOutput",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "findRecordingInDrive": {
      "main": [
        [
          {
            "node": "hasRecording",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "requestTranscription": {
      "main": [
        [
          {
            "node": "pollTranscriptionStatus",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filterGoogleMeetEvents": {
      "main": [
        [
          {
            "node": "extractMeetingData",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "pollTranscriptionStatus": {
      "main": [
        [
          {
            "node": "formatTranscript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "whenClickingTestWorkflow": {
      "main": [
        [
          {
            "node": "getRecentMeetings",
            "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

The Google Meet AI Assistant workflow provides intelligent meeting analysis by integrating Google Calendar, Google Drive, AssemblyAI transcription, Anthropic Claude AI, Slack, and Notion. It automates the complete process of fetching meeting data, retrieving recordings,…

Source: https://n8n.io/workflows/9284/ — 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

Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.

Tool Think, Tool Calculator, Agent Tool +18
AI & RAG

This workflow automates Invoice & Payment Tracking (with Approvals) across Notion and Slack. Ingest — You drop invoices/receipts (PDF/IMG/JSON) into the flow. Extract — OCR + parsing pulls out key fie

HTTP Request, Chain Llm, Anthropic Chat +5
AI & RAG

🧾 An intelligent automation system that turns Google Meet recordings into structured meeting notes — integrating Fireflies.ai, OpenAI GPT-4.1-mini, Notion, Slack, Google Drive, and Gmail via n8n.

Google Drive, OpenAI Chat, Output Parser Structured +8
AI & RAG

AI Agent Workflow. Uses telegramTrigger, chatTrigger, telegram, openAi. Event-driven trigger; 82 nodes.

Telegram Trigger, Chat Trigger, Telegram +7
AI & RAG

This workflow is designed for marketers, content creators, agencies, and solo founders who want to publish long‑form posts with visuals on autopilot using n8n and AI agents. ​

Tool Http Request, Agent, HTTP Request +27