Transform Meeting Notes into Asana Tasks and Slack Summaries
Form-submitted notes → GPT-4o extracts decisions and action items → Creates Asana tasks → Aggregates and sends Slack summary
- Who
- Sales teams, project managers, anyone who wants to stop manually tracking meeting action items
- You get
- After each submission of meeting notes, automatically create Asana tasks with assignees and due dates, and send a Slack summary with clickable links
Constraints
Requires: n8n instance; OpenAI API key; Asana workspace OAuth2 connection; Slack workspace OAuth2 connection. Cost: author estimates approximately $0.01–0.03 per meeting analysis (GPT-4o). Form can be shared with your team.
What they did
This n8n template by author kareem demonstrates a workflow: collect meeting notes via a form, call GPT-4o to extract decisions, action items, pain points, budget, and next meeting dates, automatically create tasks in Asana, and send an aggregated summary to a Slack channel. The template includes complete node configurations and connections.
How it went
The author reports this workflow suits sales teams and project managers, reducing manual tracking of meeting action items; GPT-4o costs approximately $0.01–0.03 per analysis; the form can be shared with the team; Slack messages include clickable task links. (Source: author report)
Worth knowing
1. The Asana node's assignee parameter is hardcoded to 'me' (the OAuth2-authorized user); modify if you need to assign to others. 2. Valid Asana and Slack OAuth2 connections are required; permission scopes depend on each workspace's security policies. 3. The cost estimate of $0.01–0.03 per run is from the author and unverified; actual cost depends on note length and GPT-4o pricing. 4. The template does not provide a direct workflow JSON download link; import via the n8n template page or manually copy workflow.json. 5. This site has not executed end-to-end testing; verify with test data before production use.
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- After import, connect your own credentials on auth-required nodes; author secrets are not included.
Configuration to replace
- Source template is n8n public workflow #9875 (~12 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-25
Steps
Submit Meeting Notes
After importing this template into n8n, the workflow starts with a form trigger (Meeting Notes Form). Fill in and submit: Company Name / Project Name, full meeting notes (AI notetaker transcripts, manual notes, or shared documents), Asana Project ID, and Slack Channel Name. The workflow runs automatically upon submission.
AI Extraction of Structured Data
The form data flows into the OpenAI node (AI Extract Data) using gpt-4o. The system prompt sets the role as an assistant that extracts structured data from meeting notes; the user prompt requests extraction of key_decisions, action_items (with assignee and due_date), next_meeting_date, pain_points, and budget_mentioned, returning a specified JSON format.
Execution prompt · Source text。System message field of the AI Extract Data node
You are a helpful, intelligent personal assistant. You extract structured data from meeting notes.
Execution prompt · Source text。User message field (content) of the AI Extract Data node; {{ $json[...] }} is an n8n expression replaced at runtime with form input
=Extract the following from these meeting notes: Meeting notes: {{ $json["Paste in your meeting notes here"] }} Return a JSON object with these exact keys: { "key_decisions": ["decision 1", "decision 2"], "action_items": [ { "task": "task description", "assignee": "person name or 'Unassigned'", "due_date": "YYYY-MM-DD or null" } ], "next_meeting_date": "YYYY-MM-DD or null", "pain_points": ["pain point 1", "pain point 2"], "budget_mentioned": "dollar amount or null" } Rules: - If no action items found, return empty array - If no assignee mentioned, use "Unassigned" - If no due date mentioned, use null - Extract dates in YYYY-MM-DD formatCreate Asana Tasks
The Structure Data code node parses the GPT-4o JSON response, splitting each action_item into a separate data item with full meeting context. Then the Create Asana Task node creates a task for each action item: title from the task field, assignee hardcoded to 'me' (the OAuth2-authorized user), due date from due_date, notes containing assignee, company_name, and full meeting_notes, and project set by the Asana Project ID.
Execution prompt · Source text。JS Code field of the Structure Data node
// Get the AI response const aiContent = $input.item.json.message.content; // Get form data const formTrigger = $('Meeting Notes Form').item.json; const formData = { company_name: formTrigger["Company Name / Project Name"], meeting_notes: formTrigger["Paste in your meeting notes here"], asana_project_id: formTrigger["Asana Project ID"], slack_channel: formTrigger["Slack Channel Name"] || "#general" }; // Parse extracted data const extracted = { key_decisions: aiContent.key_decisions || [], action_items: aiContent.action_items || [], next_meeting_date: aiContent.next_meeting_date || null, pain_points: aiContent.pain_points || [], budget_mentioned: aiContent.budget_mentioned || null }; // Create one item per action item with meeting context const outputItems = extracted.action_items.map(item => ({ json: { task: item.task, assignee: item.assignee, due_date: item.due_date, company_name: formData.company_name, meeting_notes: formData.meeting_notes, asana_project_id: formData.asana_project_id, slack_channel: formData.slack_channel, key_decisions: extracted.key_decisions, pain_points: extracted.pain_points, next_meeting_date: extracted.next_meeting_date, budget_mentioned: extracted.budget_mentioned } })); return outputItems;Send Slack Summary
The Combine Tasks aggregate node merges all Asana task outputs into a single data item. The Format Slack Message code node builds a formatted Slack message containing key decisions, action items with clickable links (including assignee and due date), pain points, budget, and next meeting date. The Send to Slack node delivers the message to the Slack channel specified in Step 1.
Execution prompt · Source text。JS Code field of the Format Slack Message node
// Get aggregated tasks const aggregatedData = $input.item.json; const tasks = aggregatedData.Tasks || []; // Get meeting context const parseData = $('Structure Data').first().json; const company_name = parseData.company_name || "Unknown Company"; const slack_channel = parseData.slack_channel || "#general"; const key_decisions = parseData.key_decisions || []; const pain_points = parseData.pain_points || []; const next_meeting_date = parseData.next_meeting_date; const budget_mentioned = parseData.budget_mentioned; // Format action items const actionItems = tasks.map(task => ({ name: task.name, assignee: task.assignee ? task.assignee.name.split('@')[0] : "Unassigned", due_date: task.due_on, url: task.permalink_url })); // Build Slack message let message = `*📝 Meeting Summary: ${company_name}*\n\n`; if (key_decisions.length > 0) { message += `*✅ Key Decisions:*\n`; key_decisions.forEach(d => message += `• ${d}\n`); message += `\n`; } if (actionItems.length > 0) { message += `*📋 Action Items Created (${actionItems.length}):*\n`; actionItems.forEach(item => { const dueDate = item.due_date ? ` - Due: ${item.due_date}` : ""; message += `• <${item.url}|${item.name}> - ${item.assignee}${dueDate}\n`; }); message += `\n`; } if (pain_points.length > 0) { message += `*⚠️ Pain Points:*\n`; pain_points.forEach(p => message += `• ${p}\n`); message += `\n`; } if (budget_mentioned) { message += `*💰 Budget: ${budget_mentioned}*\n\n`; } if (next_meeting_date) { message += `*📅 Next Meeting: ${next_meeting_date}*\n\n`; } const projectName = tasks[0]?.projects?.[0]?.name || "Asana"; message += `_Project: ${projectName}_`; return [{ json: { channel: slack_channel, message: message } }];
Prompt you can copy
Setup guidance · Editorial suggestion。Give to a setup assistant; confirm inputs and permissions first
This block is the prompt. Ads are never placed here.
You are an n8n template import assistant. The user wants to reproduce the workflow that transforms meeting notes into Asana tasks and Slack summaries. Assist in this order: 1. Confirm the user has an n8n instance (cloud or self-hosted) with admin access; 2. Guide them to import the template from https://n8n.io/workflows/9875/; 3. Configure three credentials: OpenAI API key, Asana OAuth2, Slack OAuth2; 4. Check the form trigger fields and the model selection in the AI node (gpt-4o); 5. Suggest running once with test data to verify Asana task creation and Slack message formatting. Note: The Asana node's assignee is currently hardcoded to 'me'. To assign tasks to others, modify the node parameters or add lookup logic in the workflow.
Configure credentials first, then test the full flow with sample meeting notes
Source
Transform meeting notes into Asana tasks & Slack summaries with GPT-4o · kareem · n8n.io · 2025-10-18
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.