Intermediate~20 min setupProductivity & CommunicationVerified April 2026
Google Calendar logo
Slack logo

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

scheduled

Use case type

notification

Real-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.

/mo
505005K50K

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

Skip the setup

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.

Google Calendar with scheduled meetings for testing
Slack workspace admin access to install apps
N8n cloud account or self-hosted instance
Target Slack channel where agenda should be posted

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Meeting Titlesummary
Start Timestart.dateTime
End Timeend.dateTime
3 optional fields▸ show
Locationlocation
Meeting Descriptiondescription
Attendee Listattendees

Step-by-Step Setup

1

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.

  1. 1Click 'New Workflow' from the N8n dashboard
  2. 2Click the gray + button to add your first node
  3. 3Select 'Cron' from the trigger list
  4. 4Name your workflow 'Daily Calendar to Slack'
What you should see: You should see a Cron node on the canvas with default settings visible in the right panel.
2

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.

  1. 1In the Cron node settings, select 'Custom' mode
  2. 2Enter '0 8 * * 1-5' in the cron expression field
  3. 3Set timezone to your team's timezone from the dropdown
  4. 4Click 'Execute Node' to test the trigger timing
What you should see: The node should show 'Next execution' with tomorrow's 8am timestamp in your timezone.
Common mistake — Don't use '0 8 * * *' — that includes weekends when most teams don't want agenda notifications
3

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.

  1. 1Click the + after the Cron node
  2. 2Search for 'Google Calendar' and select it
  3. 3Choose 'Event > Get All' operation
  4. 4Click 'Create New Credential' to authenticate
What you should see: A Google OAuth popup should appear asking for calendar permissions.
4

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.

  1. 1Click 'Sign in with Google' in the credential popup
  2. 2Allow N8n to access your Google Calendar
  3. 3Select your primary calendar from the 'Calendar ID' dropdown
  4. 4Name the credential 'My Google Calendar'
What you should see: You should see a green 'Credentials set' message and your calendar name in the Calendar ID field.
Common mistake — If you have multiple work calendars, make sure you select the one with your actual meetings — not your personal calendar
5

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.

  1. 1Set 'Start Time' to '{{ $now.format('YYYY-MM-DD') }}T00:00:00'
  2. 2Set 'End Time' to '{{ $now.format('YYYY-MM-DD') }}T23:59:59'
  3. 3Enable 'Return All' to get all events for the day
  4. 4Set 'Order By' to 'startTime'
What you should see: The parameters should show today's date range and 'Return All: true'.
Common mistake — Don't use relative dates like 'today' — the API needs exact ISO timestamps
Google Calendar
GO
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Slack
SL
notified
6

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.

  1. 1Click 'Execute Node' on the Google Calendar node
  2. 2Check the output panel for today's events
  3. 3Verify meeting titles, times, and locations appear
  4. 4Note the event count in the output summary
What you should see: You should see an array of today's calendar events with fields like summary, start.dateTime, and location.
Common mistake — If you see zero events but have meetings today, check that your calendar ID matches your actual work calendar
n8n
▶ Run once
executed
Google Calendar
Slack
Slack
🔔 notification
received
7

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.

  1. 1Add an IF node after Google Calendar
  2. 2Set condition to '{{ $json.length }}' greater than 0
  3. 3This checks if any events were returned
  4. 4Leave the false branch empty for now
What you should see: You should see an IF node with two output paths — True and False branches.
8

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.

  1. 1Add a Code node on the True branch of the IF
  2. 2Paste the agenda formatting code into the JavaScript field
  3. 3The code loops through events and formats each one
  4. 4Set the output to return a single formatted message
What you should see: The Code node should show a preview of your formatted agenda message in the output panel.
Common mistake — Make sure your code handles events without locations — some meetings are virtual or location-free

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}}];
9

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.

  1. 1Add a Slack node after the Code node
  2. 2Select 'Message > Post' operation
  3. 3Click 'Create New Credential' for Slack authentication
  4. 4Choose 'OAuth2' authentication method
What you should see: A Slack OAuth popup should appear asking for workspace permissions.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
message template
🔔 New Record: {{summary}} {{description}}
start.dateTime: {{start.dateTime}}
end.dateTime: {{end.dateTime}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

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.

  1. 1Click 'Allow' in the Slack permission popup
  2. 2Select your target channel from the Channel dropdown
  3. 3Set the message text to reference the Code node output
  4. 4Enable 'As User' if you want messages from your name
What you should see: You should see your Slack channels listed in the dropdown and a green credential confirmation.
Common mistake — If you can't see your target channel, make sure N8n has been invited to that channel in Slack
11

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.

  1. 1Set Channel to your team's daily standup channel
  2. 2Set Text to '{{ $json.agenda }}' to use the formatted message
  3. 3Enable 'Unfurl Links' to false to keep it clean
  4. 4Add a thread message with 'Have a great day!' as follow-up
What you should see: The message preview should show your formatted agenda with proper line breaks and formatting.
Common mistake — Test with a low-traffic channel first — you don't want to spam your main channel while debugging the format
12

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.

  1. 1Click 'Execute Workflow' at the top of the canvas
  2. 2Watch each node execute in sequence
  3. 3Check your Slack channel for the posted agenda
  4. 4Verify the message format and content accuracy
What you should see: You should see a formatted agenda message in your Slack channel with today's meetings, times, and locations.
Common mistake — The workflow will post to Slack immediately when you test — make sure your team knows you're testing the automation

Scaling Beyond 15+ meetings/day+ Records

If your volume exceeds 15+ meetings/day records, apply these adjustments.

1

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.

2

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 remindersCreate a second workflow that posts 15-minute meeting reminders with agenda details and participant lists to relevant Slack channels.
  • Track meeting attendance and follow-upsBuild 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 summariesExtend this to a weekly digest that shows upcoming meetings, time blocked for focus work, and scheduling conflicts across your team's calendars.

Related guides

Was this guide helpful?
Google Calendar + Slack overviewn8n profile →