This workflow corresponds to n8n.io template #16509 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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": "BvyNBINQRBycOuV4",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Meeting Intelligence Extractor \u2014 Transcript Form + ChatGPT AI + Google Sheets + ClickUp + Gmail",
"tags": [],
"nodes": [
{
"id": "9135c68f-7dab-46de-b96d-d0e595eec953",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1008,
-416
],
"parameters": {
"color": 4,
"width": 492,
"height": 1316,
"content": "## Meeting Intelligence Extractor \u2014 Transcript Form + ChatGPT AI + Google Sheets + ClickUp + Gmail\n\nFor teams who want every meeting turned into structured intelligence automatically \u2014 no manual note-taking or task creation. Paste a meeting transcript into the form and the ChatGPT AI model extracts an executive summary, key topics, all decisions with rationale, every action item with owner, due date and priority, identified risks, and a follow-up date. The meeting is logged to Google Sheets, one ClickUp task is created per action item, and a full HTML meeting brief is emailed to the team.\n\n## How it works\n- **1. Form \u2014 Paste Meeting Transcript** collects meeting title, date, participants, duration, and the full transcript\n- **2. Code \u2014 Validate and Prepare** checks the transcript is at least 100 characters, counts words and participants, and assigns a meeting ID\n- **3. AI Agent \u2014 Extract Meeting Intelligence** uses the ChatGPT AI model to return a strict JSON object with summary, topics, decisions, action items, risks, follow-up date, and sentiment\n- **OpenAI Chat Model** the language model attached to the AI Agent\n- **4. Code \u2014 Parse and Structure Intelligence** safely parses the JSON, guards against malformed output, and builds readable strings for the sheet and email\n- **5. Google Sheets \u2014 Log Meeting** appends the full meeting record (parallel branch)\n- **6. Split Out \u2014 One Action Item at a Time** expands the action items array into individual items (parallel branch)\n- **7. IF \u2014 Has Valid Action Item?** passes only items that contain a task\n- **8. ClickUp \u2014 Create Task per Action Item** creates one ClickUp task for each valid action item\n- **9. Gmail \u2014 Send Meeting Brief** emails the formatted HTML meeting brief to the team (parallel branch)\n\n## Set up steps\n1. In **OpenAI Chat Model** \u2014 connect your OpenAI API credential and pick any current ChatGPT model from the dropdown\n2. In **5. Google Sheets \u2014 Log Meeting** \u2014 connect Google Sheets OAuth2 and replace `YOUR_MEETING_LOG_SHEET_ID`. Create a tab named Meetings with the columns listed in the node\n3. In **8. ClickUp \u2014 Create Task per Action Item** \u2014 replace `YOUR_CLICKUP_API_KEY` (ClickUp \u2192 Settings \u2192 Apps \u2192 API Token) and `YOUR_CLICKUP_LIST_ID` (open a ClickUp list and copy the ID from its URL)\n4. In **9. Gmail \u2014 Send Meeting Brief** \u2014 connect Gmail OAuth2 and replace `YOUR_TEAM_EMAIL`\n5. Activate the workflow, open the Form URL, paste a transcript, and submit. The brief arrives by email within about 2 minutes"
},
"typeVersion": 1
},
{
"id": "e25c3e9e-b69d-40fa-932d-176e1190d30a",
"name": "Section \u2014 Transcript Input and Validation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-448,
-48
],
"parameters": {
"color": 5,
"width": 484,
"height": 356,
"content": "## Transcript Input and Validation\nForm collects the meeting title, date, participants, duration, and full transcript. Code validates a minimum transcript length and builds clean context for the AI."
},
"typeVersion": 1
},
{
"id": "b06ee9bd-916d-49c5-83a8-8e4852ebbb9e",
"name": "Section \u2014 AI Intelligence Extraction",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
-160
],
"parameters": {
"color": 6,
"width": 340,
"height": 660,
"content": "## AI Intelligence Extraction\nThe ChatGPT AI model reads the transcript and returns strict JSON with summary, key topics, decisions, action items with owner and due date, risks, and follow-up date."
},
"typeVersion": 1
},
{
"id": "05717b3b-abe6-4fcb-ba4f-ba265eb0f61b",
"name": "Section \u2014 Parse, Log, Create Tasks, and Email",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
-192
],
"parameters": {
"color": 4,
"width": 1092,
"height": 724,
"content": "## Parse, Log, Create Tasks, and Email\nCode parses the AI JSON. Three parallel branches run: Sheets logs the meeting, Split Out expands action items so ClickUp creates one task each, and Gmail sends the full meeting brief."
},
"typeVersion": 1
},
{
"id": "ab09a21e-42d6-442e-8280-d3f308360180",
"name": "1. Form \u2014 Paste Meeting Transcript",
"type": "n8n-nodes-base.formTrigger",
"position": [
-384,
128
],
"parameters": {
"options": {},
"formTitle": "Meeting Intelligence Extractor",
"formFields": {
"values": [
{
"fieldLabel": "Meeting Title",
"placeholder": "e.g. Q2 Product Planning, Client Kickoff Call, Weekly Standup",
"requiredField": true
},
{
"fieldLabel": "Meeting Date",
"placeholder": "e.g. 2025-06-15",
"requiredField": true
},
{
"fieldLabel": "Participants",
"placeholder": "Comma separated names \u2014 e.g. Rahul, Ankur, Priya, Client John",
"requiredField": true
},
{
"fieldLabel": "Duration (minutes)",
"placeholder": "e.g. 45"
},
{
"fieldType": "textarea",
"fieldLabel": "Meeting Transcript",
"placeholder": "Paste the full meeting transcript or notes here. More detail = better extraction. Minimum 100 characters required.",
"requiredField": true
}
]
},
"formDescription": "Paste your meeting transcript below. AI will extract all decisions, action items with owners and deadlines, risks, and generate a full meeting brief \u2014 emailed to your team within 2 minutes."
},
"typeVersion": 2.2
},
{
"id": "b8840ac6-8098-4705-93a5-7ccd4b210a36",
"name": "2. Code \u2014 Validate and Prepare",
"type": "n8n-nodes-base.code",
"position": [
-128,
128
],
"parameters": {
"jsCode": "const row = $json;\n\nconst title = (row['Meeting Title'] || '').trim();\nconst date = (row['Meeting Date'] || new Date().toISOString().split('T')[0]).trim();\nconst participants = (row['Participants'] || '').trim();\nconst duration = parseInt(row['Duration (minutes)']) || 0;\nconst transcript = (row['Meeting Transcript'] || '').trim();\n\nif (!title) throw new Error('Meeting Title is required.');\nif (transcript.length < 100) {\n throw new Error(\n 'Transcript is too short (' + transcript.length + ' characters). ' +\n 'Please paste at least 100 characters of meeting content for meaningful extraction.'\n );\n}\n\nconst wordCount = transcript.split(/\\s+/).filter(Boolean).length;\n\nconst participantList = participants.split(',').map(p => p.trim()).filter(Boolean);\nconst participantCount = participantList.length;\n\nreturn [{\n json: {\n title,\n date,\n participants,\n participantCount,\n duration,\n transcript,\n wordCount,\n meetingId: 'MTG-' + Date.now()\n }\n}];"
},
"typeVersion": 2
},
{
"id": "c828d62b-438c-4cbe-bc83-5913f69dc7b8",
"name": "3. AI Agent \u2014 Extract Meeting Intelligence",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
160,
128
],
"parameters": {
"text": "=Meeting Title: {{ $json.title }}\nDate: {{ $json.date }}\nParticipants: {{ $json.participants }}\nDuration: {{ $json.duration }} minutes\n\nTranscript:\n{{ $json.transcript }}",
"options": {
"systemMessage": "You are an expert meeting analyst. Read the meeting transcript carefully and extract all important information.\n\nReturn ONLY valid JSON \u2014 no markdown, no code fences, no explanation text.\n\nReturn this exact JSON structure:\n{\n \"summary\": \"<2 to 4 sentence executive summary of what the meeting was about and what was accomplished>\",\n \"keyTopics\": [\"<topic 1>\", \"<topic 2>\", \"<topic 3>\"],\n \"decisions\": [\n {\n \"decision\": \"<what was decided \u2014 be specific>\",\n \"rationale\": \"<brief reason why this was decided>\",\n \"decidedBy\": \"<name or role of who decided>\"\n }\n ],\n \"actionItems\": [\n {\n \"task\": \"<specific task description \u2014 actionable and clear>\",\n \"owner\": \"<person responsible \u2014 use name from participants if mentioned>\",\n \"dueDate\": \"<YYYY-MM-DD format if mentioned, otherwise null>\",\n \"priority\": \"<high or medium or low based on context>\"\n }\n ],\n \"risks\": [\"<risk or blocker 1 identified in the meeting>\", \"<risk 2>\"],\n \"followUpDate\": \"<YYYY-MM-DD if a next meeting was mentioned, otherwise null>\",\n \"sentiment\": \"<positive or neutral or concerned \u2014 overall tone of the meeting>\"\n}\n\nRules:\n- Extract EVERY action item mentioned \u2014 do not miss any\n- If no due date was mentioned for an action item, use null not a guess\n- Decisions must be actual decisions made, not just topics discussed\n- Risks are things that could block progress or cause problems\n- If a field has no data, return empty array or null \u2014 never omit the field\n- Return ONLY the JSON object \u2014 nothing else"
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "cf2773ff-838b-450e-96ce-66e04124307f",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
160,
352
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "6aab96bc-97fd-4c98-9dd2-8880df609391",
"name": "4. Code \u2014 Parse and Structure Intelligence",
"type": "n8n-nodes-base.code",
"position": [
592,
128
],
"parameters": {
"jsCode": "const raw = $input.first().json.output || '';\nconst meta = $('2. Code \u2014 Validate and Prepare').first().json;\nconst procAt = new Date().toISOString();\n\nlet intel = {};\ntry {\n const cleaned = raw.trim()\n .replace(/^```json\\s*/i, '')\n .replace(/^```\\s*/i, '')\n .replace(/```$/i, '')\n .trim();\n intel = JSON.parse(cleaned);\n} catch (e) {\n intel = {\n summary: 'AI extraction failed \u2014 raw output: ' + raw.substring(0, 200),\n keyTopics: [],\n decisions: [],\n actionItems: [],\n risks: [],\n followUpDate: null,\n sentiment: 'unknown'\n };\n}\n\nconst decisions = Array.isArray(intel.decisions) ? intel.decisions : [];\nconst actionItems = Array.isArray(intel.actionItems) ? intel.actionItems : [];\nconst risks = Array.isArray(intel.risks) ? intel.risks : [];\nconst keyTopics = Array.isArray(intel.keyTopics) ? intel.keyTopics : [];\n\nconst decisionsStr = decisions.map(function(d, i) {\n return (i+1) + '. ' + (d.decision || '') + (d.decidedBy ? ' [' + d.decidedBy + ']' : '');\n}).join(' | ');\n\nconst actionItemsStr = actionItems.map(function(a, i) {\n return (i+1) + '. ' + (a.task || '') +\n (a.owner ? ' -> ' + a.owner : '') +\n (a.dueDate ? ' by ' + a.dueDate : '') +\n ' [' + (a.priority || 'medium') + ']';\n}).join(' | ');\n\nconst risksStr = risks.join(' | ');\n\nreturn [{\n json: {\n meetingId: meta.meetingId,\n title: meta.title,\n date: meta.date,\n participants: meta.participants,\n duration: meta.duration,\n wordCount: meta.wordCount,\n transcript: meta.transcript,\n summary: intel.summary || '',\n keyTopics: keyTopics,\n decisions: decisions,\n actionItems: actionItems,\n risks: risks,\n followUpDate: intel.followUpDate || null,\n sentiment: intel.sentiment || 'neutral',\n actionItemCount: actionItems.length,\n decisionCount: decisions.length,\n riskCount: risks.length,\n decisionsStr: decisionsStr || 'None identified',\n actionItemsStr: actionItemsStr || 'None identified',\n risksStr: risksStr || 'None identified',\n keyTopicsStr: keyTopics.join(', '),\n processedAt: procAt\n }\n}];"
},
"typeVersion": 2
},
{
"id": "215a57c5-46f2-4d3e-8e65-3b2c1eb5037a",
"name": "5. Google Sheets \u2014 Log Meeting",
"type": "n8n-nodes-base.googleSheets",
"position": [
848,
-48
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $json.date }}",
"Risks": "={{ $json.risksStr }}",
"Summary": "={{ $json.summary }}",
"Decisions": "={{ $json.decisionsStr }}",
"Sentiment": "={{ $json.sentiment }}",
"Key Topics": "={{ $json.keyTopicsStr }}",
"Meeting ID": "={{ $json.meetingId }}",
"Action Count": "={{ $json.actionItemCount }}",
"Action Items": "={{ $json.actionItemsStr }}",
"Participants": "={{ $json.participants }}",
"Processed At": "={{ $json.processedAt }}",
"Meeting Title": "={{ $json.title }}",
"Decision Count": "={{ $json.decisionCount }}",
"Duration (min)": "={{ $json.duration }}",
"Follow-up Date": "={{ $json.followUpDate || '' }}",
"Transcript Words": "={{ $json.wordCount }}"
},
"schema": [
{
"id": "Meeting ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Meeting ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Meeting Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Meeting Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Participants",
"type": "string",
"display": true,
"required": false,
"displayName": "Participants",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Duration (min)",
"type": "string",
"display": true,
"required": false,
"displayName": "Duration (min)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Transcript Words",
"type": "string",
"display": true,
"required": false,
"displayName": "Transcript Words",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Key Topics",
"type": "string",
"display": true,
"required": false,
"displayName": "Key Topics",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Decisions",
"type": "string",
"display": true,
"required": false,
"displayName": "Decisions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Action Items",
"type": "string",
"display": true,
"required": false,
"displayName": "Action Items",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risks",
"type": "string",
"display": true,
"required": false,
"displayName": "Risks",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "string",
"display": true,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Follow-up Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Action Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Action Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Decision Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Decision Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Processed At",
"type": "string",
"display": true,
"required": false,
"displayName": "Processed At",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Meetings"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_MEETING_LOG_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "b20d3a49-98a3-4151-9018-5f75c48855b6",
"name": "6. Split Out \u2014 One Action Item at a Time",
"type": "n8n-nodes-base.splitOut",
"position": [
848,
128
],
"parameters": {
"options": {},
"fieldToSplitOut": "actionItems"
},
"typeVersion": 1
},
{
"id": "e8e6aaa7-c05f-481e-b7fa-f32d78438568",
"name": "7. IF \u2014 Has Valid Action Item?",
"type": "n8n-nodes-base.if",
"position": [
1104,
128
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "has-task",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json.actionItems?.task || $json.task }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "0711952b-277d-48a4-acff-a21f017477f4",
"name": "8. ClickUp \u2014 Create Task per Action Item",
"type": "n8n-nodes-base.httpRequest",
"position": [
1344,
112
],
"parameters": {
"url": "https://api.clickup.com/api/v2/list/YOUR_CLICKUP_LIST_ID/task",
"method": "POST",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"jsonBody": "={{ JSON.stringify({\n name: ($json.actionItems?.task || $json.task || 'Untitled task'),\n description: 'From meeting: ' + $('4. Code \u2014 Parse and Structure Intelligence').first().json.title + ' (' + $('4. Code \u2014 Parse and Structure Intelligence').first().json.date + ')\\n\\nOwner: ' + ($json.actionItems?.owner || $json.owner || 'Unassigned') + '\\nPriority: ' + ($json.actionItems?.priority || $json.priority || 'medium') + '\\nMeeting ID: ' + $('4. Code \u2014 Parse and Structure Intelligence').first().json.meetingId,\n priority: (($json.actionItems?.priority || $json.priority || 'medium') === 'high' ? 2 : ($json.actionItems?.priority || $json.priority || 'medium') === 'low' ? 4 : 3),\n due_date: (($json.actionItems?.dueDate || $json.dueDate) ? new Date($json.actionItems?.dueDate || $json.dueDate).getTime() : null)\n}) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "YOUR_CLICKUP_API_KEY"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "d268857d-20b5-4b49-be74-272589a8f9eb",
"name": "9. Gmail \u2014 Send Meeting Brief",
"type": "n8n-nodes-base.gmail",
"position": [
864,
304
],
"parameters": {
"sendTo": "YOUR_TEAM_EMAIL",
"message": "=<div style=\"font-family:Arial,sans-serif;max-width:700px;margin:0 auto;background:#f5f5f5;\">\n\n <div style=\"background:#1a1a2e;padding:24px 28px;border-radius:8px 8px 0 0;\">\n <h1 style=\"color:#fff;font-size:20px;margin:0;\">Meeting Intelligence Brief</h1>\n <p style=\"color:#aaa;font-size:13px;margin:6px 0 0;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.title }} | {{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.date }}</p>\n </div>\n\n <div style=\"background:#3d5a80;padding:10px 24px;display:flex;gap:24px;flex-wrap:wrap;\">\n <span style=\"color:#fff;font-size:13px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.participants }}</span>\n <span style=\"color:#fff;font-size:13px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.duration }} min</span>\n <span style=\"color:#fff;font-size:13px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.actionItemCount }} action items</span>\n <span style=\"color:#fff;font-size:13px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.decisionCount }} decisions</span>\n </div>\n\n <div style=\"background:#fff;padding:20px 24px;\">\n\n <div style=\"background:#f0f4ff;border-left:4px solid #3d5a80;padding:14px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <h2 style=\"margin:0 0 8px;font-size:14px;color:#1a1a2e;\">Executive Summary</h2>\n <p style=\"margin:0;font-size:14px;color:#333;line-height:1.7;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.summary }}</p>\n </div>\n\n <h2 style=\"font-size:14px;color:#1a1a2e;border-bottom:2px solid #eee;padding-bottom:6px;\">Key Decisions</h2>\n <pre style=\"font-family:Arial,sans-serif;font-size:13px;color:#333;line-height:1.8;white-space:pre-wrap;background:#f9f9f9;padding:12px;border-radius:6px;margin-bottom:16px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.decisionsStr }}</pre>\n\n <h2 style=\"font-size:14px;color:#1a1a2e;border-bottom:2px solid #eee;padding-bottom:6px;\">Action Items</h2>\n <pre style=\"font-family:Arial,sans-serif;font-size:13px;color:#333;line-height:1.8;white-space:pre-wrap;background:#e8f5e9;padding:12px;border-radius:6px;margin-bottom:16px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.actionItemsStr }}</pre>\n\n <h2 style=\"font-size:14px;color:#1a1a2e;border-bottom:2px solid #eee;padding-bottom:6px;\">Key Topics</h2>\n <p style=\"font-size:13px;color:#555;margin-bottom:16px;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.keyTopicsStr }}</p>\n\n <div style=\"background:#fff8e1;border-left:4px solid #ffa000;padding:14px;border-radius:0 6px 6px 0;margin-bottom:16px;\">\n <h2 style=\"margin:0 0 8px;font-size:14px;color:#1a1a2e;\">Risks and Blockers</h2>\n <pre style=\"font-family:Arial,sans-serif;font-size:13px;color:#444;line-height:1.7;white-space:pre-wrap;margin:0;\">{{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.risksStr }}</pre>\n </div>\n\n {{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.followUpDate ? '<div style=\"background:#e8f5e9;padding:12px 14px;border-radius:6px;\"><p style=\"margin:0;font-size:13px;color:#2e7d32;\"><strong>Follow-up meeting:</strong> ' + $('4. Code \u2014 Parse and Structure Intelligence').first().json.followUpDate + '</p></div>' : '' }}\n\n </div>\n\n <div style=\"background:#1a1a2e;padding:12px 24px;text-align:center;border-radius:0 0 8px 8px;\">\n <p style=\"color:#888;font-size:11px;margin:0;\">Action items synced to ClickUp \u2014 Powered by n8n + ChatGPT AI | Meeting ID: {{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.meetingId }}</p>\n </div>\n\n</div>",
"options": {
"senderName": "Meeting Intelligence Hub"
},
"subject": "=Meeting Brief \u2014 {{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.title }} | {{ $('4. Code \u2014 Parse and Structure Intelligence').first().json.date }}"
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "e1af93fa-723f-482d-835b-e1443f837233",
"nodeGroups": [],
"connections": {
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "3. AI Agent \u2014 Extract Meeting Intelligence",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"2. Code \u2014 Validate and Prepare": {
"main": [
[
{
"node": "3. AI Agent \u2014 Extract Meeting Intelligence",
"type": "main",
"index": 0
}
]
]
},
"7. IF \u2014 Has Valid Action Item?": {
"main": [
[
{
"node": "8. ClickUp \u2014 Create Task per Action Item",
"type": "main",
"index": 0
}
]
]
},
"1. Form \u2014 Paste Meeting Transcript": {
"main": [
[
{
"node": "2. Code \u2014 Validate and Prepare",
"type": "main",
"index": 0
}
]
]
},
"6. Split Out \u2014 One Action Item at a Time": {
"main": [
[
{
"node": "7. IF \u2014 Has Valid Action Item?",
"type": "main",
"index": 0
}
]
]
},
"3. AI Agent \u2014 Extract Meeting Intelligence": {
"main": [
[
{
"node": "4. Code \u2014 Parse and Structure Intelligence",
"type": "main",
"index": 0
}
]
]
},
"4. Code \u2014 Parse and Structure Intelligence": {
"main": [
[
{
"node": "5. Google Sheets \u2014 Log Meeting",
"type": "main",
"index": 0
},
{
"node": "6. Split Out \u2014 One Action Item at a Time",
"type": "main",
"index": 0
},
{
"node": "9. Gmail \u2014 Send Meeting Brief",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow collects a meeting transcript via an n8n Form, uses OpenAI (ChatGPT) to extract structured meeting intelligence, logs the results to Google Sheets, creates one ClickUp task per action item, and emails an HTML meeting brief via Gmail. Receives a submission from an…
Source: https://n8n.io/workflows/16509/ — 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.
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical
This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL
Transform your manual hiring process into an intelligent evaluation system that saves 15-20 minutes per candidate! This workflow automates the entire candidate assessment pipeline - from CSV/XLSX uplo
This workflow collects your job preferences via an n8n form, uses Apify to scrape LinkedIn job listings, and has OpenAI screen and rank them. After you approve a shortlist by Gmail, it generates tailo
This workflow automates the entire Calendly onboarding and offboarding process for company users. It relies on form submissions, Google Sheets as a source of truth, AI-generated HR emails, man-in-the-