The Challenge
Almost nobody takes good meeting notes, and the reasons are structural rather than personal.
Taking notes competes with participating. The person best placed to record what was decided is usually the person doing the most talking. So notes get written by whoever is least engaged, or they get written afterwards from memory, or — most commonly — they do not get written at all and the meeting's output survives only in the heads of the people who attended.
The consequence is not the missing document. It is the re-litigation. Two weeks later nobody remembers whether the decision was "we will migrate in Q3" or "we should look at migrating in Q3", and the difference costs another meeting. Action items are worse: an owner who was never explicitly named is an action item that does not happen.
Three specific difficulties make automation harder than it looks:
Meetings are not documents. Spoken language is full of false starts, interruptions, half-finished sentences, and — critically — hypotheticals. A transcript is not a first draft of notes; it is a much messier input than an article.
Attribution matters and is easily lost. "Should we push the launch?" means something entirely different depending on whether the VP or a new hire said it. A summariser without reliable speaker labels will assign ownership by guessing.
The recording itself is a liability. A meeting recording is personal data about identifiable people, frequently discussing other identifiable people. Consent rules vary by jurisdiction and are commonly ignored by teams who install a bot and forget about it.
How AI Solves It
The pipeline has three stages, and most failures are in the third.
Speech to text with diarization. Audio becomes a timestamped transcript with speaker labels. Diarization — the labelling step — is separate from transcription and often noticeably worse. A transcript that says "Speaker 3" for four different people will silently corrupt everything downstream.
Structured extraction, not summarisation. This is the step teams get wrong. Asking a model to "summarise this meeting" produces prose that reads well and cannot be checked. Asking it to return a defined structure — decisions, action items with owners, open questions, each with a verbatim supporting quote — produces something a reader can verify in seconds.
The structured output requirement is doing real work here. When every extracted action item must carry the exact words that justify it, the most common failure mode becomes visible rather than invisible.
Verification against the transcript. Before the notes are published, check that each supporting quote actually appears in the transcript. An item whose quote cannot be found is discarded, not softened. This single check eliminates most fabricated action items, because a model that invents an obligation generally has to invent the quote too.
That is the whole mechanism. The interesting part is not the summarisation — models have been adequate at that for years — it is the discipline that makes the output trustworthy enough that people stop taking their own notes in parallel. Until they do, you have added a step rather than removed one.
Recommended Tools & Models
| Option | Best for | Cost signal | Trade-off |
|---|---|---|---|
| NotebookLM | Individuals, no setup | Free tier | Upload-based; not a pipeline you can automate |
| Descript | Teams already editing audio | Subscription | Strong transcription and diarization; editorial rather than operational |
| Claude | Extraction from an existing transcript | Subscription or API | Best judgement on hypothetical vs committed language |
| Notion AI | Teams whose notes live in Notion | Per seat | Least friction to adoption; least control over the prompt |
| Ollama | Confidential meetings | Free, self-hosted | Nothing leaves your hardware; you run the infrastructure |
| Whisper-class local STT | Transcription at zero marginal cost | Free | Diarization quality varies; needs a GPU for speed |
For the extraction step, Claude Haiku 4.5 at $1 / $5 per million tokens handles routine meetings well. Move to Claude Sonnet 5 for meetings where the distinction between a suggestion and a commitment carries weight — the stronger model is measurably better at not flattening conditional language, which is the dominant error in this task.
Choose the confidentiality tier first. For HR conversations, legal discussions, board meetings, or anything under NDA, local transcription plus a local model is the only configuration that does not require a vendor conversation. That constraint decides the stack; everything else is preference.
Step-by-Step Implementation
Step 1: Settle consent before you record anything
Announce recording at the start of every meeting, in words, and keep that announcement in the recording. Several US states require all-party consent; under GDPR a recording of identifiable participants is personal data needing a lawful basis and a retention period.
Decide three things now, not later:
- Who can start a recording — and whether external participants must be asked separately.
- How long recordings are kept. Indefinite retention is a decision, and usually the wrong one. Thirty to ninety days covers almost every legitimate use.
- Which meetings are never recorded. Write the list down. Performance reviews and anything involving legal counsel belong on it.
Step 2: Get a transcript with real speaker labels
Run speech-to-text with diarization enabled. Then spend ten minutes checking the output on one real meeting, specifically for these failures:
- Two people merged into one speaker label
- One person split across several labels
- Crosstalk attributed to whoever was louder
- Names in the transcript that were never mapped to speaker labels
Map speaker labels to real names once per recurring meeting and reuse the mapping. If your tool cannot hold that mapping, add it as a post-processing step — everything downstream depends on it.
Step 3: Extract structure, with quotes
Extract the following from this meeting transcript. Use ONLY what was
actually said.
For every item, include `quote`: the exact words from the transcript
that justify it. If you cannot supply a verbatim quote, do not include
the item.
Distinguish carefully between:
- a DECISION (something was settled)
- an ACTION (someone committed to do something)
- a SUGGESTION (something was floated, not agreed)
Hypothetical or conditional language ("we could", "maybe we should",
"what if we") is a SUGGESTION, never an ACTION.
Return JSON:
{
"decisions": [{"text": string, "quote": string, "speaker": string}],
"actions": [{"text": string, "owner": string | null,
"due": string | null, "quote": string,
"speaker": string}],
"suggestions":[{"text": string, "quote": string, "speaker": string}],
"open_questions": [{"text": string, "quote": string}],
"summary": string
}
Set "owner" to null if no one explicitly took the action. Do not infer
an owner from context.
Transcript:
{{transcript}}
Two clauses carry most of the value. The decision/action/suggestion distinction is what stops "we could ask legal" becoming a task. And "owner": null when nobody volunteered is what stops the model assigning work to whoever spoke last.
Step 4: Verify quotes before publishing
Programmatically confirm each quote appears in the transcript. Allow for minor whitespace differences; do not allow paraphrase. Discard any item that fails.
This is a dozen lines of code and it is the difference between notes people check and notes people trust.
Step 5: Publish in a fixed shape, with the transcript attached
Post the same structure every time — decisions, then actions with owners, then open questions, then a short summary — and link the full transcript. The fixed shape means people learn where to look; the attached transcript means anyone can check a claim in seconds.
Put unowned actions in a visible "needs an owner" section rather than hiding them. An action item with no owner is the single most useful thing these notes surface, because it is exactly what a meeting produces and then loses.
Step 6: Watch whether people stop taking their own notes
This is the real success criterion and it takes a few weeks. If participants keep a private notepad open, the output is not trusted yet, and the reason is almost always a specific past error they remember. Find it and fix that failure mode rather than tuning the prompt generally.
Real-World Examples
Before — generic summarisation.
Transcript excerpt: "…so we could maybe move the launch to October if the security review isn't done. I mean, I'd want Priya to weigh in first. Anyway — Tom, can you get the migration script reviewed this week?"
AI notes: "The team decided to move the launch to October pending the security review. Priya will assess the security review. Tom will review the migration script."
Three errors in one sentence of output. The launch move was conditional and was not decided. Priya was not present and took on nothing. Only the third item is real.
After — structured extraction with quotes.
{
"decisions": [],
"actions": [
{
"text": "Get the migration script reviewed",
"owner": "Tom",
"due": "this week",
"quote": "Tom, can you get the migration script reviewed this week?",
"speaker": "Dana"
}
],
"suggestions": [
{
"text": "Move the launch to October if the security review is incomplete",
"quote": "we could maybe move the launch to October if the security review isn't done",
"speaker": "Dana"
}
],
"open_questions": [
{
"text": "Priya's view on the security review timing",
"quote": "I'd want Priya to weigh in first"
}
]
}
The conditional survived as a suggestion. The absent person did not acquire a task. The one real commitment has an owner and a deadline, both stated aloud.
After — diarization failure caught early.
Raw transcript: "Speaker 2: I'll take the vendor comparison. Speaker 2: Actually I'm out next week, can someone else?"
Two different people, one label. Extracted naively, this produces an action item assigned to someone who explicitly declined it.
This is why step 2 exists. Reviewing diarization on one real meeting before trusting the pipeline catches a class of error no prompt can fix.
Best Practices
Never let the model infer an owner. If nobody said a name, the owner is null. An assigned-by-inference task is worse than a missing one, because it looks authoritative and the supposed owner never saw the meeting.
Keep the transcript, not just the notes — subject to your retention policy. The notes are a lossy derivative; disputes are settled against the transcript.
Send notes within the hour. Corrections happen when the meeting is still fresh. A summary that arrives the next morning gets skimmed and never corrected, which is how a wrong record becomes the record.
Use a different prompt for different meeting types. A standup produces actions and blockers. A design review produces decisions and open questions. A one-to-one should probably not be processed at all. One universal prompt yields mediocre output for every case.
Redact before the transcript leaves your systems if you are using a hosted model. Salary figures, health details and named performance concerns turn up in ordinary meetings without anyone planning it.
Give people a correction path that takes one click. If fixing a wrong action item requires editing a document nobody owns, nobody fixes it.
Common Pitfalls
Fabricated action items. The dominant failure, and it comes from the model flattening conditional language into commitments. The verbatim-quote requirement plus the suggestion category is the fix; nothing else reliably works.
Trusting diarization silently. Speaker labels are the weakest link and the least inspected. Check them on real audio from your actual meeting setup — conference-room microphones behave nothing like individual headsets.
Recording without consent. Easy to do accidentally with an always-on bot, and the consequences range from an awkward conversation to a regulatory one. The rule follows the participants' locations, not the organiser's.
Processing sensitive meetings on the default stack. The meeting that most needs a good record — a disciplinary conversation, an incident post-mortem, a board discussion — is usually the one that must not go to a third-party API.
Long meetings overflowing context. A three-hour workshop can exceed a small model's context window or degrade its attention across the middle. Chunk by agenda item or by natural breaks, extract per chunk, then merge — see chunking.
Summarising a one-to-one. Technically easy, socially corrosive. People speak differently when they know a machine is writing it down.
Measuring Success
The metrics that matter are about trust and follow-through, not about output volume.
- Action item completion rate — the point of the whole exercise. Compare against the period before automation.
- Correction rate — how often someone edits a published note, and what they change. Corrections concentrated in owners means diarization; concentrated in decisions means the suggestion boundary.
- Parallel note-taking — the honest adoption signal. Ask directly after a month.
- Time to publish — measured in minutes after the meeting ends.
- Fabrication rate — sample twenty meetings by hand each month and count items that should not exist. This will not appear in any dashboard and is the number most worth knowing.
Do not measure summary length, word count, or "meetings processed". All three go up while quality goes down.
Cost Analysis
Model cost for a one-hour meeting on Claude Haiku 4.5 at $1 / $5 per million tokens (list pricing, August 2026):
- Speech at roughly 150 words per minute → ~9,000 words for 60 minutes
- At ~1.33 tokens per word → ~12,000 input tokens
- Structured output: ~800 tokens
- Input: 12,000 / 1,000,000 × $1 = $0.012
- Output: 800 / 1,000,000 × $5 = $0.004
- Per meeting: ≈ $0.016
A hundred hour-long meetings a month costs about $1.60 in model spend. Transcription is free with local Whisper-class models, or a few cents per hour through an API.
The comparison worth making is not against a notetaker's salary — most meetings have no notetaker, which is the actual problem. It is against the 10–20 minutes someone spends writing up a meeting afterwards, and against the meetings that get repeated because nobody recorded the decision.
The real cost of this project is not tokens. It is the few hours of setup, the consent policy you have to actually write, and the weeks it takes before people trust the output enough to close their own notepads. Budget for the last one; it is the only part that determines whether any of it pays back.
Related Use Cases
- AI for Podcast Show Notes — the same transcript pipeline aimed at publishing rather than internal record
- AI for Survey Analysis — structured extraction from unstructured human input
Related Tools
- NotebookLM — quickest path for an individual
- Descript — transcription and diarization with editing
- Claude — extraction and structured output
- Notion AI — for teams whose notes already live there
- Ollama — local models for confidential meetings
Related Models
- Claude Haiku 4.5 — the routine default
- Claude Sonnet 5 — for meetings where suggestion versus commitment matters