// 30-min buildsby JoshMay 11, 20265 min read

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.

Auto-Summarize Zoom Meetings Into Slack in 30 Minutes

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.

zoomslackaimeetingsautomation30 min build
// go deeper

Want the full guide? Check out our deep-dive page for more context, FAQs, and resources.

read the full guide
// keep reading

Related posts

// ready to ship?

Let's build yours.

Reading is the easy part. We do the work. Tell us what's broken and we'll tell you straight up whether we can help.