This workflow corresponds to n8n.io template #15340 — 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 →
{
"id": "9qZgMgOwa7OHsIuw",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Client Meeting Notes",
"tags": [],
"nodes": [
{
"id": "6d514387-7f59-4305-9453-882fcb530144",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3088,
-1024
],
"parameters": {
"width": 512,
"height": 1024,
"content": "# Client Meeting Notes \u2192 Action Items Automation\n# How It Works\n\nThis workflow automates the processing of meeting notes from Google Sheets by identifying and handling only unprocessed records. It prepares the notes and sends them to an AI model, which extracts key insights such as action items, follow-ups and risks in a structured format. The extracted data is then formatted for readability and stored in an output sheet for tracking.\n\nFinally, the workflow marks the original record as processed to avoid duplication and sends a summary email containing all extracted details to the user. This ensures efficient meeting follow-up, clear task tracking and quick communication without manual effort.\n\n# Setup Steps\n\n## 1. Connect Google Sheets\nAuthenticate input and output sheets\n\n## 2. Configure Processing Logic\nEnsure only unprocessed rows are handled\n\n## 3. Configure AI Model\nConnect OpenAI/Groq and set extraction prompt\n\n## 4. Configure Output Storage\nMap extracted fields to output sheet\n\n## 5. Set Email Notification\nAdd recipient and email format\n\n## 6. Test Workflow\nRun and verify extraction and email output"
},
"typeVersion": 1
},
{
"id": "1ebf108b-fd2a-4dfd-937d-7b7830deb750",
"name": "Groq Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
-1696,
-96
],
"parameters": {
"model": "openai/gpt-oss-120b",
"options": {}
},
"credentials": {
"groqApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "400e38b9-87f0-4eb2-831d-f544d0d28403",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2544,
-480
],
"parameters": {
"color": 7,
"width": 368,
"height": 416,
"content": "## Input & Data Fetch\n\nFetches meeting notes from Google Sheets and triggers the workflow. Ensures only unprocessed records are considered for automation."
},
"typeVersion": 1
},
{
"id": "db730d21-4c05-415d-b3f1-02b476344769",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2128,
-480
],
"parameters": {
"color": 7,
"width": 368,
"height": 336,
"content": "## Data Preparation\n\nPrepares and structures raw meeting notes and user details for AI processing, ensuring clean and usable input data."
},
"typeVersion": 1
},
{
"id": "f028228c-2975-4aa2-9eb1-9c32f0409344",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1728,
-480
],
"parameters": {
"color": 7,
"width": 560,
"height": 496,
"content": "## AI Processing, Extraction & Data Transformation\n\nUses AI to extract action items, follow-ups and risks from meeting notes in structured JSON format. The output is then parsed and formatted into readable text fields for storage and reporting."
},
"typeVersion": 1
},
{
"id": "8002a565-cf10-42bc-8c11-a29a84803fb8",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1120,
-448
],
"parameters": {
"color": 7,
"width": 688,
"height": 336,
"content": "## Data Storage & Notification\n\nStores extracted action items, follow-ups and risks in the output sheet, marks records as processed to avoid duplication and sends a summary email for quick review and follow-up actions."
},
"typeVersion": 1
},
{
"id": "1fca1aad-1095-44fc-b6cf-52e9fcae3298",
"name": "Starting Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-2496,
-304
],
"parameters": {},
"typeVersion": 1
},
{
"id": "cb240eec-2299-4c13-9dcd-b757bbb4c047",
"name": "Fetch Meeting Notes",
"type": "n8n-nodes-base.googleSheets",
"position": [
-2304,
-304
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=0",
"cachedResultName": "meeting notes"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
"cachedResultName": "n8n meeting notes automation"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "a2530370-f748-4e09-a78e-9f0f534a9e87",
"name": "Check Unprocessed Records",
"type": "n8n-nodes-base.if",
"position": [
-2096,
-304
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2583704c-e863-43d5-99f4-57a5231cb0f1",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json.Processed }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "15f87602-252f-4670-afcd-2e83fce04281",
"name": "Prepare Notes Data",
"type": "n8n-nodes-base.set",
"position": [
-1888,
-304
],
"parameters": {
"options": {
"dotNotation": true
},
"assignments": {
"assignments": [
{
"id": "2a0058b2-b273-475b-baee-d9e74dee303b",
"name": "raw_notes",
"type": "string",
"value": "={{$json[\"Notes\"]}}"
},
{
"id": "ea69d162-abd6-4908-a9ec-952d2d996e59",
"name": "user_name ",
"type": "string",
"value": "={{ $json.user }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "5a090d5f-21b6-4465-828b-0a7ee1386a64",
"name": "Extract Insights using AI",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1664,
-304
],
"parameters": {
"text": "=You are a meeting assistant.\n\nExtract:\n\n- Action Items\n- Follow-ups\n- Risks\n\nMeeting Notes:\n{{$json[\"raw_notes\"]}}\n\nIMPORTANT:\n- Return ONLY valid JSON\n- Do NOT add quotes around JSON\n- Do NOT add \\n or formatting\n- Do NOT add any explanation\n\nReturn exactly like this:\n\n{\n \"action_items\": [\"item1\", \"item2\"],\n \"follow_ups\": [\"item1\"],\n \"risks\": [\"item1\"]\n}",
"options": {},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "f7e93545-85ae-4b23-b46e-1d7d5860381d",
"name": "Format Extracted Data",
"type": "n8n-nodes-base.code",
"position": [
-1344,
-304
],
"parameters": {
"jsCode": "let output = $json.output;\n\n// If output is string \u2192 convert to JSON\nif (typeof output === \"string\") {\n output = JSON.parse(output);\n}\n\nreturn [{\n json: {\n ...$json,\n action_items: (output.action_items || []).join(\", \"),\n follow_ups: (output.follow_ups || []).join(\", \"),\n risks: (output.risks || []).join(\", \")\n }\n}];"
},
"typeVersion": 2
},
{
"id": "60e3605a-4377-41e9-a892-18851b8f3d6f",
"name": "Mark Record as Processed",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1088,
-304
],
"parameters": {
"columns": {
"value": {
"Processed": "Yes",
"row_number": "={{ $('Prepare Notes Data').item.json.row_number }}"
},
"schema": [
{
"id": "Notes",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Notes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "user",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "user",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Processed",
"type": "string",
"display": true,
"required": false,
"displayName": "Processed",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=0",
"cachedResultName": "meeting notes"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
"cachedResultName": "n8n meeting notes automation"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "22f15c86-3aed-445d-8d79-9c90de51737d",
"name": "Store Extracted Insights",
"type": "n8n-nodes-base.googleSheets",
"position": [
-864,
-304
],
"parameters": {
"columns": {
"value": {
"Risks": "={{ $('Format Extracted Data').item.json.risks }}",
"Folllow-ups": "={{ $('Format Extracted Data').item.json.follow_ups }}",
"Action items": "={{ $('Format Extracted Data').item.json.action_items }}"
},
"schema": [
{
"id": "Action items",
"type": "string",
"display": true,
"required": false,
"displayName": "Action items",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Folllow-ups",
"type": "string",
"display": true,
"required": false,
"displayName": "Folllow-ups",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risks",
"type": "string",
"display": true,
"required": false,
"displayName": "Risks",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 784492941,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit#gid=784492941",
"cachedResultName": "output"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Z9JlUPMr00U9k385p64yZbj4VKMDcQVd9AKa6FVXE60/edit?usp=drivesdk",
"cachedResultName": "n8n meeting notes automation"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "ef8b6492-635c-4f4a-95eb-5cd3316cfcfa",
"name": "Summary Email",
"type": "n8n-nodes-base.gmail",
"position": [
-640,
-304
],
"parameters": {
"message": "=Hi,\n\nHere is your meeting summary:\n\nAction Items:\n{{ $json['Action items'] }}\n\nFollow-ups:\n{{ $json['Folllow-ups'] }}\n\nRisks:\n{{ $json.Risks }}\n\nThanks,\n{{ $('Prepare Notes Data').item.json.user }}",
"options": {},
"subject": "Meeting Summary",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "f4b61a8f-19a6-43f6-beb6-c64faa9d4fff",
"connections": {
"Summary Email": {
"main": [
[]
]
},
"Groq Chat Model": {
"ai_languageModel": [
[
{
"node": "Extract Insights using AI",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Starting Trigger": {
"main": [
[
{
"node": "Fetch Meeting Notes",
"type": "main",
"index": 0
}
]
]
},
"Prepare Notes Data": {
"main": [
[
{
"node": "Extract Insights using AI",
"type": "main",
"index": 0
}
]
]
},
"Fetch Meeting Notes": {
"main": [
[
{
"node": "Check Unprocessed Records",
"type": "main",
"index": 0
}
]
]
},
"Format Extracted Data": {
"main": [
[
{
"node": "Mark Record as Processed",
"type": "main",
"index": 0
}
]
]
},
"Mark Record as Processed": {
"main": [
[
{
"node": "Store Extracted Insights",
"type": "main",
"index": 0
}
]
]
},
"Store Extracted Insights": {
"main": [
[
{
"node": "Summary Email",
"type": "main",
"index": 0
}
]
]
},
"Check Unprocessed Records": {
"main": [
[
{
"node": "Prepare Notes Data",
"type": "main",
"index": 0
}
],
[]
]
},
"Extract Insights using AI": {
"main": [
[
{
"node": "Format Extracted Data",
"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.
gmailOAuth2googleSheetsOAuth2ApigroqApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically processes meeting notes stored in Google Sheets, extracts key insights like action items, follow-ups and risks using AI and stores the results in an output sheet. It also sends a summary email and marks records as processed to avoid duplication. Login…
Source: https://n8n.io/workflows/15340/ — 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 automates your entire B2B outreach pipeline from lead discovery to personalized cold email delivery. Submit a form, let Apollo find and enrich your leads, review AI-generated emails
How It Works Trigger: The workflow starts automatically when a new file (PDF, DOCX, or TXT) is uploaded to a specific Google Drive folder for client briefs. Configuration: The workflow sets up key var
This workflow automates real estate investment analysis using Google Sheets and AI. It calculates ROI and rental yield, detects duplicate entries, generates AI-based recommendations and sends email re
This workflow automates the tracking of stock market sector rotation. It fetches a list of active stocks from Google Sheets, pulls their last 5 days of market data from Yahoo Finance and calculates mo
This automated n8n workflow evaluates the historical performance of gold against equity markets. It extracts daily price data from Google Sheets, calculates comparative returns and uses an AI agent to