Field SOP
Field SOP

Meeting Notes Automation Workflow

This n8n workflow automates meeting minutes end to end: after upload, Whisper transcribes the recording, an LLM extracts topics/decisions/action items, and the result goes to Feishu, email, and Notion. Unlike the Meeting Notes Prompt Pack (text-to-minutes only), this is an unattended pipeline - a 30-minute meeting can go from upload to minutes-in-chat in under 3 minutes.

Published July 31, 20265 min read
<!-- workflow-meeting-notes-automation | resource | Meeting Notes Automation Workflow -->

A two-hour meeting followed by another two hours writing up notes - the recording sits in the group chat unheard, or someone burns hours transcribing by hand and still misses key decisions and action items. The more common outcome: someone says “I’ll share the recording later, just listen,” and that’s the last anyone hears. This n8n workflow strings the whole pipeline together: after the recording is uploaded, Whisper transcribes it automatically, an LLM extracts structured minutes (topics / decisions / action items), and the result is distributed to Feishu, email, and Notion - minutes land in teammates’ hands the moment the meeting ends.

If you’ve used the Meeting Notes Prompt Pack to manually feed transcripts to an AI, this upgrades it into an unattended pipeline: the Prompt Pack only covers text-to-minutes, while this workflow automates recording ingestion, transcription, structuring, and delivery end to end. It’s best suited to weekly syncs, project retros, and cross-team coordination meetings - the ones with real decisions and action items that nobody wants to write up. Customer interviews and sales handoffs work too, turning verbal commitments into trackable tasks. Import the template, plug in your API keys, and a 30-minute meeting can go from upload to minutes-in-chat in under 3 minutes.

Workflow Chain

Recording upload (Webhook receives audio URL + meeting title) -> download audio file (HTTP Request) -> Whisper transcription (HTTP Request calls OpenAI speech-to-text API) -> LLM structuring (HTTP Request calls a large model, outputs topics / decisions / action items as JSON) -> Code node parses and assembles the message -> distribute three ways: Feishu group summary + email full text + Notion archive. Once the chain is wired, the only thing the meeting organizer does is hand the recording to the Webhook. Transcription and structuring are the two core hops - transcription decides whether the text is accurate, structuring decides whether the minutes are usable; every other node just moves and distributes data. The per-meeting API cost is essentially Whisper (billed by audio duration) plus one LLM call - a 30-minute meeting runs a few cents, far cheaper than the human time of manual transcription.

Download Template

Setup Steps

  1. Import the template: n8n -> Workflows -> Import from File, pick workflow-meeting-notes-automation.json; you’ll see 8 nodes
  2. Recording upload trigger node: copy the Webhook’s Production URL and hook it to your post-recording callback - meeting software export, Feishu Minutes export, or an OBS upload backend all work; the request body carries audio_url (a downloadable direct link) and meeting_title
  3. Download recording node: HTTP Request GET to fetch the audio file; prefer object-storage presigned URLs (Alibaba OSS / Tencent COS / AWS S3) to avoid large-file transfer timeouts
  4. Whisper transcription node: fill in your OpenAI API key, POST to https://api.openai.com/v1/audio/transcriptions, set model to whisper-1 and response_format to json; for Chinese meetings, passing language: zh noticeably improves accuracy. This node must be configured as multipart/form-data upload, submitting the downloaded audio binary as the file field - don’t set Content-Type by hand, n8n adds the boundary automatically
  5. LLM structuring node: fill in a Kimi / DeepSeek API key - an 8k context model is enough; the prompt is below; require JSON-only output so downstream parsing stays simple. For meetings over an hour, switch to a 32k context model so the transcript isn’t truncated and decisions lost
  6. Code parsing node: use the regex /\{[\s\S]*\}/ to extract the JSON from the LLM output (handles cases where the model wraps it in a markdown code block), then parse topics / decisions / action items and assemble the Feishu message text; on parse failure, fall back to sending the raw text through, so the whole chain doesn’t break
  7. Feishu push node: fill in your custom-bot webhook, POST {"msg_type":"text","content":{"text":"..."}} carrying the meeting title + action-item list
  8. Email node: send the full minutes to attendees via SMTP, subject prefixed with the meeting title
  9. Notion archive node: call the Notion API to create a new page in your “Meeting Minutes” database, writing structured fields into the corresponding properties for later retrieval; share the integration on the target database first, or the API returns 404
  10. Test run: upload a 5-minute test recording and check each stage - transcript correctness, valid JSON from the LLM, Feishu summary delivered, Notion page created

