
AI Meeting Notes to Asana Tasks & Slack Summary
描述
分类
⚙️ Automation
使用的节点
n8n-nodes-base.coden8n-nodes-base.coden8n-nodes-base.asanan8n-nodes-base.slackn8n-nodes-base.aggregaten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
价格免费
浏览量0
最后更新11/28/2025
workflow.json
{
"id": "Zu92vKdhQwEYAsmb",
"meta": {
"instanceId": "e727120caf53d5edf0f46c7a0cb4d30248524826acdd7c9d9a3c3180558a4b97",
"templateCredsSetupCompleted": true
},
"name": "AI Meeting Notes to Asana Tasks & Slack Summary",
"tags": [],
"nodes": [
{
"id": "af232b23-64df-4939-85e8-16d9c1fdbc93",
"name": "Meeting Notes Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
976,
496
],
"webhookId": "4a72873c-7006-4f90-96ee-a02e9c5130ec",
"parameters": {
"options": {
"appendAttribution": false
},
"formTitle": "Meeting Notes → Tasks & Summary",
"formFields": {
"values": [
{
"fieldLabel": "Company Name / Project Name",
"placeholder": "Who the meeting was with / What it was about",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Paste in your meeting notes here",
"placeholder": "AI Notetaker Summary, manual notes, shared document",
"requiredField": true
},
{
"fieldLabel": "Asana Project ID",
"placeholder": "Your Asana Project ID",
"requiredField": true
},
{
"fieldLabel": "Slack Channel Name",
"placeholder": "#team-updates"
}
]
},
"formDescription": "Transform meeting notes into organized tasks and team summaries.\n\n✓ Extract key decisions and action items\n✓ Create Asana tasks with due dates\n✓ Send Slack summary to team\n\nWorks with AI notetaker transcripts, manual notes, or shared documents."
},
"typeVersion": 2.2
},
{
"id": "807d3b67-42cf-459c-9682-d1dbb2789b7a",
"name": "AI Extract Data",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1136,
496
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "You are a helpful, intelligent personal assistant. You extract structured data from meeting notes."
},
{
"content": "=Extract the following from these meeting notes:\n\nMeeting notes:\n{{ $json[\"Paste in your meeting notes here\"] }}\n\nReturn a JSON object with these exact keys:\n{\n \"key_decisions\": [\"decision 1\", \"decision 2\"],\n \"action_items\": [\n {\n \"task\": \"task description\",\n \"assignee\": \"person name or 'Unassigned'\",\n \"due_date\": \"YYYY-MM-DD or null\"\n }\n ],\n \"next_meeting_date\": \"YYYY-MM-DD or null\",\n \"pain_points\": [\"pain point 1\", \"pain point 2\"],\n \"budget_mentioned\": \"dollar amount or null\"\n}\n\nRules:\n- If no action items found, return empty array\n- If no assignee mentioned, use \"Unassigned\"\n- If no due date mentioned, use null\n- Extract dates in YYYY-MM-DD format"
}
]
},
"jsonOutput": true
},
"typeVersion": 1.8
},
{
"id": "280d61e5-be6c-4e4e-adc2-fe39ffd8b197",
"name": "Structure Data",
"type": "n8n-nodes-base.code",
"position": [
1440,
496
],
"parameters": {
"jsCode": "// Get the AI response\nconst aiContent = $input.item.json.message.content;\n\n// Get form data\nconst formTrigger = $('Meeting Notes Form').item.json;\n\nconst formData = {\n company_name: formTrigger[\"Company Name / Project Name\"],\n meeting_notes: formTrigger[\"Paste in your meeting notes here\"],\n asana_project_id: formTrigger[\"Asana Project ID\"],\n slack_channel: formTrigger[\"Slack Channel Name\"] || \"#general\"\n};\n\n// Parse extracted data\nconst extracted = {\n key_decisions: aiContent.key_decisions || [],\n action_items: aiContent.action_items || [],\n next_meeting_date: aiContent.next_meeting_date || null,\n pain_points: aiContent.pain_points || [],\n budget_mentioned: aiContent.budget_mentioned || null\n};\n\n// Create one item per action item with meeting context\nconst outputItems = extracted.action_items.map(item => ({\n json: {\n task: item.task,\n assignee: item.assignee,\n due_date: item.due_date,\n company_name: formData.company_name,\n meeting_notes: formData.meeting_notes,\n asana_project_id: formData.asana_project_id,\n slack_channel: formData.slack_channel,\n key_decisions: extracted.key_decisions,\n pain_points: extracted.pain_points,\n next_meeting_date: extracted.next_meeting_date,\n budget_mentioned: extracted.budget_mentioned\n }\n}));\n\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "ba7e615f-db39-430b-81d5-b2a9b5d2154a",
"name": "Create Asana Task",
"type": "n8n-nodes-base.asana",
"position": [
1632,
496
],
"parameters": {
"name": "={{ $json.task }}",
"authentication": "oAuth2",
"otherProperties": {
"notes": "=Assignee: {{ $json.assignee }}\nFrom meeting with: {{ $json.company_name }}\n\nContext from meeting notes:\n{{ $json.meeting_notes }}",
"due_on": "={{ $json.due_date }}",
"assignee": "=me",
"projects": "={{ $json.asana_project_id }}"
}
},
"typeVersion": 1
},
{
"id": "843c938b-ca76-4918-97e4-215bcc478bb8",
"name": "Combine Tasks",
"type": "n8n-nodes-base.aggregate",
"position": [
1856,
496
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "Tasks"
},
"typeVersion": 1
},
{
"id": "9e31494c-8999-474b-b676-6c4b611ad30b",
"name": "Format Slack Message",
"type": "n8n-nodes-base.code",
"position": [
2080,
496
],
"parameters": {
"jsCode": "// Get aggregated tasks\nconst aggregatedData = $input.item.json;\nconst tasks = aggregatedData.Tasks || [];\n\n// Get meeting context\nconst parseData = $('Structure Data').first().json;\nconst company_name = parseData.company_name || \"Unknown Company\";\nconst slack_channel = parseData.slack_channel || \"#general\";\nconst key_decisions = parseData.key_decisions || [];\nconst pain_points = parseData.pain_points || [];\nconst next_meeting_date = parseData.next_meeting_date;\nconst budget_mentioned = parseData.budget_mentioned;\n\n// Format action items\nconst actionItems = tasks.map(task => ({\n name: task.name,\n assignee: task.assignee ? task.assignee.name.split('@')[0] : \"Unassigned\",\n due_date: task.due_on,\n url: task.permalink_url\n}));\n\n// Build Slack message\nlet message = `*📝 Meeting Summary: ${company_name}*\\n\\n`;\n\nif (key_decisions.length > 0) {\n message += `*✅ Key Decisions:*\\n`;\n key_decisions.forEach(d => message += `• ${d}\\n`);\n message += `\\n`;\n}\n\nif (actionItems.length > 0) {\n message += `*📋 Action Items Created (${actionItems.length}):*\\n`;\n actionItems.forEach(item => {\n const dueDate = item.due_date ? ` - Due: ${item.due_date}` : \"\";\n message += `• <${item.url}|${item.name}> - ${item.assignee}${dueDate}\\n`;\n });\n message += `\\n`;\n}\n\nif (pain_points.length > 0) {\n message += `*⚠️ Pain Points:*\\n`;\n pain_points.forEach(p => message += `• ${p}\\n`);\n message += `\\n`;\n}\n\nif (budget_mentioned) {\n message += `*💰 Budget: ${budget_mentioned}*\\n\\n`;\n}\n\nif (next_meeting_date) {\n message += `*📅 Next Meeting: ${next_meeting_date}*\\n\\n`;\n}\n\nconst projectName = tasks[0]?.projects?.[0]?.name || \"Asana\";\nmessage += `_Project: ${projectName}_`;\n\nreturn [{ json: { channel: slack_channel, message: message } }];"
},
"typeVersion": 2
},
{
"id": "a3d90ce6-3745-43ef-83a5-9ae6573b55e2",
"name": "Send to Slack",
"type": "n8n-nodes-base.slack",
"position": [
2304,
496
],
"webhookId": "fb688d68-bab5-4b22-8cad-da7f60839614",
"parameters": {
"text": "={{ $json.message }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.channel }}"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.3
},
{
"id": "28aebbff-b36d-408f-a290-8f2d4e241f05",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
352
],
"parameters": {
"color": 4,
"width": 420,
"height": 380,
"content": "## 📝 Meeting Notes to Action Items\n\n**Stop manually tracking action items from meetings.**\n\nThis workflow:\n- Uses AI to extract key info\n- Creates Asana tasks automatically\n- Sends team summary via Slack\n\n**Works with any notes format:**\n- AI notetaker transcripts\n- Manual typed notes\n- Shared documents"
},
"typeVersion": 1
},
{
"id": "2dd7517f-5c2e-4e2c-a8a6-e3144ab611db",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
144
],
"parameters": {
"width": 280,
"height": 280,
"content": "## Step 1: Submit Notes\n\nForm collects:\n- Company/Project name\n- Meeting notes\n- Asana project\n- Slack channel\n\nTip: Replace with email trigger for automation"
},
"typeVersion": 1
},
{
"id": "d208ee40-5550-4366-96fd-43436c3cc1a9",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
720
],
"parameters": {
"width": 280,
"height": 280,
"content": "## Step 2: AI Extraction\n\nGPT-4o extracts:\n- ✅ Decisions\n- 📋 Action items\n- 📅 Due dates\n- ⚠️ Pain points\n- 💰 Budget\n- 🗓️ Next meeting"
},
"typeVersion": 1
},
{
"id": "ab6d8b9c-7795-480f-8d68-737715e022dd",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1600,
192
],
"parameters": {
"color": 3,
"height": 240,
"content": "## Step 3: Create Tasks\n\nEach action item becomes a task with:\n- Title & assignee\n- Due date\n- Full meeting context"
},
"typeVersion": 1
},
{
"id": "4ae29fdc-4303-4b21-87ec-cd1a6a3ed74c",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
2032,
720
],
"parameters": {
"color": 6,
"width": 300,
"height": 280,
"content": "## Step 4: Slack Summary\n\nFormatted message with:\n- Key decisions\n- Clickable task links\n- Pain points\n- Budget & next meeting\n\nTeam stays aligned!"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "87c6c252-76aa-43fe-a7f8-3dd601876255",
"connections": {
"Combine Tasks": {
"main": [
[
{
"node": "Format Slack Message",
"type": "main",
"index": 0
}
]
]
},
"Structure Data": {
"main": [
[
{
"node": "Create Asana Task",
"type": "main",
"index": 0
}
]
]
},
"AI Extract Data": {
"main": [
[
{
"node": "Structure Data",
"type": "main",
"index": 0
}
]
]
},
"Create Asana Task": {
"main": [
[
{
"node": "Combine Tasks",
"type": "main",
"index": 0
}
]
]
},
"Meeting Notes Form": {
"main": [
[
{
"node": "AI Extract Data",
"type": "main",
"index": 0
}
]
]
},
"Format Slack Message": {
"main": [
[
{
"node": "Send to Slack",
"type": "main",
"index": 0
}
]
]
}
}
}