This workflow corresponds to n8n.io template #9849 β we link there as the canonical source.
This workflow follows the Agent β Gmail recipe pattern β see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide β
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "fbe887ed-d018-457b-ab11-5ca446e517a4",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
96,
-128
],
"parameters": {
"path": "b9bbfae5-c81e-4897-8abe-5b4dd7c629df",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "fdad3e23-afed-478e-95c8-5cb4c73e57e6",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
768,
-128
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "raw_text"
}
]
}
},
"typeVersion": 1
},
{
"id": "bf500941-c25c-416a-af6a-4e319a2e0df8",
"name": "Create file from text",
"type": "n8n-nodes-base.googleDrive",
"position": [
96,
-352
],
"parameters": {
"name": "={{$now}}.txt",
"content": "={{ $('Aggregate').item.json.raw_text }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "11dIJvWSuqnNJ-spUwYsgBJZXWVD3M_9V",
"cachedResultUrl": "https://drive.google.com/drive/folders/11dIJvWSuqnNJ-spUwYsgBJZXWVD3M_9V",
"cachedResultName": "Transcripts"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "c82fac71-7390-43b0-8b6b-e143cbcb5012",
"name": "Share file",
"type": "n8n-nodes-base.googleDrive",
"position": [
320,
-352
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "share",
"permissionsUi": {
"permissionsValues": {
"role": "reader",
"type": "anyone"
}
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "18a7b91e-5094-4db9-b9a4-a4829e58c956",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
992,
96
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "09b4a23b-876a-4554-9e44-874ca56c55c2",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1312,
288
],
"parameters": {
"jsonSchemaExample": "{\n\"title\": \"...\",\n\"summary\": \"...\",\n\"decisions\": \"- Decision 1\\n- Decision 2\",\n\"action_items\": \"- Action 1\\n- Action 2\\n- Action 3\",\n\"risks\": \"- Risk 1\\n- Risk 2\",\n\"questions\": \"- Question 1\\n- Question 2\"\n}"
},
"typeVersion": 1.3
},
{
"id": "2c2a233b-5369-4e7a-bc83-1291c2dca525",
"name": "Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1024,
-128
],
"parameters": {
"text": "=You are given a transcript of a meeting. Extract and structure the output into a single JSON object. \n\nRules: \n- Output only one JSON object. \n- Do not use arrays. \n- For multiple items (decisions, action_items, risks, questions), join them into a single string separated by line breaks (\"\\n\"). \n- Each item must start with a dash and a space (\"- \") to make it a bullet list. \n- Required fields: title, summary, decisions, action_items, risks, questions. \n- title and summary = plain strings. \n- decisions, action_items, risks, questions = single strings with line breaks between items, each prefixed by \"- \". \n- Do not include any explanatory text outside of the JSON. \n\nFormat:\n{\n\"title\": \"...\",\n\"summary\": \"...\",\n\"decisions\": \"- Decision 1\\n- Decision 2\",\n\"action_items\": \"- Action 1\\n- Action 2\\n- Action 3\",\n\"risks\": \"- Risk 1\\n- Risk 2\",\n\"questions\": \"- Question 1\\n- Question 2\"\n}\n\nInput: {{ $('Aggregate').item.json.raw_text }}\n",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "4943665f-6531-4bc5-91c8-e06a8d4d8e07",
"name": "Drive Link",
"type": "n8n-nodes-base.set",
"position": [
544,
-352
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "b3e8727e-a919-4274-90fe-3f1569a396fa",
"name": "drive_link",
"type": "string",
"value": "=https://drive.google.com/file/d/{{ $('Create file from text').item.json.id }}/view\n"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "1fe34a67-f2f8-4dbc-80c0-6776c57e5731",
"name": "Notion Page",
"type": "n8n-nodes-base.notion",
"position": [
768,
-352
],
"parameters": {
"title": "={{ $('Agent').item.json.output.title }}",
"pageId": {
"__rl": true,
"mode": "url",
"value": "https://www.notion.so/Meeting-Notes-25d0bc030f3680d4887de58ac734569b"
},
"blockUi": {
"blockValues": [
{
"type": "heading_2",
"textContent": "\ud83d\udccbSummary "
},
{
"textContent": "={{ $('Agent').item.json.output.summary }}"
},
{
"type": "heading_2",
"textContent": "\u2705Decisions "
},
{
"textContent": "={{ $('Agent').item.json.output.decisions }}"
},
{
"type": "heading_2",
"textContent": "\ud83d\udcccAction Items"
},
{
"textContent": "={{ $('Agent').item.json.output.action_items }}"
},
{
"type": "heading_2",
"textContent": "\u26a0\ufe0fRisks"
},
{
"textContent": "={{ $('Agent').item.json.output.risks }}"
},
{
"type": "heading_2",
"textContent": "\u2753Questions"
},
{
"textContent": "={{ $('Agent').item.json.output.questions }}"
},
{
"textContent": "=Transcript Link: {{ $json.drive_link }}"
}
]
},
"options": {}
},
"credentials": {
"notionApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "31b0557c-521c-47f1-93b8-55ee2bee144f",
"name": "Generate Slack Message",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1056,
-352
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are given a structured meeting JSON (title, summary, decisions, action_items, risks, questions).\n\nTask: \nWrite a short, well-formatted Slack message for the #meeting-notes channel.\n\nRules: \n-Follow the format correctly\n-Use relvent emojis for Key Decisions points \n-do not add anything in notion and drive link it should be consistent no extra brackets \nExample 1:\n\ud83d\udcdd Sprint Review and Release Planning Meeting\nThe team reviewed last sprint's achievements including the client dashboard integration and QA completion on staging.\n\n\u2728 Key Decisions:\n\u2022 \ud83d\ude80 Release dashboard tomorrow at 2:00pm\n\u2022 \ud83d\udcca Analytics module release to follow in next sprint\n\n\ud83d\udd17 Notion: https://www.notion.so/Sprint-Review-and-Release-Planning-Meeting-25d0bc030f368127bfd2fa0bc5fa29a6\n\n\ud83d\udcc2 Drive: https://drive.google.com/file/d/1ypTXN47oqRFHKXK4G6lTjpRfFIQp3o3f/view\n\nActual Input\nTitle:{{ $('Agent').item.json.output.title }}\nSummary: {{ $('Agent').item.json.output.summary }}\nNotion Link:{{ $json.url }}\nDrive Link:{{ $('Drive Link').item.json.drive_link }}"
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "efdb1905-bbad-438f-a470-359adcba63b2",
"name": "Auto-fixing Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
"position": [
1120,
96
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "d230a94a-8b22-45b6-a51b-63f4f1441d87",
"name": "Get many events",
"type": "n8n-nodes-base.googleCalendar",
"position": [
320,
-576
],
"parameters": {
"limit": 1,
"options": {},
"timeMax": "={{ $now }}",
"timeMin": "={{ $now.minus(20, 'minute') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"operation": "getAll"
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "5f599b54-2ad5-4c1e-9009-dc563293ccaf",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
544,
-576
],
"parameters": {
"options": {},
"fieldToSplitOut": "attendees"
},
"typeVersion": 1
},
{
"id": "65109e8c-6e90-411e-9e98-56072ebf4ee1",
"name": "Send a message #meeting",
"type": "n8n-nodes-base.slack",
"position": [
96,
-576
],
"parameters": {
"text": "={{ $json.message.content }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09D8N1SFQQ",
"cachedResultName": "meeting"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "899dee6e-e233-4002-9fc7-b791c683aec8",
"name": "DMs to Attendees",
"type": "n8n-nodes-base.slack",
"onError": "continueRegularOutput",
"position": [
1216,
-576
],
"parameters": {
"text": "={{ $('Generate Slack Message').item.json.message.content }}",
"user": {
"__rl": true,
"mode": "id",
"value": "={{ $json.user.id }}"
},
"select": "user",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "7b82e37f-600b-45ae-a8a3-375a29aaeae3",
"name": "Email to Attendees",
"type": "n8n-nodes-base.gmail",
"position": [
768,
-576
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "={{ $('Generate Slack Message').item.json.message.content }}",
"options": {},
"subject": "=Meeting Recap: {{ $('Agent').item.json.output.title }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "0aed74dd-741d-4305-ab5e-c31e9eacbb04",
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
320,
-128
],
"parameters": {
"url": "https://api.fireflies.ai/graphql",
"method": "POST",
"options": {},
"jsonBody": "={\n \"query\": \"query Transcript($transcriptId: String!) { transcript(id: $transcriptId) { id title duration sentences { speaker_name text raw_text start_time end_time } speakers { id name } meeting_attendees { name displayName email } } }\",\n \"variables\": {\n \"transcriptId\": \"{{ $json.body.meetingId }}\"\n }\n}\n",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
},
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "97685c75-70d6-464c-903d-f7524cccbb3b",
"name": "Get Slack Username",
"type": "n8n-nodes-base.httpRequest",
"position": [
992,
-576
],
"parameters": {
"url": "=https://slack.com/api/users.lookupByEmail?email={{ $('Split Out').item.json.email }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d56f4326-5576-4ef9-bc2f-635d5034d20d",
"name": "Split Out2",
"type": "n8n-nodes-base.splitOut",
"position": [
544,
-128
],
"parameters": {
"options": {},
"fieldToSplitOut": "data.transcript.sentences"
},
"typeVersion": 1
},
{
"id": "04cc731a-d05d-40ae-9b00-253b52a4c6a6",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1136,
304
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "53fcbd21-51da-4db3-8589-fa505df6726a",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-624
],
"parameters": {
"width": 1600,
"height": 1056,
"content": ""
},
"typeVersion": 1
},
{
"id": "63ff360f-c2b4-4a69-ae95-67f1b5d537ff",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
80
],
"parameters": {
"color": 3,
"width": 928,
"height": 448,
"content": "# \u26a1 Google Meet Notes Generator & Distributor\u2014Setup\n## \ud83d\udee0 Tools & Credentials\n### \ud83e\udd16 Fireflies.ai API\nFetch Google Meet transcripts via webhook.\n### \ud83e\udde0 OpenAI API\nSummarize transcripts into: **title**, **summary**, **decisions**, **action_items**, **risks**, **questions**\n### \ud83d\udcd3 Notion API\nCreate structured Notion pages with meeting data.\n### \ud83d\udcac Slack OAuth / Bot Token\nPost summaries in `#meeting` and DM attendees.\n### \ud83d\uddc2 Google Drive OAuth2\nStore transcripts as text files and generate shareable links.\n### \u2709\ufe0f Gmail OAuth2\nSend email recaps to all attendees.\n\n"
},
"typeVersion": 1
}
],
"connections": {
"Agent": {
"main": [
[
{
"node": "Create file from text",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Get Transcript",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Agent",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Email to Attendees",
"type": "main",
"index": 0
}
]
]
},
"Drive Link": {
"main": [
[
{
"node": "Notion Page",
"type": "main",
"index": 0
}
]
]
},
"Share file": {
"main": [
[
{
"node": "Drive Link",
"type": "main",
"index": 0
}
]
]
},
"Split Out2": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Notion Page": {
"main": [
[
{
"node": "Generate Slack Message",
"type": "main",
"index": 0
}
]
]
},
"Get Transcript": {
"main": [
[
{
"node": "Split Out2",
"type": "main",
"index": 0
}
]
]
},
"Get many events": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Email to Attendees": {
"main": [
[
{
"node": "Get Slack Username",
"type": "main",
"index": 0
}
]
]
},
"Get Slack Username": {
"main": [
[
{
"node": "DMs to Attendees",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model2": {
"ai_languageModel": [
[
{
"node": "Auto-fixing Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Create file from text": {
"main": [
[
{
"node": "Share file",
"type": "main",
"index": 0
}
]
]
},
"Generate Slack Message": {
"main": [
[
{
"node": "Send a message #meeting",
"type": "main",
"index": 0
}
]
]
},
"Send a message #meeting": {
"main": [
[
{
"node": "Get many events",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Auto-fixing Output Parser",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Auto-fixing Output Parser": {
"ai_outputParser": [
[
{
"node": "Agent",
"type": "ai_outputParser",
"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.
gmailOAuth2googleCalendarOAuth2ApigoogleDriveOAuth2ApihttpBearerAuthhttpHeaderAuthnotionApiopenAiApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
π§Ύ 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.
Source: https://n8n.io/workflows/9849/ β 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.
This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La
This workflow automatically processes new free-trial / lead sign-ups in real time: Catches a webhook from any source (Webflow form, Intercom, custom agent, etc.) Filters out personal / disposable / .e
Public-facing professionals (developer advocates, founders, marketers, content creators) who get bombarded with LinkedIn messages that aren't actually for them - support requests when you're in market
π§Ύ Short Description
This workflow turns raw product inputs into a complete, launch-ready AI-generated social media campaign package. It accepts product details via webhook, sanitizes messy fields, generates a strategic c