Companion Prompt (LLM Structuring)

Prompt
You are a meeting minutes assistant. Based on the transcript below, output structured minutes (JSON only, no extra text or code blocks):
{
  "topic": "meeting topic (one sentence)",
  "issues": ["discussion points, 3-5 items, one sentence each"],
  "decisions": ["explicit decisions reached"],
  "action_items": [
    {"task": "a concrete actionable task", "owner": "owner; if unclear, mark unassigned", "due": "due date; if unclear, mark TBD"}
  ]
}
Rules:
1. Filter out pleasantries, repetition, and off-topic chatter; keep only what carries information
2. Action items must be executable (“improve the product” is out; “ship login page v2 design by Wednesday” is in)
3. No clear owner -> “unassigned”; no clear date -> “TBD”
4. Stay faithful to the transcript; do not invent unmentioned content
Transcript: {{transcript}}
Compliance: meeting content may contain sensitive business info - use it only to generate minutes; do not use it for model training or share with third parties.

Pitfalls

  • Audio over 25MB rejected: OpenAI Whisper caps a single file at 25MB, roughly 30+ minutes of meeting. Split longer recordings with ffmpeg on silence boundaries, transcribe in batches, then stitch the text; or add a “split” sub-workflow after the download node using the -segment flag
  • Chinese proper nouns misrecognized: Whisper often gets names, jargon, and product names wrong. Feed a “glossary” (attendee names, product names, project codenames) via Whisper’s prompt parameter to cut errors notably; note this prompt is an acoustic hint to Whisper, not an LLM prompt
  • Poor audio quality tanks accuracy: remote meetings suffer from echo, cross-talk, and background noise - feeding that straight to Whisper spikes the error rate. Record each endpoint separately and merge, or run ffmpeg denoise + loudness normalization (afftdn + loudnorm filters) after the download node; preprocessed audio is noticeably more accurate
  • LLM ignores JSON-only: models occasionally wrap output in markdown code blocks or add commentary, breaking the Code node. Enforce “JSON only” in the prompt, add a regex fallback in the Code node (extract from the first { to the last }), and set temperature to 0 if needed
  • Long meetings blow past token limits: a one-hour transcript runs ~15k characters, near the 8k model cap. Switch to a 32k or 200k long-context model for long meetings, or summarize in segments then merge, so decisions aren’t truncated away
  • Feishu bot silently drops messages: if a Feishu custom bot has “keyword filtering” on in its security settings, messages must contain that keyword or they’re dropped; if “signature verification” is on, requests must carry timestamp and sign - compute the HmacSHA256 sign in the Code node first, otherwise messages vanish silently
  • Feishu message truncated: single text messages have a length cap; when action items pile up, send two messages (summary + full list) or switch to the rich-text post type for cleaner layout
  • Notion returns 404 or unauthorized: a new Notion integration sees no pages by default - you must open the target database, click Share, and add the integration, or the API returns 404; database property names must also match the field names in the template
  • Recording compliance: inform participants before recording (meeting-software notice or pre-meeting heads-up). For meetings covering clients, salaries, or contract terms, don’t send transcripts to third-party LLMs - use a locally deployed model instead, and redact before archiving

After it runs, add two enhancements: pull the previous meeting’s action items from Notion and feed them along with the prompt so the LLM also checks completion and flags overdue items; and auto-create each action item as a Feishu task that @-mentions the owner, turning “minutes” into a “trackable execution chain”. For rollout, start with low-frequency weekly or biweekly meetings and confirm transcription and structuring are stable before wiring in daily standups - high-frequency meetings are more sensitive to accuracy and cost, so a full rollout on day one easily backfires. Re-review transcript and structuring accuracy on a few meetings each month, and feed misrecognized terms back into the Whisper glossary so the pipeline keeps improving.


References

This article is AI-assisted and human-edited. Last updated: 2026-07-31

Related