

How to Post Daily Calendar Agenda to Slack with N8n
Automatically post your daily calendar agenda to a Slack channel every morning at 8am with meeting times, titles, and locations.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Teams that want custom agenda formatting and don't mind writing basic JavaScript for message templates
Not ideal for
Non-technical users who need instant setup without any coding or complex workflow logic
Sync type
scheduledUse case type
notificationReal-World Example
A 12-person marketing agency uses this to post daily agendas to their #standup channel every morning at 8am. Before automation, their project manager manually typed the day's meetings into Slack, often forgetting client calls or missing room changes. Now the team sees exactly what's scheduled before they start work, including Zoom links and conference room bookings.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into n8n
Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Meeting Title | summary | |
| Start Time | start.dateTime | |
| End Time | end.dateTime | |
3 optional fields▸ show
| Location | location |
| Meeting Description | description |
| Attendee List | attendees |
Step-by-Step Setup
Workflows > New Workflow > Add Node > Triggers
Create new N8n workflow
Start with a fresh workflow to handle the daily calendar posting. You'll use a cron trigger to run this at 8am every weekday morning.
- 1Click 'New Workflow' from the N8n dashboard
- 2Click the gray + button to add your first node
- 3Select 'Cron' from the trigger list
- 4Name your workflow 'Daily Calendar to Slack'
Cron Node > Parameters
Configure cron schedule for 8am daily
Set up the cron expression to fire every weekday at 8am. This ensures your team gets the agenda before the workday starts.
- 1In the Cron node settings, select 'Custom' mode
- 2Enter '0 8 * * 1-5' in the cron expression field
- 3Set timezone to your team's timezone from the dropdown
- 4Click 'Execute Node' to test the trigger timing
Add Node > Apps > Google Calendar
Add Google Calendar node
Connect to your Google Calendar to fetch today's events. You'll pull all events for the current day when the workflow runs.
- 1Click the + after the Cron node
- 2Search for 'Google Calendar' and select it
- 3Choose 'Event > Get All' operation
- 4Click 'Create New Credential' to authenticate
Google Calendar Node > Credentials
Authenticate Google Calendar access
Grant N8n permission to read your calendar events. This creates a reusable credential for future calendar workflows.
- 1Click 'Sign in with Google' in the credential popup
- 2Allow N8n to access your Google Calendar
- 3Select your primary calendar from the 'Calendar ID' dropdown
- 4Name the credential 'My Google Calendar'
Google Calendar Node > Parameters
Filter events for today only
Configure the date range to only fetch today's events when the workflow runs. This prevents pulling old or future events.
- 1Set 'Start Time' to '{{ $now.format('YYYY-MM-DD') }}T00:00:00'
- 2Set 'End Time' to '{{ $now.format('YYYY-MM-DD') }}T23:59:59'
- 3Enable 'Return All' to get all events for the day
- 4Set 'Order By' to 'startTime'
Google Calendar Node > Execute
Test calendar connection
Execute the Google Calendar node to verify it's pulling your actual events. This confirms the authentication and date filtering work correctly.
- 1Click 'Execute Node' on the Google Calendar node
- 2Check the output panel for today's events
- 3Verify meeting titles, times, and locations appear
- 4Note the event count in the output summary
Add Node > Core > IF
Add IF node to handle no events
Create a branch to handle days with no meetings. This prevents sending empty messages to Slack on light calendar days.
- 1Add an IF node after Google Calendar
- 2Set condition to '{{ $json.length }}' greater than 0
- 3This checks if any events were returned
- 4Leave the false branch empty for now
IF Node > True Branch > Add Node > Code
Add Code node to format agenda
Transform the calendar events into a readable Slack message format. This handles the time formatting and message structure.
- 1Add a Code node on the True branch of the IF
- 2Paste the agenda formatting code into the JavaScript field
- 3The code loops through events and formats each one
- 4Set the output to return a single formatted message
Drop this into an n8n Code node.
JavaScript — Code Node// Format agenda with time zones and duration▸ Show code
// Format agenda with time zones and duration
const events = $input.all();
let agenda = `📅 *Today's Agenda (${new Date().toLocaleDateString()})*\n\n`;... expand to see full code
// Format agenda with time zones and duration
const events = $input.all();
let agenda = `📅 *Today's Agenda (${new Date().toLocaleDateString()})*\n\n`;
events.forEach(event => {
const start = new Date(event.json.start.dateTime);
const end = new Date(event.json.end.dateTime);
const duration = Math.round((end - start) / (1000 * 60)); // minutes
const timeStr = start.toLocaleTimeString('en-US', {hour: 'numeric', minute: '2-digit', timeZoneName: 'short'});
agenda += `🕒 ${timeStr} (${duration}m) - *${event.json.summary}*`;
if (event.json.location) {
agenda += ` @ ${event.json.location}`;
}
agenda += '\n';
});
return [{json: {agenda}}];Add Node > Communication > Slack
Add Slack node for posting message
Configure Slack to post the formatted agenda to your team channel. This sends the daily message every morning at 8am.
- 1Add a Slack node after the Code node
- 2Select 'Message > Post' operation
- 3Click 'Create New Credential' for Slack authentication
- 4Choose 'OAuth2' authentication method
start.dateTime: {{start.dateTime}}
end.dateTime: {{end.dateTime}}
Slack Node > Credentials
Authenticate with Slack
Grant N8n permission to post messages to your Slack workspace. You'll need admin approval if your workspace restricts app installations.
- 1Click 'Allow' in the Slack permission popup
- 2Select your target channel from the Channel dropdown
- 3Set the message text to reference the Code node output
- 4Enable 'As User' if you want messages from your name
Slack Node > Parameters
Configure Slack message format
Set up the message content and formatting to make the agenda readable in Slack. Use the formatted output from your Code node.
- 1Set Channel to your team's daily standup channel
- 2Set Text to '{{ $json.agenda }}' to use the formatted message
- 3Enable 'Unfurl Links' to false to keep it clean
- 4Add a thread message with 'Have a great day!' as follow-up
Workflow > Execute Workflow
Test the complete workflow
Execute the entire workflow to verify the end-to-end automation works correctly. This confirms the message posts to Slack with proper formatting.
- 1Click 'Execute Workflow' at the top of the canvas
- 2Watch each node execute in sequence
- 3Check your Slack channel for the posted agenda
- 4Verify the message format and content accuracy
Scaling Beyond 15+ meetings/day+ Records
If your volume exceeds 15+ meetings/day records, apply these adjustments.
Paginate long agendas
Split messages over 3,000 characters into multiple Slack posts or use thread replies. Google Calendar can return 50+ events on busy days which exceeds Slack's message limits.
Add calendar filtering
Filter out declined meetings and canceled events in your Code node. Use attendeeStatus and eventStatus fields to avoid posting meetings you're not actually attending.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use N8n for this if you want full control over the message formatting and don't mind writing a bit of JavaScript. N8n's Code nodes let you build complex agenda formats with conditional logic — like grouping meetings by hour or adding emoji for different meeting types. You can also easily add error handling and retry logic that's harder to implement in no-code tools. Skip N8n if you need this running in 5 minutes — Zapier's Google Calendar formatter handles basic agenda posting without any coding.
This workflow burns roughly 4 executions per day — one for the cron trigger, one for calendar fetch, one for formatting, and one for Slack posting. At 22 weekdays per month, that's 88 executions monthly. N8n's Starter plan includes 5,000 executions for $20/month, so you're well within limits. Make would cost $9/month for the same volume, while Zapier starts at $20/month but needs a premium plan for cron scheduling. Make wins on pure cost here.
Make has better built-in date/time formatters that handle timezone conversion automatically — N8n requires manual JavaScript for complex time formatting. Zapier's Google Calendar integration includes a pre-built 'Daily Agenda' template that works immediately without coding. But N8n beats both on message customization — you can build rich formatting with threaded replies, emoji reactions, or conditional logic based on meeting types that other platforms can't match.
Google Calendar's API sometimes returns all-day events with different date formats that break your formatting code. Add explicit checks for dateTime vs date fields in your JavaScript. The Slack API also has a 4,000 character limit per message — if someone has 20+ meetings in a day, your agenda will get truncated. Build in pagination or summary logic for heavy calendar days. Finally, N8n's cron triggers can drift by 1-2 minutes under load, so don't promise exact 8:00am delivery to your team.
Ideas for what to build next
- →Add meeting preparation reminders — Create a second workflow that posts 15-minute meeting reminders with agenda details and participant lists to relevant Slack channels.
- →Track meeting attendance and follow-ups — Build a workflow that logs meeting attendance from calendar responses and creates follow-up tasks in your project management tool for action items.
- →Send weekly calendar summaries — Extend this to a weekly digest that shows upcoming meetings, time blocked for focus work, and scheduling conflicts across your team's calendars.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup