After every meeting, someone had to replay the recording and write up the notes. Whenever the write-up slipped, decisions blurred and ownership became memory-dependent.
Drop the recording into a designated Google Drive folder and the workflow starts on its own. Whisper transcribes the Korean audio to text; GPT produces a one-line title, a 2–3 sentence summary of what was decided, and a list of action items with owner and due date, then posts everything to the team's Slack channel. The team has the notes one minute after the meeting ends.
How it works
Google Drive Triggerpolls a specific folder (e.g.meeting-recordings) and fires when a new file appears.Google Drive Downloadpulls the file as a binary.HTTP RequestPOSTs amultipart/form-datarequest tohttps://api.openai.com/v1/audio/transcriptions— Whisper API transcribes (model: whisper-1,language: ko).HTTP Requestsends the transcript to GPT-4o-mini and asks for{title, summary, action_items[]}JSON (response_format: json_objectenforced).Codenode parses the JSON and formats a Slack-friendly markdown message (title · summary · action items list).Slack Send Messageposts to the target channel.
What you need
- n8n 2.29.9+ (self-hosted or Cloud). Verified against a self-hosted Docker instance.
- Google Drive OAuth2 credential — scope
https://www.googleapis.com/auth/drive. Shared by the Drive Trigger + Download nodes. - Google Drive folder — create one for meeting recordings. Copy the folder ID from its URL (the segment after
folders/). - OpenAI API key — one credential covers Whisper API + Chat API. Billing must be enabled at platform.openai.com.
- Slack Bot User OAuth Token —
chat:writescope./invite @your-botin the target channel. - Cost — Whisper $0.006 / minute + a few cents of GPT-4o-mini per summary. A 45-second standup costs about $0.01 end-to-end.
AI output schema — the JSON GPT returns
{
"title": "one line describing what kind of meeting this was",
"summary": "2–3 sentences on the core decisions and discussion",
"action_items": [
{ "owner": "person or team name mentioned", "task": "what to do", "due": "deadline mentioned, or null" },
...
]
}Actual verification run — 45-second standup recording
Title: Product Standup Meeting
Summary: Billing refactor is done. This week the focus is wrapping the refund flow with a Thursday release target.
The marketing A/B test results will be shared by Friday. The Q3 roadmap draft will be reviewed in Thursday's meeting.
Action items:
1. [CS team] Reprioritize billing-related CS tickets — by next week
2. [Team] Review the Q3 roadmap draft — Thursday
3. [Marketing] Share A/B test results — FridayWhy Whisper over other STT providers
- Korean accuracy — Whisper's
medium/largequality via a single API. No tuning required for most standups, 1-on-1s, or customer calls. - Predictable pricing — $0.006 per minute, flat. No pricing table that shifts with request volume, language, or real-time flag.
- Downside — no real-time. Live streaming needs different tooling. Perfect fit for post-meeting notes, wrong fit for live captions.
- Downside — 25 MB upload cap. Meetings longer than about an hour need to be split with ffmpeg or a chunking preprocessor before transcription.
Technical notes — Whisper takes multipart, summarization enforces JSON
- The Whisper endpoint (
/v1/audio/transcriptions) expectsmultipart/form-data. In n8n's HTTP Request node:Body Content Type: Form-Data (Multipart), one parameter withParameter Type: n8n Binary File,Input Data Field: data. - The GPT summarization call must enable
response_format: { type: 'json_object' }. Without it, valid JSON output isn't guaranteed and the parser can fail. - We use HTTP Request rather than n8n's native OpenAI node for the same reason as sales-report and cs-triage — the native node's chat requests hit an OpenAI onboarding response instead of real completions in some configurations.
Edge cases
- Whisper can't hear anything — silence or noise-only files return a tiny transcript (sometimes just the word 'music'). GPT will still try to summarize it — for production, add an IF node like
if transcript.length < 30 then skipbefore the summarization call. - Whisper mis-transcription — e.g.
A/B testsometimes lands asADB test. GPT can often smooth these over from context, but domain-specific terms (product names, personal names) are the biggest risk. - Files over 25 MB — Whisper returns a 400. Pre-split with
ffmpeg -i input.mp3 -f segment -segment_time 900 -c copy chunk_%03d.mp3for 15-minute chunks, then process sequentially. - Drive polling latency — Drive Trigger polls at ~1-minute intervals. For true real-time, switch to a webhook trigger (needs an external upload notification path).
- Same file re-detected — the Trigger dedupes on file ID, but a safety net is to add a step that moves processed files into a
processed/subfolder.
By the time the meeting ends, the notes are already in Slack. Back-of-mind panic about missing what was said — that's over.— Product Manager