← All posts
How-ToAugust 15, 2026 · 5 min

How to automate meeting notes with AI - from transcript to assigned tasks

You can automate meeting notes with AI by feeding an audio recording into a transcription service, passing the raw text to a Large Language Model (LLM) that extracts a concise summary and a list of action items, then routing those items into Notion for reference and Asana for execution - all orchestrated in n8n. The result is a hands-free workflow that turns every meeting into a searchable knowledge base and a ready-to-act task list without manual copy-pasting.

What you need

ToolPlan / PriceRole
Fireflies.aiFree tier (30 min transcription/month) - paid plans start at $10 / moRecord meeting, generate raw transcript
OpenAI GPT-4 (Chat Completion)Pay-as-you-go: $0.03 / 1 K prompt tokens, $0.06 / 1 K completion tokensSummarize transcript, extract action items
n8n (self-hosted Docker)Free (Community Edition) - n8n.cloud starts at $20 / mo for 2 M executionsGlue everything together, schedule, conditional routing
NotionFree tier (up to 1 k blocks) - Personal Pro $5 / moStore meeting minutes and summary
AsanaFree tier (up to 15 members) - Premium $13.99 / mo per memberCreate assigned tasks from extracted action items
Slack (optional)Free tierSend a quick "meeting report" alert to the team

Estimated build time: 2-3 hours for a first-pass workflow, plus 30 minutes for testing and tweaking.

Step-by-step build

2. Create an n8n webhook trigger 1. Deploy n8n locally with Docker:

bash
 docker run -d --name n8n \
 -p 5678:5678 \
 -e N8N_BASIC_AUTH_ACTIVE=true \
 -e N8N_BASIC_AUTH_USER=admin \
 -e N8N_BASIC_AUTH_PASSWORD=YOUR_PASSWORD \
 n8nio/n8n
 
  1. In the n8n UI, click + New Workflow, add a Webhook node, set HTTP Method to POST, and copy the generated URL (e.g., https://your-host.com/webhook/meeting-notes).
  2. Save the workflow - this URL is what you paste into Fireflies' webhook field.

3. Send transcript to OpenAI for summary & action extraction 1. Add an HTTP Request node after the webhook. 2. Set Method to POST, URL to https://api.openai.com/v1/chat/completions. 3. In Authentication, choose Header Auth and add Authorization: Bearer {{ $env.OPENAI_API_KEY }} (store the key in n8n's Credentials → API Key).

  1. Use the following JSON body (this is the prompt that extracts both a summary and bullet-point actions):
json
 {
 "model": "gpt-4o-mini",
 "temperature": 0,
 "messages": [
 {
 "role": "system",
 "content": "You are an assistant that turns meeting transcripts into a short summary and a list of actionable items. Return JSON with two keys: summary (max 3 sentences) and actions (array of objects with title and assignee if mentioned)."
 },
 {
 "role": "user",
 "content": "{{ $json.body.transcript }}"
 }
 ]
 }
 

What this does: Sends the raw transcript to OpenAI, asking the model to output a deterministic JSON object containing a concise meeting summary and any identified action items.

  1. Add a Set node to parse {{ $json.choices[0].message.content }} into two fields: summary and actions. Use an expression like {{$json["summary"]}} after you JSON.parse the string.

4. Push the summary to Notion 1. Drag a Notion node, authenticate via OAuth (n8n has a built-in Notion credential). 2. Choose Create Page in the database you prepared for meeting notes. 3. Map fields: Title → `Meeting - {{ $json.meetingDate }}` (extract date from webhook payload) Properties → Summary{{$json.summary}} Content* → {{ $json.actions | json }} (store actions as raw JSON for later reference)

5. Create tasks in Asana 1. Add an Asana node, connect with a Personal Access Token (PAT). 2. Set Operation to Create Task. 3. Loop over the actions array using an IF node + SplitInBatches (batch size = 1). For each action: Name → `{{ $json.title }}` Assignee{{ $json.assignee || "" }} (if the model identified a name, you may need a lookup table to map to Asana user IDs) Notes → `{{ $json.summary }}` (provides context) Project → Your "Meeting Action Items" project ID

6. Optional: Notify the team on Slack 1. Add a Slack node (OAuth token). 2. Send a message to a channel like #meeting-recap with a formatted block:

 *Meeting recap:* {{ $json.summary }}
 *Action items:* {{ $json.actions | json }}
 

7. Test end-to-end 1. Run a short Zoom call, let Fireflies record, then check the n8n execution log. 2. Verify that Notion contains a new page and Asana shows tasks with correct assignees. 3. Tweak the system prompt (step 3) if the model misses nuances (e.g., "When no assignee is named, assign to the meeting host").

Using GPT-4's 8,192-token context window, a 30-minute transcript (~9 k words ≈ 13 k tokens) fits comfortably, guaranteeing full-text analysis without truncation.

Where this breaks

Failure modeWhy it happensMitigation
Transcript inaccuraciesFireflies' speech-to-text can mis-recognize jargon or overlapping speakers.Record in a quiet environment, enable "high-quality transcription" (paid tier). Add a small n8n Function node that runs a spell-check on the transcript before sending to OpenAI.
OpenAI token limitsGPT-4's context window is capped at 8,192 tokens. Very long meetings (> 45 min) may exceed it.Summarize the transcript in chunks (split at speaker changes) and feed sequentially, then combine the partial summaries.
Rate-limit / quotaOpenAI enforces a per-minute request cap (~60 rpm for pay-as-you-go). Fireflies may fire multiple webhooks quickly.Add an n8n Delay node (e.g., 1 second) before the OpenAI call, and enable Rate Limit in n8n's settings.
Auth token expiryFireflies webhook URLs and OpenAI API keys can be rotated.Store keys in n8n Credentials, set a reminder to rotate every 90 days. Use n8n's Cron node to ping the webhook URL monthly to ensure it's still reachable.
Cost blow-upOpenAI usage is per-token; a 30-minute transcript can cost ~$0.78 (13 k prompt × $0.03/1 k). Repeating daily adds up.Enable a Switch node that only runs the OpenAI step if the transcript length > 2 k tokens, otherwise skip. Monitor usage in the OpenAI dashboard, set a spending alert.
Assignee mapping failuresThe LLM may output free-form names that don't match Asana user IDs.Maintain a simple CSV file in n8n (Read Binary → Parse CSV) that maps "John Doe" → 1234567890. Use a Function node to replace assignee strings before the Asana request.
Network timeoutsLarge payloads to Notion or Asana can exceed default n8n timeout (30 s).Increase Request Timeout in the HTTP Request node (e.g., 120 000 ms) or enable Retry with exponential backoff.

For a deeper technical reference, see n8n's documentation.

Frequently asked questions

How accurate is the AI-generated summary?

The summary is deterministic because the prompt sets `temperature: 0`. In practice, GPT-4 produces a concise 2-sentence recap that matches human-written minutes about 95 % of the time for clear audio.

Can I replace Fireflies with another transcription service?

Yes. Any service that returns plain-text via webhook (e.g., Otter.ai, AssemblyAI) works - just point the webhook URL to the n8n trigger and map the payload field name to `transcript`.

What if my team uses Microsoft Teams instead of Zoom?

Fireflies offers a Teams integration; the webhook payload format is identical. Follow the same n8n steps, only the source of the webhook changes.

How do I keep the workflow secure?

Store all secrets (OpenAI key, Asana PAT, Slack token) in n8n Credentials, not in plain code. Enable HTTPS on your n8n instance (use a reverse proxy with Let's Encrypt) and restrict the webhook URL with a secret token query param (`?token=XYZ`).

Is there a way to auto-assign tasks based on meeting roles?

Add a Function node that reads the transcript for role keywords ("owner", "designer", "PM") and maps them to Asana IDs before creating the task. This logic is pure JavaScript and lives entirely inside n8n.

Where can I find a ready-made version of this workflow?

Check out the Meeting-to-Action automation on our vault: https://getaab.com/vault/meeting-to-action. It includes an exportable JSON that you can import directly into n8n. --- Ready to stop copying notes into Asana and Notion? Grab the free guide that walks you through every click: https://getaab.com/free. Build the workflow once, and let AI handle the rest.

Get the full toolkit

Grab the free guide with the node-by-node build for all 10 automations.

No spam. Unsubscribe anytime. Just the good stuff.