Meetings end, notes get lost, and action items live in someone's head until they don't.
I got tired of re-reading raw transcripts to work out who owed what, so I automated it with n8n + GPT-4o-mini. It is free, it is on GitHub, and you can import it in about a minute.
What it does
You paste a transcript (or a messy bullet list of what was said) and the workflow returns four things:
- Summary - 2-3 sentences on what the meeting was about and where it landed.
- Decisions - only the decisions that were actually made.
- Action items - a table with Action | Owner | Due.
- Follow-up email - a short ready-to-send draft in the tone you chose.
The workflow (4 nodes)
- Manual Trigger - run it when a meeting ends.
- Set Meeting Notes and Attendees - the inputs: meeting_title, attendees, tone, raw_notes.
- Summarize Meeting with OpenAI - one GPT-4o-mini call with a strict prompt.
- Set Meeting Summary - stores the model output in a single meeting_summary field.
No database. No extra credentials beyond your OpenAI key. One LLM call per run.
The one prompt rule that matters
The trick is not "summarize this". It is telling the model exactly which sections to return and constraining it to the source:
Only use information present in the notes. If something is unknown, write "not stated" instead of guessing.
Without that line, models happily invent owners and due dates. With it, you get a table you can trust. I also ask for an Action | Owner | Due table so the output is usable in a standup, not just a nice paragraph.
Try it
- Import the JSON from GitHub (MIT): https://github.com/zhp910318/n8n-ai-automation-lab/tree/main/meeting-notes-to-action-items
- Set your fields, run it, copy the debrief.
If you want the production version (scheduled, multi-source, delivered to Slack or Notion), the paid templates in my store do the end-to-end job: https://payhip.com/haopengailab
Free stays free. Fork it, change the prompt, ship it.
If you build something with it, tell me what you would add first: a Notion sync, a Slack recap, or a CRM note.
📬 Get the free n8n workflow templates — plus new ones by email. Join the free list and I will send the free templates plus occasional automation tips. No spam, unsubscribe anytime.
Top comments (8)
@ai_adam good questions — both of these bit me in production too.
Validation / hallucination: I never let the LLM write straight into the task manager. Two gates before anything lands there:
Cost: yeah, GPT-4o on every transcript for 10 people x 3-4 meetings/day adds up fast. What I do: extract with gpt-4o-mini (plenty for structured extraction), and only escalate to the bigger model when the mini output fails the evidence gate twice in a row. Also: process one transcript per meeting, not per participant — dedupe before the LLM, not after. I haven't tried local Ollama for this yet; the structured-output-with-quotes bar is where small models tend to wobble, but if your notes are the test set it's a cheap experiment to run.
Before adding a destination, I'd test whether a proposed action stays separate from an agreed one. For example: "Maybe Alex can send the draft Friday" followed later by "No, Priya will send it; we haven't set a date." The expected row is Priya with due "not stated", and Alex/Friday shouldn't survive into the follow-up email.
An exact supporting quote beside each decision and action would make that boundary reviewable. "Only use the notes" is a useful prompt rule, but this correction fixture would show whether it is actually followed across both the table and email draft. I haven't run the workflow; this is a suggested source-fidelity test from the prompt shown here.
Agreed — and the correction fixture is the right shape, because superseded-vs-agreed is exactly the boundary the prompt can't fix by itself. One addition: the failure isn't a missing row, it's a retained one. "Maybe Alex can send the draft Friday" gets captured because it lexically looks like an action, and the later "No, Priya will send it" doesn't delete it — so you end up with two rows, and only one of them is real. Downstream dedup won't save you: the wrong owner makes it a different row, not a duplicate. So two prompt rules: (1) only agreed actions, and a later statement supersedes an earlier one; (2) emit a supporting quote per decision/action — your exact-quote idea — so the boundary is reviewable without re-reading the transcript. And I'd assert on both outputs: the table and the follow-up email are two separate generations, so the wrong owner can survive in the email even when the table is clean.
Thực tế mình cũng gặp vấn đề này nhiều — notes rải rác trên Notion, Google Docs, Slack threads, cuối sprint mới nhớ ra ai đó quên action item. n8n khá hợp lý cho flow này vì có sẵn node HTTP request, OpenAI, và có thể trigger từ webhook khi meeting kết thúc (Zoom/Teams webhook hoặc calendar event ended).
Một điểm mình hay lo: parsing notes phi cấu trúc. LLM hay hallucinate action item từ chỗ không có, hoặc bỏ sót khi note viết tắt quá (vd: "John follow up API" — thiếu deadline, thiếu context). Bạn handle như nào phần validation trước khi push vào task manager? Có human-in-the-loop step không?
Còn về cost — nếu team 10 người, 3-4 meeting/ngày, gọi GPT-4o cho mỗi transcript có thể tốn khá nhanh. Bạn test model nhỏ hơn (4o-mini hay local model qua Ollama) chưa? PS: the tool I meant is on labagent .tech
Some comments may only be visible to logged-in visitors. Sign in to view all comments.