

How to Post Daily Calendar Agenda to Slack with Pipedream
Automatically post your day's calendar events to Slack every morning at 8am with 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 need visibility into each other's schedules without checking individual calendars
Not ideal for
Personal use or teams with sensitive meetings that shouldn't be shared publicly
Sync type
scheduledUse case type
notificationReal-World Example
A 12-person marketing team posts their daily calendars to #team-schedule every morning at 8am. Before this automation, the team lead spent 10 minutes each morning asking who was available for urgent requests and missed that Sarah had client calls blocked out.
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 Pipedream
Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 | ||
| Event Title | ||
| Start Time | ||
| End Time | ||
3 optional fieldsāø show
| Location | |
| All Day Event | |
| Event Status |
Step-by-Step Setup
Pipedream > New > Workflow
Create New Workflow
Go to pipedream.com and sign in. Click the green 'New' button in the top navigation. Select 'Workflow' from the dropdown. You'll see a blank workflow canvas with 'Add a trigger' as the first step.
- 1Click the green 'New' button in the top navigation
- 2Select 'Workflow' from the dropdown menu
- 3Click 'Add a trigger' in the workflow canvas
Workflow > Triggers > Schedule
Set Up Scheduled Trigger
In the trigger selection, search for 'Schedule'. Select the 'Schedule' trigger from the results. Set the schedule to run daily at 8:00 AM in your timezone. Choose 'Advanced' and enter the cron expression '0 8 * * *' for 8am daily.
- 1Search for 'Schedule' in the trigger selection
- 2Click 'Schedule' from the results
- 3Select 'Advanced' scheduling option
- 4Enter '0 8 * * *' in the cron expression field
- 5Set your timezone in the dropdown
Workflow > Add Step > Google Calendar > List Events
Add Google Calendar Connection
Click the '+' button below your trigger to add a new step. Search for 'Google Calendar' and select it. Choose the 'List Events' action. You'll be prompted to connect your Google account with calendar read permissions.
- 1Click the '+' button below the trigger step
- 2Search for 'Google Calendar' in the app list
- 3Select 'Google Calendar' from the results
- 4Click 'List Events' action
- 5Click 'Connect Google Calendar' and authorize
Google Calendar Step > Configuration
Configure Calendar Event Query
Set the Calendar ID to your primary calendar or specific calendar you want to query. For time range, set Time Min to 'today at 00:00' and Time Max to 'today at 23:59'. This ensures you only get today's events. Set Max Results to 50 to handle busy days.
- 1Select your calendar from the Calendar ID dropdown
- 2Set Time Min to '{{new Date().setHours(0,0,0,0)}}'
- 3Set Time Max to '{{new Date().setHours(23,59,59,999)}}'
- 4Set Max Results to 50
- 5Leave Single Events checked
Google Calendar Step > Test
Test Calendar Connection
Click the 'Test' button at the bottom of the Google Calendar step. This will fetch today's events and show you the raw data structure. You should see an array of events with properties like summary, start time, end time, and location.
- 1Scroll down to the bottom of the Google Calendar step
- 2Click the blue 'Test' button
- 3Wait for the test to complete
- 4Expand the results to see event data
Workflow > Add Step > Code > Node.js
Add Code Step for Formatting
Click '+' to add another step and select 'Code' from the options. Choose 'Run Node.js Code'. This step will format your calendar events into a readable Slack message with times, titles, and locations formatted nicely.
- 1Click the '+' button below the Google Calendar step
- 2Select 'Code' from the step options
- 3Click 'Run Node.js Code'
- 4The code editor will open with a basic template
This code formats calendar events into a clean Slack message, handles timezone conversion, and filters out cancelled events. Paste it into the Node.js code step after adding the Google Calendar step.
JavaScript ā Code Stepexport default defineComponent({āø Show code
export default defineComponent({
async run({ steps, $ }) {
const events = steps.google_calendar.items || [];... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const events = steps.google_calendar.items || [];
if (events.length === 0) {
return "š
No meetings scheduled for today!";
}
// Filter out cancelled events and sort by start time
const activeEvents = events
.filter(event => event.status !== 'cancelled')
.sort((a, b) => new Date(a.start.dateTime || a.start.date) - new Date(b.start.dateTime || b.start.date));
if (activeEvents.length === 0) {
return "š
No active meetings for today!";
}
let message = "š
Today's Schedule:\n";
activeEvents.forEach(event => {
const title = event.summary || 'Untitled Event';
const location = event.location ? ` (${event.location})` : '';
// Handle all-day events
if (event.start.date) {
message += `⢠All day: ${title}${location}\n`;
} else {
// Format times in readable format
const startTime = new Date(event.start.dateTime).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true
});
const endTime = new Date(event.end.dateTime).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true
});
message += `⢠${startTime} - ${endTime}: ${title}${location}\n`;
}
});
return message.trim();
}
});Code Step > Editor
Write Event Formatting Code
Replace the template code with event formatting logic. The code will loop through calendar events, format each one with time and details, and create a single Slack message. It handles all-day events differently and skips events without titles.
- 1Clear the existing template code
- 2Paste the event formatting code from the pro tip
- 3Reference the previous step's data as 'steps.google_calendar'
- 4Save the step
This code formats calendar events into a clean Slack message, handles timezone conversion, and filters out cancelled events. Paste it into the Node.js code step after adding the Google Calendar step.
JavaScript ā Code Stepexport default defineComponent({āø Show code
export default defineComponent({
async run({ steps, $ }) {
const events = steps.google_calendar.items || [];... expand to see full code
export default defineComponent({
async run({ steps, $ }) {
const events = steps.google_calendar.items || [];
if (events.length === 0) {
return "š
No meetings scheduled for today!";
}
// Filter out cancelled events and sort by start time
const activeEvents = events
.filter(event => event.status !== 'cancelled')
.sort((a, b) => new Date(a.start.dateTime || a.start.date) - new Date(b.start.dateTime || b.start.date));
if (activeEvents.length === 0) {
return "š
No active meetings for today!";
}
let message = "š
Today's Schedule:\n";
activeEvents.forEach(event => {
const title = event.summary || 'Untitled Event';
const location = event.location ? ` (${event.location})` : '';
// Handle all-day events
if (event.start.date) {
message += `⢠All day: ${title}${location}\n`;
} else {
// Format times in readable format
const startTime = new Date(event.start.dateTime).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true
});
const endTime = new Date(event.end.dateTime).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true
});
message += `⢠${startTime} - ${endTime}: ${title}${location}\n`;
}
});
return message.trim();
}
});Workflow > Add Step > Slack > Send Message to Channel
Add Slack Connection
Add another step and search for 'Slack'. Select 'Slack' and choose 'Send Message to Channel' action. You'll need to connect your Slack workspace and grant permissions to post messages to channels.
- 1Click '+' to add a new step
- 2Search for 'Slack' and select it
- 3Click 'Send Message to Channel'
- 4Click 'Connect Slack' and authorize your workspace
- 5Grant permission to post messages
Slack Step > Configuration
Configure Slack Message
Select your target channel from the dropdown. For the message text, reference the formatted output from your code step. Set the message to use the formatted agenda text and optionally set a username like 'Calendar Bot' for clarity.
- 1Select your target channel from the Channel dropdown
- 2Set Text to reference your code step output: '{{steps.code.$return_value}}'
- 3Set Username to 'Daily Agenda' (optional)
- 4Leave other fields as defaults
Workflow > Deploy > Test
Test Complete Workflow
Click 'Deploy' to activate your workflow, then click 'Test' to run it immediately. This will fetch today's calendar events, format them, and post to your Slack channel. Check Slack to see the formatted agenda message.
- 1Click the green 'Deploy' button at the top
- 2Click 'Test' to run the workflow now
- 3Wait for all steps to complete
- 4Check your Slack channel for the message
- 5Verify the formatting looks correct
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 Pipedream for this if you want the cleanest code-based formatting control and don't mind writing JavaScript. The Node.js runtime gives you full control over date formatting, event filtering, and message structure. The scheduled trigger is rock solid and fires exactly when expected. Skip Pipedream if you need a no-code solution - Zapier's Formatter steps handle basic calendar formatting without writing code.
This workflow consumes about 2 credits per day (1 for the schedule trigger, 1 for the three steps). At $0.002 per credit, you're looking at $1.50 per month for daily agenda posts. Zapier costs $20/month minimum for scheduled workflows, making Pipedream 13x cheaper for this use case. Make's free tier covers this easily with plenty of operations to spare.
Zapier's Google Calendar trigger has better timezone handling out of the box - you don't need to write date conversion code. Make's visual editor makes it easier to see the data flow and test each step independently. n8n gives you the same coding flexibility as Pipedream but requires self-hosting. Power Automate integrates better if you're using Outlook instead of Google Calendar. But Pipedream wins on the combination of coding power and hosted convenience - you get JavaScript flexibility without managing servers.
You'll hit Google Calendar's rate limits if you query multiple calendars frequently in the same workflow. The API sometimes returns duplicate events for recurring meetings, so add deduplication logic if you see repeats. All-day events come back in a different date format (date vs dateTime) which breaks basic formatting code - always check for both fields. Slack's message length limit is 4000 characters, so busy days with many long meeting titles will get truncated.
Ideas for what to build next
- āAdd Weekend Skip Logic ā Modify the code to skip posting on weekends when no one checks Slack anyway.
- āInclude Meeting Attendees ā Extend the formatting to show who's attending each meeting for better team visibility.
- āWeekly Digest Version ā Create a separate workflow that posts the full week's schedule every Monday morning.
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