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

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

scheduled

Use case type

notification

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

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

Google Calendar with events you want to share
Slack workspace admin access or pre-installed Pipedream app
Google account with calendar read permissions
Slack channel where you want to post the agenda

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Event Title
Start Time
End Time
3 optional fieldsā–ø show
Location
All Day Event
Event Status

Step-by-Step Setup

1

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.

  1. 1Click the green 'New' button in the top navigation
  2. 2Select 'Workflow' from the dropdown menu
  3. 3Click 'Add a trigger' in the workflow canvas
āœ“ What you should see: You should see a workflow builder with an empty trigger step waiting for configuration.
2

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.

  1. 1Search for 'Schedule' in the trigger selection
  2. 2Click 'Schedule' from the results
  3. 3Select 'Advanced' scheduling option
  4. 4Enter '0 8 * * *' in the cron expression field
  5. 5Set your timezone in the dropdown
āœ“ What you should see: The trigger shows 'Daily at 8:00 AM' with your timezone and a green checkmark.
⚠
Common mistake — Cron expressions in Pipedream use UTC by default. Make sure you select your actual timezone in the dropdown or your posts will be off by several hours.
Pipedream
+
click +
search apps
Google Calendar
GO
Google Calendar
Set Up Scheduled Trigger
Google Calendar
GO
module added
3

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.

  1. 1Click the '+' button below the trigger step
  2. 2Search for 'Google Calendar' in the app list
  3. 3Select 'Google Calendar' from the results
  4. 4Click 'List Events' action
  5. 5Click 'Connect Google Calendar' and authorize
āœ“ What you should see: You should see 'Connected' next to your Google account email with a green dot.
4

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.

  1. 1Select your calendar from the Calendar ID dropdown
  2. 2Set Time Min to '{{new Date().setHours(0,0,0,0)}}'
  3. 3Set Time Max to '{{new Date().setHours(23,59,59,999)}}'
  4. 4Set Max Results to 50
  5. 5Leave Single Events checked
āœ“ What you should see: The configuration shows your selected calendar and today's date range in the preview.
⚠
Common mistake — If you use a shared calendar, make sure your Google account has read access or the query will return empty results.
5

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.

  1. 1Scroll down to the bottom of the Google Calendar step
  2. 2Click the blue 'Test' button
  3. 3Wait for the test to complete
  4. 4Expand the results to see event data
āœ“ What you should see: You should see JSON output with your calendar events, including summary, start.dateTime, end.dateTime, and location fields.
⚠
Common mistake — If no events appear, check that you have meetings scheduled for today and that the calendar ID matches the one containing those events.
Pipedream
ā–¶ Deploy & test
executed
āœ“
Google Calendar
āœ“
Slack
Slack
šŸ”” notification
received
6

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.

  1. 1Click the '+' button below the Google Calendar step
  2. 2Select 'Code' from the step options
  3. 3Click 'Run Node.js Code'
  4. 4The code editor will open with a basic template
āœ“ What you should see: You should see a code editor with 'export default defineComponent({' as the starting template.
⚠
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.

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();
  }
});
7

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.

  1. 1Clear the existing template code
  2. 2Paste the event formatting code from the pro tip
  3. 3Reference the previous step's data as 'steps.google_calendar'
  4. 4Save the step
āœ“ What you should see: The code step shows no syntax errors and displays 'Saved' in the top right corner.
⚠
Common mistake — Make sure you reference the correct step name - if your Google Calendar step has a different name, update the reference in the code.

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();
  }
});
8

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.

  1. 1Click '+' to add a new step
  2. 2Search for 'Slack' and select it
  3. 3Click 'Send Message to Channel'
  4. 4Click 'Connect Slack' and authorize your workspace
  5. 5Grant permission to post messages
āœ“ What you should see: You should see your Slack workspace name with a green 'Connected' status.
⚠
Common mistake — You need admin permissions in your Slack workspace to install the Pipedream app, or ask an admin to install it first.
9

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.

  1. 1Select your target channel from the Channel dropdown
  2. 2Set Text to reference your code step output: '{{steps.code.$return_value}}'
  3. 3Set Username to 'Daily Agenda' (optional)
  4. 4Leave other fields as defaults
āœ“ What you should see: The configuration shows your selected channel and the dynamic text reference from the code step.
⚠
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.
10

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.

  1. 1Click the green 'Deploy' button at the top
  2. 2Click 'Test' to run the workflow now
  3. 3Wait for all steps to complete
  4. 4Check your Slack channel for the message
  5. 5Verify the formatting looks correct
āœ“ What you should see: You should see a formatted agenda message in your Slack channel with today's meetings listed with times and titles.
⚠
Common mistake — If the message is empty, you might not have any events today. Add a test meeting to your calendar and run the test again.

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

Cost

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.

Tradeoffs

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

Was this guide helpful?
← Google Calendar + Slack overviewPipedream profile →