Auto-Summarize Zoom Meetings Into Slack in 30 Minutes
Meeting ends. Slack gets a clean summary with action items, owners, and next steps. No more 'what did we decide on that call?' Build it today.
The build: when a Zoom meeting ends with a cloud recording, the transcript runs through an AI summarizer and the result lands in a Slack channel.
Total time: 25-30 minutes if everything cooperates.
What you'll need
- Zoom account with cloud recording enabled
- Slack workspace + ability to add an app
- n8n (or Zapier / Make)
- An AI API key
Step 1: Zoom webhook setup (8 min)
In your Zoom App Marketplace dashboard, create an Event Subscription app. Subscribe to "Recording: Completed" events. Point the webhook URL at your n8n trigger.
n8n side: add a Webhook trigger. Test the connection — Zoom will send a verification request you need to respond to with the challenge token.
If you've never set up a Zoom webhook before, this step takes the longest. Budget 10 minutes.
Step 2: Pull the transcript (5 min)
Zoom's webhook payload includes the recording URL and a download token. Add an HTTP Request node in n8n to fetch the transcript.
Transcript format: VTT (caption format). Parse it with a Code node:
const vtt = $input.first().binary.data.toString();
const lines = vtt.split('\n');
const text = lines
.filter(line => !line.match(/^\d+$/))
.filter(line => !line.match(/-->/))
.filter(line => line.trim() !== '')
.filter(line => line !== 'WEBVTT')
.join(' ');
return [{ json: { transcript: text } }];Step 3: Summarize (8 min)
Add an AI node. Prompt:
Summarize this meeting transcript.
Transcript: {{ $json.transcript }}
Return in this exact markdown format:
**Decisions made:**
- [list, owner in brackets if mentioned]
**Action items:**
- [task] — [owner if mentioned] — [deadline if mentioned]
**Unresolved questions:**
- [question]
**Key context for absent stakeholders:**
- [2-3 bullets]
If a section has no content, say "None" rather than fabricating items.Step 4: Post to Slack (5 min)
Add a Slack node. Channel: #meeting-recaps (or whatever you prefer).
Message format:
:memo: *Meeting recap: {{ topic }}*
_Hosted {{ host_name }}, {{ duration }} minutes, {{ participant_count }} participants_
{{ $json.summary }}
Full transcript: {{ recording_url }}Step 5: Test (4 min)
Record a 5-minute test Zoom meeting. End the meeting. Wait for the recording to process (Zoom takes 2-10 minutes). Check Slack.
If the recap appears, you're done. If not, check n8n's execution log.
Common gotchas
- Zoom's cloud recording takes time to process. Webhook fires when recording is ready, NOT when meeting ends. Allow 5-15 min lag.
- The transcript download URL is signed and expires. Don't store it for later — process immediately.
- AI summaries default to padded output. The "say None rather than fabricating" instruction is essential.
What I do with this
Every Zoom recording auto-recaps into #meeting-recaps. The channel is read-only except for the bot. Team members search the channel when they need to know what was decided on a past call.
Searching Slack for "API design decision" returns the meeting where it was discussed faster than asking around.
What to add next
- Different Slack channels by meeting type (sales calls → #sales-recaps, internal → #team-recaps)
- Auto-create action items in Linear or Asana
- Tag specific people when their name appears as an owner
- Generate a separate email to attendees who missed
Ship the basic version first. Iterate from there.
Get the next one.
Field notes from real deployments, written the way this one was. No schedule promised and nothing sold to you. Unsubscribe whenever.