This workflow corresponds to n8n.io template #8116 — we link there as the canonical source.
This workflow follows the Agent → HTTP Request 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": "6nKbFj90W1K6L90c",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Meeting notes notification",
"tags": [],
"nodes": [
{
"id": "173f23e7-fbd7-4dd1-acbe-4784be565a22",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-464,
-288
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
},
{
"id": "98ee19dc-ccee-430a-8186-37337fa71619",
"name": "AI Transform",
"type": "n8n-nodes-base.aiTransform",
"position": [
656,
-288
],
"parameters": {
"jsCode": "const items = $input.all();\nconst today = new Date();\nconst oneWeekAgo = new Date();\noneWeekAgo.setDate(today.getDate() - 7);\n\nconst filteredItems = items.filter((item) => {\n const itemDate = new Date(item?.json?.formattedDate);\n return itemDate >= oneWeekAgo && itemDate <= today;\n});\n\nreturn filteredItems;\n",
"instructions": "Filter the formatted Date in the past week upto today",
"codeGeneratedForPrompt": "Filter the formatted Date in the past week upto today"
},
"typeVersion": 1
},
{
"id": "b08111fc-f718-4009-aed8-4746d204f801",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
888,
-64
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "6fac9ef2-7876-4f71-a4aa-32aed028bf49",
"name": "Send a message",
"type": "n8n-nodes-base.slack",
"position": [
1456,
-288
],
"parameters": {
"text": "test",
"select": "channel",
"blocksUi": "={{ '{ \"blocks\": ' + JSON.stringify($json.blocks) + ' }' }}",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09CV2VC877",
"cachedResultName": "meeting-notes"
},
"messageType": "block",
"otherOptions": {
"includeLinkToWorkflow": false
},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 2.3
},
{
"id": "fd642df4-da0e-43b7-b6bf-4cd9bb80f9d6",
"name": "summary",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
1016,
-64
],
"parameters": {
"url": "=https://api.meetgeek.ai/v1/meetings/{{ $json.extract_meeting_id }}/summary/",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "daf0670b-e2d7-446d-9d63-32952e99d55b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-312,
-432
],
"parameters": {
"width": 464,
"height": 304,
"content": "## Get meeting data from the note taker"
},
"typeVersion": 1
},
{
"id": "b6d8b4ef-1dbb-410a-a656-d6cb77e3cf64",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
392,
-480
],
"parameters": {
"width": 400,
"height": 352,
"content": "## Format the date and restructure the data\n**Filter the meeting data for the past seven days.**"
},
"typeVersion": 1
},
{
"id": "d5ceabf5-c4c4-4d40-8cd9-719537478abc",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
832,
-464
],
"parameters": {
"width": 320,
"height": 544,
"content": "## Extract summary and action items from the meeting notes\n**Using Gemini AI model summarize the meeting notes and list down the action items** "
},
"typeVersion": 1
},
{
"id": "2248164e-c74c-43cf-ba80-2c314969310b",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
880,
-288
],
"parameters": {
"text": "=# \ud83d\udcdd Meeting Notes Summarizer with Action Items\n\nYou are an AI assistant that **summarizes meeting notes** and **extracts clear action items**.\n\n---\n\n## \ud83d\udd39 Input Data\n- **meeting_id**: `{{ $json.extract_meeting_id }}`\n- **title**: `{{ $json.title }}`\n\n---\n\n## \ud83d\udd39 Task Instructions\n1. Call the **Meeting Note Summary API** using the **HTTP Request node**, passing `meeting_id` as a path parameter. \n2. For each API response, generate a summary for the corresponding meeting. \n3. Provide a **concise summary** in **3\u20135 bullet points**. \n4. Extract a structured **Action Items** list with:\n - **Task description** \n - **Responsible person** (if mentioned, otherwise `Unassigned`) \n - **Deadline** (if mentioned, otherwise `No deadline`) \n5. Ensure each meeting summary **includes the meeting title** (`{{ $json.title }}`). \n6. If the meeting notes are **empty or missing**, still return the JSON format but use:\n - `\"summary\": [\"No summary available\"]` \n - `\"action_items\": []` \n\n---\n\n## \ud83d\udd39 Output Format (JSON)\n```json\n{\n \"title\": \"{{ $json.title }}\",\n \"summary\": [\n \"point 1\",\n \"point 2\",\n \"point 3\"\n ],\n \"action_items\": [\n {\n \"task\": \"Task description\",\n \"owner\": \"Person name / Unassigned\",\n \"deadline\": \"Date / No deadline\"\n }\n ]\n}\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "f20b3135-24b3-4d49-bceb-1c10f32ac9bf",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1208,
-416
],
"parameters": {
"width": 368,
"height": 288,
"content": "## Set slack notification\n**Restructure the output from the AI agent and formatted it to slack block** "
},
"typeVersion": 1
},
{
"id": "4086c066-d09c-47f0-b19e-f8b56fcf0d8a",
"name": "Add custom name for meeting id",
"type": "n8n-nodes-base.set",
"position": [
208,
-288
],
"parameters": {
"include": "except",
"options": {},
"assignments": {
"assignments": [
{
"id": "f26be114-60b9-4017-ada9-db48cb79968a",
"name": "extract_meeting_id",
"type": "string",
"value": "={{ $json.meeting_id }}"
}
]
},
"excludeFields": "meeting_id",
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "06de46ec-90b5-48a7-95e8-52e1899a3d81",
"name": "Split meetings",
"type": "n8n-nodes-base.splitOut",
"position": [
-16,
-288
],
"parameters": {
"options": {},
"fieldToSplitOut": "=meetings"
},
"typeVersion": 1
},
{
"id": "46c0edee-9d49-4278-bf55-0244d6085290",
"name": "Get meetings list",
"type": "n8n-nodes-base.httpRequest",
"position": [
-240,
-288
],
"parameters": {
"url": "https://api.meetgeek.ai/v1/meetings/",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "e66baa91-7c07-4c23-93e0-cb2cea49ccd9",
"name": "Format date",
"type": "n8n-nodes-base.dateTime",
"position": [
432,
-288
],
"parameters": {
"date": "={{ $json.timestamp_start_utc }}",
"format": "yyyy-MM-dd",
"options": {
"includeInputFields": true
},
"operation": "formatDate"
},
"typeVersion": 2
},
{
"id": "3e1feb23-bf70-4e23-8ce2-ec0c752fe9f1",
"name": "Restructure to slack block",
"type": "n8n-nodes-base.code",
"position": [
1232,
-288
],
"parameters": {
"jsCode": "// Input: array of note-taker outputs\nconst notes = $input.all().map(item => item.json);\n\n// Slack blocks array\nlet blocks = [];\n\nnotes.forEach((note, index) => {\n // Clean and parse JSON inside code block\n const cleaned = note.output.replace(/```json|```/g, '').trim();\n let parsed;\n\n try {\n parsed = JSON.parse(cleaned);\n } catch (err) {\n parsed = { title: `Meeting ${index + 1}`, summary: [\"Could not parse notes\"], action_items: [] };\n }\n\n // Meeting header with title\n blocks.push({\n type: \"header\",\n text: {\n type: \"plain_text\",\n text: parsed.title || `Meeting ${index + 1}`\n }\n });\n\n // Summary section\n if (parsed.summary && parsed.summary.length > 0) {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: \"*Summary:*\\n\" + parsed.summary.map(s => `\u2022 ${s}`).join(\"\\n\")\n }\n });\n }\n\n // Action items section\n if (parsed.action_items && parsed.action_items.length > 0) {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: \"*Action Items:*\"\n }\n });\n\n parsed.action_items.forEach(item => {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `\u2022 *Task:* ${item.task || \"N/A\"}\\n *Owner:* ${item.owner || \"Unassigned\"}\\n *Deadline:* ${item.deadline || \"No deadline\"}`\n }\n });\n });\n } else {\n // If no action items\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: \"_No action items available_\"\n }\n });\n }\n\n // Divider\n blocks.push({ type: \"divider\" });\n});\n\nreturn { blocks };\n"
},
"executeOnce": true,
"typeVersion": 2
},
{
"id": "97e0f0e6-6745-4b45-a019-c89e76de9ec5",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-1008
],
"parameters": {
"width": 512,
"height": 544,
"content": "## \ud83d\udccc Meeting Notes Summarizer & Slack Notifier\n\n**What it does**\n- \u23f0 Reads meeting notes from your note-taking app using API calls \n- \ud83e\udd16 Summarizes key points and extracts action items with **Gemini AI** \n- \ud83d\uddc2\ufe0f Restructures the output into **Slack Block Kit** format \n- \ud83d\udd14 Sends daily Slack notifications with clear summaries and actionable tasks \n\n**Requirements**\n- API key & configuration for your meeting note-taking application \n- Gemini AI credentials \n- Slack channel with OAuth credentials \n\n**Setup Instructions**\n1. Configure the **note taker API** in the **Get Meetings List** and **Summary** nodes. \n - *Get Meetings List* \u2192 fetches the list of meetings \n - *Summary* \u2192 fetches the summary for each meeting \n2. Add your **Gemini AI credentials** to enable summarization. \n3. Configure **Slack** to send notifications to the desired channel. \n4. Activate the workflow \u2014 your team will start receiving automated meeting summaries and action items daily. \n\n**Tip:** You can further customize this workflow by adjusting the trigger schedule, modifying Slack message formatting, or changing the API URL in the HTTP Request node."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "bdd7ca4b-f73e-491e-b697-0e419879a2b8",
"connections": {
"summary": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Restructure to slack block",
"type": "main",
"index": 0
}
]
]
},
"Format date": {
"main": [
[
{
"node": "AI Transform",
"type": "main",
"index": 0
}
]
]
},
"AI Transform": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Split meetings": {
"main": [
[
{
"node": "Add custom name for meeting id",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Get meetings list",
"type": "main",
"index": 0
}
]
]
},
"Get meetings list": {
"main": [
[
{
"node": "Split meetings",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Restructure to slack block": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Add custom name for meeting id": {
"main": [
[
{
"node": "Format date",
"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.
googlePalmApihttpBearerAuthslackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Easily keep your team aligned by summarizing meeting notes, extracting action items, and delivering them directly to Slack. ⏰ Triggers on a schedule to fetch meeting data from your note-taking tool 📄 Retrieves meeting summaries and action items using the MeetGeek API 🤖 Uses…
Source: https://n8n.io/workflows/8116/ — 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.
Fully automated blog creation system using n8n + AI Agents + Image Generation
This workflow is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves
This n8n template transforms your daily meeting preparation by automatically researching attendees and generating comprehensive briefing documents. Every weekday morning, it analyzes your calendar eve
This workflow is designed for Japanese-speaking professionals, and learners who want to efficiently stay up to date with practical productivity, lifehack, and efficiency-related insights from Japanese