This workflow corresponds to n8n.io template #5904 — we link there as the canonical source.
This workflow follows the Chainllm → 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 →
{
"id": "5N46vB5yT6jTsXHH",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Google Meet Automation",
"tags": [],
"nodes": [
{
"id": "webhook-trigger",
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
112,
320
],
"parameters": {
"path": "google-meet-automation",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "error-response",
"name": "Error Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
560,
416
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"status\": \"error\",\n \"message\": \"Missing required fields: meetingNotes and meetingTitle\",\n \"timestamp\": \"{{ $now.toISO() }}\"\n}"
},
"typeVersion": 1.4
},
{
"id": "extract-data",
"name": "Extract Meeting Data",
"type": "n8n-nodes-base.set",
"position": [
560,
224
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "meeting-notes",
"name": "meetingNotes",
"type": "string",
"value": "={{ $json.body.meetingNotes }}"
},
{
"id": "meeting-title",
"name": "meetingTitle",
"type": "string",
"value": "={{ $json.body.meetingTitle }}"
},
{
"id": "meeting-date",
"name": "meetingDate",
"type": "string",
"value": "={{ $json.body.meetingDate || $now.toISO() }}"
},
{
"id": "attendees",
"name": "attendees",
"type": "array",
"value": "={{ $json.body.attendees || [] }}"
},
{
"id": "meeting-duration",
"name": "duration",
"type": "string",
"value": "={{ $json.body.duration || '60 minutes' }}"
}
],
"assignments[0]": {
"value": "={{ $json.meetingNotes }}"
},
"assignments[1]": {
"value": "={{ $json.meetingTitle }}"
},
"assignments[2]": {
"value": "={{ $json.meetingDate || $now.toISO() }}"
},
"assignments[3]": {
"value": "={{ $json.attendees || [] }}"
},
"assignments[4]": {
"value": "={{ $json.duration || '60 minutes' }}"
}
}
},
"typeVersion": 3.4
},
{
"id": "gemini-model",
"name": "Google Gemini AI",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
816,
448
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "ai-processor",
"name": "AI Meeting Processor",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
784,
224
],
"parameters": {
"text": "=You are an AI assistant that analyzes Google Meet notes to extract actionable insights.\n\nMEETING DETAILS:\nTitle: {{ $json.meetingTitle }}\nDate: {{ $json.meetingDate }}\nDuration: {{ $json.duration }}\nAttendees: {{ $json.attendees.join(', ') }}\n\nMEETING NOTES:\n{{ $json.meetingNotes }}\n\n=== INSTRUCTIONS ===\nPlease analyze the meeting notes and extract the following information in JSON format:\n\n1. ACTION_ITEMS: Array of tasks with assignee, description, due_date, and priority\n2. KEY_DECISIONS: Array of important decisions made\n3. SUMMARY: Brief meeting summary (2-3 sentences)\n4. FOLLOW_UP_EMAILS: Array of follow-up emails to send with recipient, subject, and content\n5. NEXT_MEETING: Information about next meeting if mentioned\n6. IMPORTANT_DATES: Any dates or deadlines mentioned\n\nReturn ONLY valid JSON with this structure:\n{\n \"action_items\": [\n {\n \"assignee\": \"person@email.com\",\n \"description\": \"Task description\",\n \"due_date\": \"2025-01-15\",\n \"priority\": \"high|medium|low\"\n }\n ],\n \"key_decisions\": [\"Decision 1\", \"Decision 2\"],\n \"summary\": \"Meeting summary here\",\n \"follow_up_emails\": [\n {\n \"recipient\": \"person@email.com\",\n \"subject\": \"Email subject\",\n \"content\": \"Email content\"\n }\n ],\n \"next_meeting\": {\n \"date\": \"2025-01-20\",\n \"time\": \"10:00 AM\",\n \"topic\": \"Follow-up discussion\"\n },\n \"important_dates\": [\n {\n \"date\": \"2025-01-15\",\n \"description\": \"Project deadline\"\n }\n ]\n}",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "split-action-items",
"name": "Split Action Items",
"type": "n8n-nodes-base.splitOut",
"position": [
1184,
32
],
"parameters": {
"options": {},
"fieldToSplitOut": "action_items"
},
"typeVersion": 1
},
{
"id": "create-tasks",
"name": "Create Google Tasks",
"type": "n8n-nodes-base.googleTasks",
"position": [
1408,
32
],
"parameters": {
"task": "My Tasks",
"title": "={{ $json.description }}",
"additionalFields": {
"notes": "=Meeting: {{ $('Extract Meeting Data').item.json.meetingTitle }}\nAssignee: {{ $json.assignee }}\nPriority: {{ $json.priority }}\nDue Date: {{ $json.due_date }}\n\nCreated from Google Meet automation on {{ $now.toFormat('yyyy-MM-dd HH:mm') }}"
}
},
"credentials": {
"googleTasksOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "split-emails",
"name": "Split Follow-up Emails",
"type": "n8n-nodes-base.splitOut",
"position": [
1184,
224
],
"parameters": {
"options": {},
"fieldToSplitOut": "follow_up_emails"
},
"typeVersion": 1
},
{
"id": "send-emails",
"name": "Send Follow-up Emails",
"type": "n8n-nodes-base.gmail",
"position": [
1408,
224
],
"parameters": {
"sendTo": "={{ $json.recipient }}",
"message": "=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;\">\n <h2 style=\"color: #2563eb;\">{{ $json.subject }}</h2>\n \n <div style=\"background: #f8fafc; padding: 20px; border-radius: 8px; margin: 20px 0;\">\n <h3 style=\"margin-top: 0; color: #374151;\">Meeting Summary</h3>\n <p><strong>Meeting:</strong> {{ $('Extract Meeting Data').item.json.meetingTitle }}</p>\n <p><strong>Date:</strong> {{ $('Extract Meeting Data').item.json.meetingDate }}</p>\n <p><strong>Duration:</strong> {{ $('Extract Meeting Data').item.json.duration }}</p>\n </div>\n \n <div style=\"margin: 20px 0;\">\n {{ $json.content }}\n </div>\n \n <hr style=\"border: none; border-top: 1px solid #e5e7eb; margin: 30px 0;\">\n \n <p style=\"color: #6b7280; font-size: 14px;\">\n This email was automatically generated from your Google Meet notes.<br>\n Generated on {{ $now.toFormat('MMMM dd, yyyy \\at HH:mm') }}\n </p>\n</div>",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "create-summary-doc",
"name": "Create Meeting Summary Document",
"type": "n8n-nodes-base.googleDocs",
"position": [
1408,
416
],
"parameters": {
"title": "=('Meeting Summary - ' + $('Extract Meeting Data').item.json.meetingTitle + ' - ' + $now.toFormat('yyyy-MM-dd'))",
"folderId": "default"
},
"credentials": {
"googleDocsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "final-response",
"name": "Success Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1856,
128
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.4
},
{
"id": "cedd4268-e3b3-4b1c-bfe3-02c7f099cb83",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
336,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0df05311-3c5d-4f7c-915e-f8e66171d6cc",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.body.meetingTitle }}",
"rightValue": ""
},
{
"id": "d6ccea8b-afd0-4955-8b37-2d44e3ea3648",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.body.meetingNotes }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "ede05363-8a89-4706-a74b-63e8d39886d4",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
944,
448
],
"parameters": {
"jsonSchemaExample": "{\n \"action_items\": [\n {\n \"assignee\": \"user@example.com\",\n \"description\": \"Task description\",\n \"due_date\": \"2025-01-15\",\n \"priority\": \"high|medium|low\"\n }\n ],\n \"key_decisions\": [\"Decision 1\", \"Decision 2\"],\n \"summary\": \"Meeting summary here\",\n \"follow_up_emails\": [\n {\n \"recipient\": \"user@example.com\",\n \"subject\": \"Email subject\",\n \"content\": \"Email content\"\n }\n ],\n \"next_meeting\": {\n \"date\": \"2025-01-20\",\n \"time\": \"10:00 AM\",\n \"topic\": \"Follow-up discussion\"\n },\n \"important_dates\": [\n {\n \"date\": \"2025-01-15\",\n \"description\": \"Project deadline\"\n }\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "11bcb195-3a58-4cd1-8a0d-e69cc954847a",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1632,
112
],
"parameters": {
"numberInputs": 3
},
"typeVersion": 3.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "adcb521c-7b87-4c7d-b443-94ffb124ee23",
"connections": {
"If": {
"main": [
[
{
"node": "Extract Meeting Data",
"type": "main",
"index": 0
}
],
[
{
"node": "Error Response",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Success Response",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini AI": {
"ai_languageModel": [
[
{
"node": "AI Meeting Processor",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Split Action Items": {
"main": [
[
{
"node": "Create Google Tasks",
"type": "main",
"index": 0
}
]
]
},
"Create Google Tasks": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"AI Meeting Processor": {
"main": [
[
{
"node": "Split Action Items",
"type": "main",
"index": 0
},
{
"node": "Split Follow-up Emails",
"type": "main",
"index": 0
},
{
"node": "Create Meeting Summary Document",
"type": "main",
"index": 0
}
]
]
},
"Extract Meeting Data": {
"main": [
[
{
"node": "AI Meeting Processor",
"type": "main",
"index": 0
}
]
]
},
"Send Follow-up Emails": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Split Follow-up Emails": {
"main": [
[
{
"node": "Send Follow-up Emails",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Meeting Processor",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Create Meeting Summary Document": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
}
}
}
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.
gmailOAuth2googleDocsOAuth2ApigooglePalmApigoogleTasksOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Source: https://n8n.io/workflows/5904/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.
This workflow is designed for researchers, marketing teams, customer success managers, and survey analysts who want to automatically generate AI-powered summaries of form responses collected via Jotfo
ANIS_HUB 1. Uses gmail, googleDrive, googleSheets, httpRequest. Webhook trigger; 89 nodes.
Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses outputParserStructured, chainLlm, googleDrive, stickyNote. Webhook trigger; 67 nodes.
Candidate Engagement | Resume Screening | AI Voice Interviews | Applicant Insights