Activate this workflow once and every day at 9AM it automatically processes all Zoom meetings from the past 24 hours — no manual action needed after any call. For each recorded meeting, it downloads the transcript, fetches all participants, and uses Claude 3.7 Sonnet with the Think Tool to write a 6-section structured summary covering key discussion points, decisions, action items, follow-up meeting details, and key quotes. The HTML summary is emailed to every participant individually, action items become ClickUp tasks, follow-up meetings get added to Google Calendar, a Slack notification is sent to your team, and every meeting is logged to Google Sheets. Built for teams who use Zoom for meetings and want complete post-meeting automation without spending time on notes, tasks, or emails after every call.
⚠️ Zoom requirement: This workflow requires a Zoom Pro account or higher with Cloud Recording and Auto-Transcription enabled. Free Zoom accounts do not support cloud transcription.
⚠️ Zoom OAuth2 appears in 4 steps — use the same Zoom credential in 3. Zoom — Get All Meetings, 5. Zoom — Get Recording Data, 7. Zoom — Download Transcript File, and 9. Zoom — Get All Participants.
Estimated Setup Time: 40–50 minutes
Import the workflow — Open n8n → Workflows → Import from JSON → paste the workflow JSON → click Import
Enable Zoom Auto-Transcription — In your Zoom account, go to Settings → Recording → Cloud Recording → enable Auto-transcription. This must be done before any meeting is recorded.
Create a Zoom OAuth app — Go to marketplace.zoom.us → Develop → Build App → OAuth → set scopes to meeting:read and recording:read → get your Client ID and Secret → connect Zoom OAuth2 in n8n credentials
Connect Zoom OAuth2 to all four Zoom steps — Open nodes 3. Zoom — Get All Meetings, 5. Zoom — Get Recording Data, 7. Zoom — Download Transcript File, and 9. Zoom — Get All Participants → select the same Zoom OAuth2 credential in each
Get your Anthropic API key — Log in to console.anthropic.com → go to API Keys → create a new key → connect it in n8n as an Anthropic credential → open node Anthropic — Claude 3.7 Sonnet Model → select this credential
Get your ClickUp API token — In ClickUp, go to Settings → Apps → API Token → copy the token
Get your ClickUp List ID — Right-click any list in ClickUp → click "Copy link" → the List ID is the last segment of the URL after the final /
Add ClickUp credentials to node 16 — Open node 16. HTTP — Create ClickUp Task → in the URL, replace YOUR_CLICKUP_LIST_ID with your actual List ID → in the Authorization header, replace YOUR_CLICKUP_API_TOKEN with your actual token
Connect Google Calendar — Open node 19. Google Calendar — Create Follow-Up → click the credential dropdown → add Google Calendar OAuth2 → authorize access → replace YOUR_CALENDAR_ID in the Calendar field with your actual calendar ID (usually your Google account email address)
Connect Gmail — Open node 12. Gmail — Send to Each Participant → click the credential dropdown → add Gmail OAuth2 → complete the Google authorization flow
Connect Slack — Open node 20. Slack — Send Team Notification → click the credential dropdown → add Slack OAuth2 → authorize access → replace YOUR_SLACK_CHANNEL_ID in the channel field with your actual Slack channel ID (right-click your channel in Slack → Copy link → the channel ID is the last segment)
Create your Google Sheet tab — Open your Google Sheet → add a tab named Meeting Log → add these 9 column headers: Date, Meeting Title, Meeting ID, Duration (min), Participants, Summary Sent, Tasks Created, Follow-up Created, Processed At
Get your Google Sheet ID — Open the spreadsheet in a browser → copy the string between /d/ and /edit
Connect Google Sheets — Open node 21. Google Sheets — Log Meeting → replace YOUR_GOOGLE_SHEET_ID with your actual Sheet ID → add Google Sheets OAuth2 → authorize access
Activate the workflow — Toggle the workflow to Active — it will run at 9AM daily. To run immediately on any meeting, click node 2. Manual Trigger and execute manually.
Steps 1 and 2 — Schedule and Manual Trigger
1. Schedule — Every Day 9AM fires at 9AM daily using the cron expression 0 9 * * *. 2. Manual Trigger lets you run the workflow immediately on demand. Both connect to the same next step — fetching all Zoom meetings.
Step 3 — Zoom: Get All Meetings
The Zoom API is called with OAuth2 to fetch all scheduled meetings for your account. The response returns a list of all meetings.
Step 4 — Filter: Last 24 Hours Only
Each meeting's start_time is checked against a 24-hour window from now minus 24 hours to now. Meetings outside this window are filtered out. Only meetings that actually happened in the last day proceed forward.
Step 5 — HTTP: Zoom — Get Recording Data (with error branch)
The Zoom recordings API is called for each filtered meeting to retrieve its recording files. If the meeting has no recording — because the host did not record it or Cloud Recording was not enabled — the error branch routes to 5b. Stop — No Recording Available which stops gracefully with a clear message instead of crashing.
Step 6 — Code: Extract Transcript URL
The recording files array is scanned for a file with file_type equal to TRANSCRIPT. The download URL is extracted. Meeting metadata — ID, topic, start time, duration — is also packaged. If no TRANSCRIPT file is found (separate from the recording failing), another clear error is thrown.
Step 7 — HTTP: Zoom — Download Transcript File
The VTT transcript file is downloaded from the extracted URL using the Zoom OAuth2 credential for authentication. The file content is returned as plain text.
Step 8 — Code: Parse Transcript Text
The WEBVTT format is parsed — cue numbers and timestamp lines are stripped, leaving only the spoken text lines. All lines are joined into a clean readable transcript. Word count and the meeting metadata from step 6 are also packaged.
Step 9 — HTTP: Zoom — Get All Participants
The Zoom past meetings API is called to fetch all participants from this specific meeting, including their names and email addresses.
Step 10 — Claude 3.7: Generate Meeting Summary
Claude 3.7 Sonnet receives the formatted transcript, participant list, meeting title, date, and duration. The Think Tool is attached — it gives Claude additional reasoning capacity before generating the summary. The system prompt specifies exactly six labeled sections: Meeting Summary, Key Discussion Points, Decisions Made, Action Items (with Task / Owner / Due / Priority format), Follow-up Meeting, and Key Quotes. Claude extracts only what was actually said in the transcript.
Step 11 — Code: Format Email + Split Participants
The Claude summary is converted to HTML with styled headings, bullet lists, and a dark branded header. The participants list is deduplicated by email address. One separate data object is returned per unique participant email so the next step can send individual emails.
Step 12 — Gmail: Send to Each Participant
An HTML summary email is sent to each unique participant email address individually. Each email has the participant's address in the To field, a subject line containing the meeting title and date, and the formatted HTML body.
Step 13 — Code: Extract Action Items
The Action Items section of the Claude summary is parsed using regex. If it is empty or says "None", the workflow returns hasTasks: false. If items are found, they are parsed for the task name, owner, due date, and priority level.
Step 14 — IF: Has Action Items?
If action items were found (YES path), the workflow splits them and creates ClickUp tasks. If no action items (NO path), the workflow skips directly to extracting follow-up meeting info.
Steps 15 and 16 — Code: Split Tasks + HTTP: Create ClickUp Task
The tasks array is split into individual rows — one per task. For each task, a POST request creates a ClickUp task in your specified list with the task name, description, priority (High=1, Medium=2, Low=3), and status set to "to do".
Step 17 — Code: Extract Follow-Up Info
The Follow-up Meeting section of the Claude summary is parsed for a date, topic, and participants. If it says "None scheduled", the workflow returns hasFollowUp: false. If a date is mentioned but cannot be parsed, the follow-up defaults to the next Tuesday at 10AM.
Step 18 — IF: Has Follow-Up?
If a follow-up meeting was mentioned (YES path), a Google Calendar event is created. If not (NO path), the workflow skips directly to the Slack notification.
Step 19 — Google Calendar: Create Follow-Up
A Google Calendar event is created with the follow-up meeting title and time. All meeting participants from step 9 are added as attendees. The event description includes the parsed follow-up section from the Claude summary.
Step 20 — Slack: Send Team Notification
A Slack message is posted to your channel with the meeting title, date, duration, and participant count. Three status lines use checkmarks (✅) or skip arrows (⏭️) to show whether the summary was emailed, tasks were created in ClickUp, and whether a follow-up calendar event was added.
Step 21 — Google Sheets: Log Meeting
One row is appended to your Meeting Log tab with all 9 columns: date, meeting title, meeting ID, duration, participant count, Summary Sent set to Yes, tasks created count, follow-up created (Yes or No), and the current timestamp.
✅ Dual trigger — scheduled and manual — Runs automatically every morning at 9AM and can also be triggered manually any time for immediate processing
✅ Graceful handling when no recording exists — Meetings without cloud recordings stop cleanly with an informative message rather than crashing the entire workflow run
✅ Claude 3.7 Sonnet with Think Tool — The Think Tool gives Claude additional reasoning before writing the summary — producing more accurate extraction of action items and decisions
✅ Participant email deduplication — If someone joined from multiple devices or appears twice in the participant list, they only receive one summary email
✅ Action items only created when found — The ClickUp task creation branch only runs when Claude actually extracted action items — meetings with no tasks skip that branch entirely
✅ Follow-up calendar event with all attendees — When a follow-up is mentioned, the calendar event automatically includes every meeting participant as an invitee
✅ Slack notification shows exactly what was done — The team message uses ✅ and ⏭️ to show which of the three automated actions were taken so everyone knows the status at a glance
Change the daily run time — In node 1. Schedule — Every Day 9AM, edit the cron expression from 0 9 * * * to a different time — for example 0 8 * * * for 8AM or 0 18 * * * for a 6PM end-of-day run.
Add a retry limit for ClickUp task creation — After node 16. HTTP — Create ClickUp Task, add an IF check that routes failed requests (non-200 responses) to a Gmail notification so you know if any task failed to create without crashing the rest of the flow.
Change the action item format in the prompt — If your Claude summary produces action items in a different format from the expected Task: Owner | Due: Date | Priority: Level, edit node 13. Code — Extract Action Items to match your Claude output format — the regex pattern is the key part to update.
Add a second Slack channel for urgent meetings — After node 20. Slack — Send Team Notification, add an IF check that routes meetings with action items labeled High priority to a separate #urgent-tasks Slack channel for immediate team attention.
Extend the 24-hour window to process older meetings — In node 4. Filter — Last 24 Hours Only, change the hours: 24 value in the date comparison to a larger number — for example hours: 48 to catch meetings from the past two days on each run.
Workflow runs but stops at step 5b with "No Recording Available":
Zoom OAuth2 returning 401 errors:
meeting:read and recording:read — missing either scope causes authentication failuresClickUp tasks not being created:
YOUR_CLICKUP_LIST_ID in the URL of node 16. HTTP — Create ClickUp Task is replaced with your actual List ID — get it by right-clicking a list in ClickUp and copying the linkYOUR_CLICKUP_API_TOKEN in the Authorization header is replaced with your Personal API Token from ClickUp Settings → AppsGoogle Calendar event not being created:
YOUR_CALENDAR_ID is replaced with your actual calendar ID — for most users this is their Google account email address; go to Google Calendar → Settings → find your calendar's "Calendar ID" in the integration settingsGoogle Sheets not logging:
YOUR_GOOGLE_SHEET_ID in node 21. Google Sheets — Log Meeting is replaced with your actual Sheet IDNeed help setting this up or want a custom version built for your team or agency?
📧 Email: [email protected]
🌐 Website: https://isawow.com/