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:
```javascript 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.
Want the full guide? Check out our deep-dive page for more context, FAQs, and resources.
read the full guide