Forty minutes after the meeting, the notes arrive: six neat action items, each with a name and a date. Two of them are things nobody agreed to. One person is on the hook for a task they never mentioned. That's the usual failure of AI meeting notes, and it isn't a transcription problem. It's an extraction problem, and you can fix it with a different prompt and a short review pass.
The AI meeting notes workflow below works with any tool that gives you a transcript, whether that's Teams, Zoom, Meet, Otter or a voice memo run through speech-to-text. You get decisions, action items with owners and deadlines, open questions, and a way to catch the model making things up. The tool doesn't matter. The prompt and the review step do.
This is a different problem from writing status reports, where you start from what you already know. Here the source is a messy conversation and the risk is attributing things to people who never said them.
Why do AI meeting summaries get action items wrong?
Three patterns, all visible in a four-line transcript I made up for this post:
Priya: Okay, launch date. I think we hold at 14 November, unless QA finds something.
Marcus: Fine by me. I'll send the vendor the revised SOW by Friday.
Priya: Someone should probably tell support about the new refund flow.
Marcus: Yeah. Also the pricing page copy is still open, we didn't settle that.
- Hedges disappear. "Hold at 14 November, unless QA finds something" becomes "Launch: 14 November." That's a conditional, not a decision.
- Owners get invented. "Someone should probably tell support" has no owner. A model asked for "action items with owners" will often supply one.
- Open items turn into decisions. The pricing copy was explicitly not settled. A summary-style prompt may still list it under "decisions" or quietly assign it.
Only one real action item exists here: Marcus sends the SOW by Friday. A good extraction returns that, flags the refund-flow item as unowned, and lists the pricing copy as an open question.
What prompt turns a transcript into decisions and action items?
The idea is to make the model show its evidence and permit it to say "nobody." This is an untested template. I haven't run it against a specific model, so adapt it and test it on a meeting you remember well.
You are extracting records from a meeting transcript. Use only the transcript.
Do not infer, round up, or fill gaps.
Meeting: [title, date]
Attendees: [names as they appear in the transcript]
Today's date: [YYYY-MM-DD] (use it to turn "Friday" into a date; if unsure, keep the original wording)
Return JSON with these arrays:
decisions: [{ "decision": str, "conditions": str or null, "evidence": verbatim quote }]
- Only things the group agreed. Keep conditions like "unless QA finds something".
action_items: [{ "task": str, "owner": a name from Attendees or "UNASSIGNED",
"due": as stated or "none stated", "evidence": verbatim quote }]
- A task needs someone to commit ("I'll...", "can you...?" followed by a yes).
- "Someone should..." or "we need to..." gets owner "UNASSIGNED".
open_questions: [{ "question": str, "evidence": verbatim quote }]
- Anything raised and not settled.
Rules:
- Every item must include an exact quote copied from the transcript.
- If you are not sure whether something is a commitment, put it in open_questions.
- Do not create an item to make a list look complete. An empty array is fine.
Transcript:
[paste]
Four choices in there matter. The UNASSIGNED value gives the model a legal way out. The verbatim evidence field makes every claim checkable. The "uncertain goes to open_questions" rule moves risk to the section you read first. And the empty-array line removes pressure to pad.
For layout and role setup, the same ideas apply as in the clarity and specificity lesson: name the output shape, state what counts, and say what to do at the edges.
How do I check the output before sending it round?
Reading every line against the recording is slow. A quote check is fast. I wrote a small Python script that takes the transcript and the JSON items and flags any item whose quote isn't in the transcript, or whose owner's name never appears in it. The core is the function below (the full version just adds file loading), and the idea is the whole point:
import re
def norm(s):
return re.sub(r"\s+", " ", re.sub(r"[^a-z0-9 ]", "", s.lower())).strip()
def check(transcript, items):
text = norm(transcript)
problems = []
for i, it in enumerate(items, 1):
if norm(it["evidence"]) not in text:
problems.append(f"item {i}: evidence quote not found in transcript")
if it["owner"] != "UNASSIGNED" and norm(it["owner"]) not in text:
problems.append(f"item {i}: owner '{it['owner']}' never appears in transcript")
return problems
I ran it on the four-line transcript above with three hand-written items: Marcus sending the SOW, the refund flow marked UNASSIGNED, and a third item that I deliberately made up, "Dana will update the pricing copy, Monday". Output:
item 3: evidence quote not found in transcript
item 3: owner 'Dana' never appears in transcript
Items 1 and 2 passed. The invented item failed twice. That's exactly the error a polished summary hides. (The items were written by me to test the script, not produced by a model. A model's real output will vary, which is why the check exists.)
The script can't tell you whether a quote is a real commitment. "I'll think about it by Friday" would pass. So the human pass stays, but it gets short:
- Run the quote check. Fix or delete anything flagged.
- Resolve every UNASSIGNED item. Assign it in the follow-up message or drop it.
- Read the decisions with their conditions. Is "14 November, unless QA finds something" still how you remember it?
- Spot-check two items against the recording. If either is off, re-run with a stricter prompt before trusting the rest.
- Send it yourself. Not the tool. A person who attended should own the follow-up, because they will be asked about it.
What do I do with a long meeting or a bad transcript?
Long meetings: split the transcript by agenda item, run the extraction per chunk, then merge. A later chunk often revises an earlier decision, so add a final prompt: "Here are the combined records. List any decision that a later item contradicts or changes." If the transcript is close to your model's limit, the habits in the context window budget post apply.
Bad transcripts: speech-to-text swaps names and numbers more than it garbles ordinary words. Before extraction, give the model the attendee list and a glossary of product names, and tell it to flag any amount, date or name it isn't sure of rather than correct it silently. Dates and money get verified by a human every time.
Unlabelled speakers are the worst case. If the tool can't tell who said what, owners become guesses. Either fix the speaker labels first or set every owner to UNASSIGNED and assign in the follow-up.
What should the follow-up message look like?
Send within a day, while people still remember. A format that works:
Subject: [Meeting] - decisions and actions, [date]
Decided
- [decision] (condition: [..])
Actions
- [owner]: [task], due [date]
- UNASSIGNED: [task]. Reply if you can take this.
Still open
- [question] - who will bring it back, and when
Reply by [date] if anything here is wrong.
The last line matters. It turns your notes into a correction mechanism: silence means agreement, and someone who disagrees now has a cheap way to say so. For turning the same notes into a wider email routine, see the email automation prompts.
What about consent and privacy?
I'm not a lawyer and the rules differ by country, state and employer, so treat this as habits, not legal advice.
- Tell people before recording. Say it at the start and put it in the invite. Don't depend on a tool's recording banner alone.
- Know where the transcript goes. A built-in tool inside your company's own meeting platform is a different data path from pasting the transcript into a consumer chatbot. Check your organisation's policy before using any outside AI service on internal or client discussions.
- External parties need an explicit yes. Clients, candidates and vendors should agree to recording and to AI processing, not just attend.
- Keep sensitive meetings out. HR cases, legal advice, medical details, anything under NDA. If you wouldn't forward a written transcript to the tool's vendor, don't paste it.
- Don't keep more than you need. Once the follow-up is sent and checked, delete the raw transcript according to your retention rules.
When is this not worth doing?
Skip it for a five-minute stand-up where nothing was decided. Skip it when the meeting was exploratory and no one committed to anything, since there is nothing to extract and the tool will invent something. And don't use it to settle a disagreement about who promised what. A transcript plus a model is evidence of what was said, not a ruling.
If you run projects, the project manager prompts for status reports and risk logs pick up where this leaves off, with the weekly update built from these action items. If you work in a PM role, the product manager prompt set and the reusable templates in prompt templates I actually use are good places to keep this prompt once it works on your meetings.



