Google Calendar + Slack: daily updates, no chasing
Your calendar changes. People miss the update. Then you spend the first 20 minutes of the day answering “Are we still on?” and “Where’s the link?” It’s not hard work. It’s just relentless.
This hits team leads who run their day in Slack, but ops managers and client-facing agencies feel it too. A Slack calendar digest automation keeps everyone aligned without you playing human router.
This n8n workflow logs every new, updated, and canceled Google Calendar event into Google Sheets, then posts a daily Slack summary with meeting stats. You’ll see how the pieces fit together, what you need, and where people usually get stuck.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Calendar + Slack: daily updates, no chasing
flowchart LR
subgraph sg0["New Event Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "New Event Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Updated Event Trigger", pos: "b", h: 48 }
n3["<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/code.svg' width='40' height='40' /></div><br/>Process Event"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Canceled?", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Log Event", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Log Cancellation", pos: "b", h: 48 }
n7["<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/>Slack - New Event"]
n8["<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/>Slack - Cancellation"]
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has Attendees?", pos: "b", h: 48 }
n10["<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/code.svg' width='40' height='40' /></div><br/>Prepare Confirmation Email"]
n11@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Done - Event", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Done - Cancellation", pos: "b", h: 48 }
n5 --> n7
n11 --> n19
n4 --> n6
n4 --> n5
n3 --> n4
n9 --> n10
n9 --> n19
n6 --> n8
n0 --> n3
n7 --> n9
n8 --> n20
n1 --> n3
n10 --> n11
end
subgraph sg1["Daily Summary Flow"]
direction LR
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Daily Summary Trigger", pos: "b", h: 48 }
n12@{ icon: "mdi:location-exit", form: "rounded", label: "Get Today Events", 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/code.svg' width='40' height='40' /></div><br/>Calculate Statistics"]
n14["<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/>Slack - Daily Summary"]
n15@{ icon: "mdi:database", form: "rounded", label: "Log Statistics", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Done - Summary", pos: "b", h: 48 }
n15 --> n21
n12 --> n13
n13 --> n14
n2 --> n12
n14 --> n15
end
subgraph sg2["Error Flow"]
direction LR
n16@{ icon: "mdi:play-circle", form: "rounded", label: "Error Trigger", pos: "b", h: 48 }
n17["<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/code.svg' width='40' height='40' /></div><br/>Format Error"]
n18["<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/>Slack - Error Alert"]
n17 --> n18
n16 --> n17
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 n0,n1,n2,n16 trigger
class n4,n9 decision
class n5,n6,n15 database
class n3,n10,n13,n17 code
classDef customIcon fill:none,stroke:none
class n3,n7,n8,n10,n13,n14,n17,n18 customIcon
The Problem: Calendar Updates Get Lost in the Shuffle
Calendar hygiene breaks down in normal, everyday ways. A meeting gets moved, but the right people don’t notice. A Zoom link changes, and someone joins the old one. A stakeholder cancels, but your team still preps because nobody saw the cancellation in time. Then you try to “fix it” with a manual daily message, which works until you get busy, travel, or simply forget. Meanwhile, you have no clean record of what actually happened, so patterns like “we’re in meetings all day” stay a gut feeling instead of something you can act on.
It adds up fast. Here’s where it breaks down in real teams.
- You end up copying event details into Slack by hand, and it’s easy to miss the meeting link or time zone.
- Cancellations are the worst because they look “silent,” so people keep showing up anyway.
- Without a consistent log, it’s hard to answer basic questions like “how many demos did we run last week?”
- When the schedule changes mid-day, the mental load spikes because you have to remember who needs to know.
The Solution: Google Calendar → Sheets Log + Daily Slack Digest
This workflow turns your calendar into a system your team can trust. When a new event is created in Google Calendar, n8n captures the details, normalizes them (title, time, duration, attendees, meeting platform), and appends a clean row into an “Events” tab in Google Sheets. If an event changes, the same pipeline runs so your log stays current. If an event is canceled, the workflow records the cancellation in a separate “Cancellations” tab and posts an alert to Slack, so nobody is operating on stale info. At 8AM, it pulls the day’s events, calculates meeting-time stats, and posts a Slack summary that doubles as a daily briefing and a lightweight dashboard.
The workflow starts with Google Calendar triggers for new and updated events, plus a daily schedule trigger for the morning digest. In the middle, code steps categorize meetings (Meeting, 1:1, Interview, Demo, Focus Time) and detect platforms like Google Meet, Zoom, or Teams. Finally, Slack gets the notifications and Google Sheets becomes your source of truth.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team has 12 events in a typical day, and you manually post a quick Slack note for new meetings, changes, and cancellations. If each update takes maybe 2 minutes to write (time, link, attendees, channel), that’s roughly 20–30 minutes a day once reality kicks in. With this workflow, you spend about 10 minutes setting up the Sheet and Slack channels, then day-to-day effort is basically zero. The 8AM digest lands automatically, and cancellations trigger an alert the moment they happen.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Calendar for event triggers and daily retrieval.
- Google Sheets to store logs, cancellations, and stats.
- Slack for the daily digest and alerts.
- OpenAI API key (get it from the OpenAI API dashboard).
Skill level: Intermediate. You’ll connect accounts and paste a Google Sheet ID into the right nodes.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new or updated calendar event kicks it off. n8n listens to Google Calendar for creates and updates, so you don’t rely on someone remembering to “announce” meetings in Slack.
Event details get cleaned and categorized. The workflow parses title, start/end time, duration, attendees, and meeting link, then assigns a category like 1:1 or Demo. It also detects the platform (Google Meet, Zoom, Teams) so the digest stays readable.
Cancellations take a different path. An “If” check routes canceled events to a cancellation log in Google Sheets and posts a Slack alert, which means the team sees it before they waste time.
At 8AM, the daily summary gets posted. The schedule trigger pulls today’s events, computes meeting time and counts, then sends a Slack digest plus appends stats into the “Statistics” tab for longer-term trend tracking.
You can easily modify the Slack message format to match your team’s style, or change the 8AM schedule to a different time zone based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger Type
Set up the three triggers that start the event-monitoring and daily digest flows.
- Open New Event Watcher and set Trigger On to
eventCreated, with Calendar set toprimary. - In New Event Watcher, confirm the poll interval is
everyMinute. - Open Updated Event Watcher and set Trigger On to
eventUpdated, with Calendar set toprimary. - In Updated Event Watcher, confirm the poll interval is
everyMinute. - Open Daily Digest Schedule and set the schedule rule to the cron expression
0 8 * * *to run at 8:00 AM daily.
Credential Required: Connect your Google Calendar credentials for New Event Watcher and Updated Event Watcher.
Credential Required: Connect your Google Calendar credentials for Daily Digest Schedule if your instance requires authenticated scheduling access.
Step 2: Connect Google Services
Configure Google Calendar and Google Sheets nodes that store logs and compile daily statistics.
- Open Retrieve Today's Events and set Operation to
getAll. - In Retrieve Today's Events, set Time Min to
{{ $now.startOf('day').toISO() }}and Time Max to{{ $now.endOf('day').toISO() }}. - Open Append Event Log and set Operation to
append, Sheet Name toEvents, and Document ID to[YOUR_ID]. - Map the columns in Append Event Log to the provided expressions, such as ID →
{{ $json.eventId }}and Synced At →{{ $json.syncedAtFormatted }}. - Open Record Cancellation and set Operation to
append, Sheet Name toCancellations, and Document ID to[YOUR_ID]. - Open Append Summary Stats and set Operation to
append, Sheet Name toStatistics, and Document ID to[YOUR_ID].
Credential Required: Connect your Google Calendar credentials for Retrieve Today's Events.
Credential Required: Connect your Google Sheets credentials for Append Event Log, Record Cancellation, and Append Summary Stats.
[YOUR_ID] with your actual spreadsheet ID in all three Google Sheets nodes, or the append operations will fail.Step 3: Set Up Processing Nodes
These nodes parse event data, branch based on cancellations, and compute email content and daily metrics.
- Open Parse Event Details and keep the provided JavaScript Code to normalize event fields and compute metadata.
- In Check Cancellation, set the boolean condition to Value 1
{{ $json.cancelled }}equals Value 2true. - In Check Attendee Count, set the number condition to Value 1
{{ $('Parse Event Details').item.json.attendeeCount }}with Operationlarger. - Open Build Confirmation Email and keep the JavaScript Code that assembles the HTML email using data from Parse Event Details.
- Open Compute Daily Metrics and keep the JavaScript Code that calculates
busyPercent, meeting totals, and the event list.
Step 4: Configure Output and Notification Nodes
Send Slack notifications, dispatch emails, and finalize each flow branch.
- Open Post Slack New Event and set Text to
:calendar: *New calendar event*. - Open Post Slack Cancellation and set Text to
:x: *Event canceled*. - Open Post Daily Summary and set Text to
:chart_with_upwards_trend: *Daily Summary*. - Open Dispatch Email Notice and set Send To to
{{ $json.to }}, Subject to{{ $json.subject }}, and Message to{{ $json.htmlContent }}. - Keep Finish Event Flow, Finish Cancellation, and Finish Summary Flow as no-op end points for their respective branches.
Credential Required: Connect your Slack credentials for Post Slack New Event, Post Slack Cancellation, Post Daily Summary, and Post Error Alert.
Credential Required: Connect your Gmail credentials for Dispatch Email Notice.
Step 5: Add Error Handling
Route workflow failures to Slack with a structured error payload.
- Open Error Handler Trigger to ensure it is connected to Shape Error Payload.
- In Shape Error Payload, keep the JavaScript Code that outputs
errorTime,errorMessage, anderrorNode. - Open Post Error Alert and set Text to
:rotating_light: *Workflow Error*, with Include Link to Workflow enabled.
Step 6: Test and Activate Your Workflow
Validate the event flow, cancellation flow, daily digest, and error handling before turning it on.
- Use New Event Watcher to create a test event and run the workflow manually to confirm Parse Event Details → Append Event Log → Post Slack New Event → Check Attendee Count → Build Confirmation Email → Dispatch Email Notice executes correctly.
- Update or cancel an event to verify Updated Event Watcher triggers Check Cancellation and routes to Record Cancellation → Post Slack Cancellation when
{{ $json.cancelled }}is true. - Run Daily Digest Schedule manually to verify Retrieve Today's Events → Compute Daily Metrics → Post Daily Summary → Append Summary Stats.
- Force an error (e.g., temporarily remove a credential) to confirm Error Handler Trigger → Shape Error Payload → Post Error Alert posts a Slack alert.
- When tests succeed, toggle the workflow Active to enable continuous monitoring.
Common Gotchas
- Google Calendar access can be deceptive. If events aren’t coming through, double-check the connected Google account and calendar selection inside the Google Calendar trigger node.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Slack posting failures are often permissions-related. Confirm the Slack app can post to the target channel (for example #calendar and #errors) and that the channel hasn’t been renamed.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30–45 minutes if your Google and Slack accounts are ready.
No. You’ll connect your accounts and update a Google Sheet ID in the Sheets nodes.
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 usage (usually a few dollars a month for a typical team digest).
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 mostly swapping message text and timing. Change the “Daily Digest Schedule” node to post at your preferred hour, then edit the “Post Daily Summary” Slack node to match your format. If you want different categories (like “Client Call” vs “Internal”), adjust the categorization logic in the parsing/code section before the Sheets append. Common tweaks include routing different event types to different channels, excluding private events, and adding “tomorrow’s first meeting” to the digest.
Usually it’s the wrong Google account, missing calendar permissions, or the trigger is pointed at a calendar you don’t actually use. Reconnect Google Calendar in n8n, then verify the calendar selection inside “New Event Watcher” and “Updated Event Watcher.” Also check that your Google Workspace admin hasn’t restricted third-party app access. If it fails only on busy days, rate limiting can be involved, so reduce how many calendars you watch at once.
For most small teams, hundreds of events per week is fine. On n8n Cloud, your limit is tied to your monthly executions (Starter covers a typical use case), and self-hosting removes execution caps but depends on your server. The daily digest is just one scheduled run per day, while the event watchers create executions whenever events are created, updated, or canceled.
Often, yes. This workflow has multiple triggers (new, updated, daily schedule, and error handling), plus conditional paths for cancellations and optional attendee emails, which can get awkward and expensive in simpler tools. n8n also gives you code steps when you need them, so categorization and meeting stats stay in one place. If you only want “post today’s events to Slack once a day,” Zapier or Make can be fine. If you want the Sheets log, cancellation tracking, and a reliable daily stats tab, n8n is usually the smoother long-term setup. Talk to an automation expert if you want help choosing.
Once this is running, schedule updates stop being a daily distraction. The workflow handles the repetitive calendar noise so your team can just show up and work.
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.