N
n8n Store
Workflow Market
AI Meeting Notes to Asana Tasks & Slack Summary

AI Meeting Notes to Asana Tasks & Slack Summary

by kareem0 views

Description

Categories

⚙️ Automation

Nodes Used

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
PriceGratis
Views0
Last Updated11/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
          }
        ]
      ]
    }
  }
}

相关工作流