Google Calendar + Slack: meeting briefs, always ready
You open a meeting invite and realize you don’t remember the last conversation with half the attendees. Then the hunt starts: Gmail search, scrolling threads, piecing together context from three different places.
This hits account managers hard when calendars are stacked back-to-back. Founders feel it too, because every call has stakes. And consultants can’t afford to sound fuzzy. With Calendar Slack briefs, you get a ready-to-skim pre-meeting summary in Slack before the call.
This workflow checks your upcoming meetings, pulls recent Gmail correspondence per attendee, uses AI to summarize it, and sends a crisp briefing to Slack. You’ll see what it does, why it matters, and what you need to run it reliably.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Calendar + Slack: meeting briefs, always ready
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:message-outline", form: "rounded", label: "Get Message Contents", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Simplify Emails", pos: "b", h: 48 }
n2@{ icon: "mdi:location-exit", form: "rounded", label: "Check For Upcoming Meetings", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Extract Attendee Information", pos: "b", h: 48 }
n4@{ icon: "mdi:message-outline", form: "rounded", label: "Get Last Correspondence", pos: "b", h: 48 }
n5@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Return Email Success", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has Emails?", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Attendees to List", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has Email Address?", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Correspondance Recap Agent", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Attendee Research Agent", pos: "b", h: 48 }
n12@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Model", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send a message"]
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Model3", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Model2", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Return Email Error", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Return Email Error2", pos: "b", h: 48 }
n7 --> n0
n7 --> n17
n12 -.-> n3
n15 -.-> n10
n14 -.-> n11
n1 --> n10
n5 --> n2
n8 --> n9
n9 --> n4
n9 --> n16
n0 --> n1
n6 --> n11
n11 --> n13
n4 --> n7
n10 --> n6
n2 --> n3
n3 --> n8
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n5 trigger
class n3,n10,n11 ai
class n12,n14,n15 aiModel
class n7,n9 decision
classDef customIcon fill:none,stroke:none
class n13 customIcon
The Problem: You’re Walking Into Meetings Without Context
Meeting prep sounds simple until you’re doing it five times a day. You search Gmail for an attendee’s name, open the most recent thread, then realize the real detail is buried three replies earlier (or in a forwarded chain with no subject). Now multiply that by two or three attendees, plus the “oh right” moment when you remember there was a HubSpot note or a promised follow-up. It’s not just time. It’s mental switching, missed details, and that nagging feeling you’re reacting instead of leading the call.
The friction compounds. Here’s where it breaks down in real life.
- Prepping for a single meeting can easily take 15 minutes of inbox digging, especially when the thread is long.
- Important context gets missed because you only skim the most recent email, not the full chain.
- You show up “technically present” but spend the first five minutes remembering what was decided last time.
- When your calendar fills up, prep is the first thing you drop, and quality quietly slips.
The Solution: AI Meeting Briefs Delivered to Slack
This n8n workflow turns meeting prep into something that happens automatically in the background. Every hour, it checks your Google Calendar for meetings starting soon. For each meeting, it pulls the attendee list, extracts usable attendee details (like email addresses), and then searches Gmail for the latest correspondence with each person. When it finds relevant threads, it fetches the email body, cleans up the fields so the AI can read it properly, and generates a tight summary of what’s been discussed. Finally, it composes a single meeting brief and delivers it to Slack, so you see it right where you already work.
The workflow starts with an hourly schedule that looks one hour ahead in Google Calendar. Then Gmail is used to find and summarize recent correspondence per attendee. Last, an AI-generated meeting brief is sent to your Slack channel or DM, ready to skim in under a minute.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you have 4 meetings a day, and each has 2 attendees you need to “catch up” on. Manually, you might spend about 10 minutes per attendee searching Gmail and skimming threads, which is roughly 80 minutes a day. With this workflow, prep becomes: 1 minute to glance at the Slack brief, then you’re done. The hourly check runs on its own, so you get most of that time back without relying on willpower.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Calendar to detect meetings starting soon.
- Gmail for pulling recent email threads and bodies.
- Slack to deliver the brief where you’ll actually read it.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, enable a couple Google APIs, and test a few runs to confirm formatting.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Hourly meeting check. A schedule trigger runs every hour and asks Google Calendar for meetings that start within the next hour. No meetings, no noise.
Attendee details get cleaned up. The workflow parses the attendee list and extracts structured information (especially emails). That matters because the next step depends on having a valid address for Gmail search.
Gmail context is pulled and summarized. For each attendee with an email, the workflow retrieves the latest correspondence, fetches the email body, normalizes the fields, and sends it through an OpenAI-powered summarizer. If there’s nothing useful to summarize, it uses a fallback so your brief still sends.
A single Slack brief is composed and delivered. The final AI step compiles the summaries into a short, information-dense message and posts it to Slack. You can aim it at a private channel, a team channel, or a DM.
You can easily modify where the brief is sent (channel vs. DM) and how far ahead it looks (one hour vs. two) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow starts on an hourly schedule to check upcoming meetings.
- Add and open Hourly Schedule Starter.
- Set Rule to an hourly interval (already configured as hours in the node’s rule field).
- Leave this node connected to Fetch Upcoming Meetings as shown in the execution flow.
Tip: Keep the interval to hours to match the date window used later in Fetch Upcoming Meetings.
Step 2: Connect Google Calendar
Pull the next meetings in the next two hours to prepare briefings.
- Open Fetch Upcoming Meetings.
- Credential Required: Connect your googleCalendarOAuth2Api credentials.
- Set Operation to
getAlland Limit to5. - Set Time Min to
{{ $now.toUTC().plus(1, 'hour').startOf('hour') }}and Time Max to{{ $now.toUTC().plus(2, 'hour').startOf('hour') }}. - Select your calendar by replacing
[YOUR_ID]in the Calendar field.
⚠️ Common Pitfall: Leaving [YOUR_ID] will cause the calendar fetch to fail. Replace it with your actual calendar ID.
Step 3: Set Up Attendee Extraction and Splitting
Extract attendees from the meeting details, then split each attendee into separate items for correspondence lookup.
- Open Parse Attendee Details and confirm Text uses the template:
start: {{ $json.start.dateTime }} meeting url: {{ $json.hangoutLink }} summary: {{ $json.summary }} description: {{ $json.description }} organizer: ({{ $json.organizer.email }}) attendees: {{ $json.attendees.filter(item => !item.organizer).map(item => item.email).join(',') }} - Ensure the manual Input Schema stays as defined to extract
name,email, andlinkedin_url. - Confirm OpenAI Chat Engine is connected as the language model for Parse Attendee Details; add credentials to OpenAI Chat Engine, not the sub-node.
- Open Split Attendee Records and set Field To Split Out to
output.attendees. - Keep the connection flow Parse Attendee Details → Split Attendee Records → Validate Email Presence.
Tip: If meeting descriptions contain attendee details, the system prompt in Parse Attendee Details helps infer missing fields.
Step 4: Retrieve and Summarize Email Correspondence
This segment finds the most recent email with each attendee, summarizes it, and stores the summary for later use.
- Open Validate Email Presence and keep the condition where Left Value is
{{ $json.email }}with Operationexists. - Open Retrieve Latest Correspondence, set Operation to
getAll, Limit to1, and Sender to{{ $json.name }}. - Credential Required: Connect your gmailOAuth2 credentials in both Retrieve Latest Correspondence and Fetch Email Body.
- Open Check Email Results and keep the condition where Left Value is
{{ $json }}with OperationnotEmpty. - Open Fetch Email Body and set Message ID to
{{ $json.id }}. - Open Normalize Email Fields and verify the assignments use expressions like
{{ $json.date }},{{ $json.subject }}, and{{ $json.text }}. - Open Summarize Correspondence and confirm Text uses:
from: {{ $json.from }} to: {{ $json.to }} date: {{ $json.date }} subject: {{ $json.subject }} text: {{ $json.text }} - Confirm OpenAI Recap Engine is connected as the language model for Summarize Correspondence; add credentials to OpenAI Recap Engine, not the sub-node.
- Open Store Email Summary and set email_summary to
{{ $json.text }}. - Keep the fallback path from Validate Email Presence to Fallback Email Summary and from Check Email Results to Fallback Empty Summary to avoid empty summaries.
⚠️ Common Pitfall: If Retrieve Latest Correspondence returns no data, ensure Fallback Email Summary and Fallback Empty Summary remain connected to prevent blank briefs.
Step 5: Generate the Meeting Brief with AI
Compile meeting details and attendee summaries into a single briefing message.
- Open Compose Meeting Brief and confirm Text uses the multi-line template referencing Fetch Upcoming Meetings, including expressions like
{{ $('Fetch Upcoming Meetings').item.json.start.dateTime }}. - Keep the attendee summary block intact, including the fallback message:
We have not had any correspondance with ${item.email}. - Confirm OpenAI Brief Engine is connected as the language model for Compose Meeting Brief; add credentials to OpenAI Brief Engine, not the sub-node.
Tip: The prompt in Compose Meeting Brief formats output like an SMS message. Keep this if Slack messages should be concise.
Step 6: Configure Slack Delivery
Send the final briefing to a specific Slack user.
- Open Send Slack Update and set Text to
{{ $json.text }}. - Credential Required: Connect your slackApi credentials.
- Select the target user by replacing
[YOUR_ID]in the User field.
⚠️ Common Pitfall: If [YOUR_ID] is not replaced, Slack delivery will fail even if credentials are valid.
Step 7: Test and Activate Your Workflow
Verify end-to-end behavior before enabling the hourly trigger.
- Click Execute Workflow to run a manual test starting from Hourly Schedule Starter.
- Confirm that Fetch Upcoming Meetings returns events within the next hour window and that Split Attendee Records produces individual attendee items.
- Verify that email summaries are stored in Store Email Summary and that Compose Meeting Brief produces a single briefing message.
- Check Slack to confirm Send Slack Update delivers the message to the selected user.
- Toggle the workflow to Active to enable hourly production runs.
Common Gotchas
- Google (Gmail/Calendar) credentials can expire or need specific permissions. If things break, check your Google Cloud project’s enabled APIs and the connected credential in n8n first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Google, Slack, and OpenAI accounts are ready.
No. You’ll mostly connect accounts and paste in credentials. The “hard part” is just testing with a real meeting to confirm the brief reads well.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs, which are usually a few cents per brief depending on length.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the easiest tweaks. Update the Google Calendar “Fetch Upcoming Meetings” time window so it looks two hours ahead, then adjust the message text in the “Compose Meeting Brief” AI step to match. Common customizations include changing the Slack destination, limiting which calendars are monitored, and adding a short “agenda guess” line based on the invite title.
Usually it’s expired OAuth credentials or missing Google API access. Make sure the Gmail API and Google Calendar API are enabled in your Google Cloud project, then reconnect the Google credential inside n8n so the scopes are refreshed. If it still fails, check whether the account you connected actually has access to the calendar you’re querying. Rarely, Gmail search returns a thread but the message body fetch is blocked by permissions, which looks like “empty data” downstream.
A normal calendar load is fine; most teams run this hourly without issues.
Often, yes, because this workflow has branching logic, fallbacks for missing email data, and multi-step AI processing. Those “little details” are what keep it from spamming you with half-empty briefs, honestly. n8n also gives you a self-host option, which can matter once you’re running hourly checks and summarizing threads regularly. Zapier and Make can still work, but you may end up juggling multiple Zaps/scenarios to replicate the same behavior. Talk to an automation expert if you want a quick recommendation for your exact setup.
Your calendar shouldn’t force you into last-minute inbox archaeology. Set this up once, and your meetings start with clarity instead of catch-up.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.