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

How to Send Out-of-Office Alerts to Slack with Pipedream

Automatically posts to #team-updates when someone adds an all-day 'OOO' or 'Vacation' event in Google Calendar.

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 instant OOO notifications without manually posting in Slack channels

Not ideal for

Teams wanting digest-style notifications or complex approval workflows before posting

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 25-person marketing agency uses this to notify #team-updates whenever someone blocks out vacation days in their shared Google Calendar. Before automation, people forgot to announce time off and projects got delayed when key team members weren't available. Now the whole team sees OOO alerts within 30 seconds of calendar updates.

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 access with edit permissions on the target calendar
Slack workspace admin rights or pre-approved bot permissions for posting messages
Target Slack channel where notifications will post (public or bot-accessible)
Pipedream account with workflow creation privileges

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Event Title
Start Date
End Date
Event Creator
Slack Channel
Message Text

Step-by-Step Setup

1

pipedream.com > Workflows > New

Create New Workflow

Go to pipedream.com and click New Workflow in the top right. You'll land on the workflow builder with an empty trigger step. The interface shows a clean drag-and-drop canvas where you'll connect Google Calendar to Slack. Name your workflow something like 'OOO Alerts' in the top left field.

  1. 1Click 'New Workflow' button in dashboard
  2. 2Click the trigger step placeholder
  3. 3Type 'OOO Calendar Notifications' in the workflow name field
What you should see: You should see an empty workflow canvas with one trigger step waiting for configuration.
2

Trigger Step > Select App > Google Calendar

Add Google Calendar Trigger

Click the trigger step and search for Google Calendar in the app list. Select 'New or Updated Event' as your trigger type. This webhook-based trigger fires instantly when calendar events change, unlike polling triggers that check every 15 minutes. You'll need to connect your Google account and grant calendar permissions.

  1. 1Click the empty trigger step
  2. 2Search for 'Google Calendar' in the app selector
  3. 3Choose 'New or Updated Event' trigger
  4. 4Click 'Connect Account' and authorize Google permissions
What you should see: You should see 'Connected' status next to your Google account with calendar scopes listed.
Common mistake — The trigger needs 'See and edit events on all calendars' permission - read-only won't work for webhooks.
Pipedream
+
click +
search apps
Google Calendar
GO
Google Calendar
Add Google Calendar Trigger
Google Calendar
GO
module added
3

Google Calendar Trigger > Configuration

Configure Calendar Selection

Choose which calendar to monitor from the dropdown. Most teams use their main work calendar, but you can select a dedicated PTO calendar if your team uses one. Set the trigger to monitor 'All Events' rather than filtering here - you'll filter for OOO events in the next step using code.

  1. 1Select your target calendar from the 'Calendar ID' dropdown
  2. 2Leave 'Event Types' set to 'All Events'
  3. 3Enable 'Watch for Updates' checkbox
  4. 4Click 'Save and Continue'
What you should see: The trigger shows your calendar name with a green webhook icon indicating real-time monitoring.
Common mistake — Shared calendars might not appear immediately - refresh the dropdown if you don't see expected calendars.
4

Workflow > Add Step > Code

Add Filter Code Step

Click the + button below your trigger to add a new step. Choose 'Run Node.js Code' instead of selecting an app. This code step will filter events to only process all-day events with 'OOO' or 'Vacation' in the title. You'll write a simple condition that checks the event title and duration.

  1. 1Click the + button below the Google Calendar trigger
  2. 2Select 'Run custom Node.js code'
  3. 3Name the step 'Filter OOO Events'
  4. 4Clear the default code placeholder
What you should see: You should see a code editor with syntax highlighting and the $ helper object available.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.

This code handles edge cases like multi-day events, weekend detection, and graceful fallbacks when attendee data is missing. Paste it into your 'Filter OOO Events' code step to replace the basic filter logic.

JavaScript — Code Stepexport default defineComponent({
▸ Show code
export default defineComponent({
  async run({ steps, $ }) {
    const event = steps.trigger.event;

... expand to see full code

export default defineComponent({
  async run({ steps, $ }) {
    const event = steps.trigger.event;
    
    // Check if event exists and has required fields
    if (!event || !event.summary) {
      $.flow.exit('No event data or title found');
      return;
    }
    
    // OOO keywords to match (case insensitive)
    const oooKeywords = ['ooo', 'out of office', 'vacation', 'pto', 'personal time off', 'holiday', 'time off'];
    const title = event.summary.toLowerCase();
    
    // Check if title contains any OOO keywords
    const isOOOEvent = oooKeywords.some(keyword => title.includes(keyword));
    
    if (!isOOOEvent) {
      $.flow.exit('Event is not an OOO event');
      return;
    }
    
    // Verify it's an all-day event (has date only, no dateTime)
    const isAllDay = event.start?.date && !event.start?.dateTime;
    
    if (!isAllDay) {
      $.flow.exit('Event is not all-day');
      return;
    }
    
    // Calculate duration and format dates nicely
    const startDate = new Date(event.start.date);
    const endDate = new Date(event.end.date);
    const duration = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24));
    
    // Get person name with fallbacks
    const personName = event.creator?.displayName || 
                      event.creator?.email?.split('@')[0] || 
                      'Someone';
    
    // Format the message with context
    const emoji = duration > 5 ? '🏖️' : '📅';
    const dateRange = duration > 1 ? 
      `${startDate.toLocaleDateString()} - ${new Date(endDate.getTime() - 86400000).toLocaleDateString()}` :
      startDate.toLocaleDateString();
    
    return {
      personName,
      originalTitle: event.summary,
      dateRange,
      duration,
      formattedMessage: `${emoji} ${personName} is out of office: ${event.summary} (${dateRange})`
    };
  }
});
Google Calendar
GO
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Slack
SL
notified
5

Code Step > Editor

Write Filter Logic

Paste the filtering code that checks if an event is all-day and contains OOO keywords. The code examines the event title for patterns like 'OOO', 'Vacation', 'PTO', or 'Out of Office' and verifies it's an all-day event by checking the date format. If conditions match, it passes the event data forward; otherwise it stops the workflow.

  1. 1Paste the filter code in the editor
  2. 2Click 'Test' to validate syntax
  3. 3Check that steps.trigger.event contains expected calendar data
  4. 4Save the code step
What you should see: The test should show either filtered event data or 'Workflow stopped' if no OOO event detected.
Common mistake — Case sensitivity matters - the code converts titles to lowercase for matching but preserves original formatting for Slack.
6

Workflow > Add Step > Slack

Add Slack Step

Add another step below your code filter and search for Slack. Select 'Send Message to Channel' as the action type. You'll need to connect your Slack workspace and grant permissions to post messages. Choose this over 'Send DM' since team notifications work better in shared channels.

  1. 1Click + below the code step
  2. 2Search for 'Slack' in the app list
  3. 3Choose 'Send Message to Channel'
  4. 4Click 'Connect Account' and authorize your Slack workspace
What you should see: You should see your Slack workspace name with 'Connected' status and bot permissions confirmed.
Common mistake — The Slack app needs 'chat:write' and 'channels:read' scopes - admin approval might be required in some workspaces.
7

Slack Step > Configuration > Channel

Configure Slack Channel

Select your target channel from the dropdown. Most teams use #general, #team-updates, or a dedicated #announcements channel. The dropdown shows all public channels your connected account can access. Private channels require the Pipedream bot to be explicitly invited to that channel first.

  1. 1Choose your notification channel from the dropdown
  2. 2If channel missing, invite @Pipedream bot to private channels
  3. 3Refresh the dropdown to see newly accessible channels
  4. 4Confirm channel selection shows correct name
What you should see: The channel field should display your selected channel name with a # prefix.
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.
8

Slack Step > Message Field

Build Message Content

Click in the message field and build your notification using data from previous steps. Reference the calendar event data using steps.trigger.event.summary for the event title and steps.trigger.event.attendees for the person's name. Add context like dates and duration to make notifications more helpful for your team.

  1. 1Click in the 'Message' text area
  2. 2Type your base message like '🏖️ Someone is out of office:'
  3. 3Click 'Insert Data' to add dynamic fields
  4. 4Add event title, dates, and attendee information
What you should see: Your message should show dynamic placeholders like {{steps.trigger.event.summary}} mixed with static text.
Common mistake — Google Calendar attendee data might be empty for personal events - include fallback text in your message template.
9

Workflow > Test Button

Test the Workflow

Click 'Test' in the top right to run your workflow with sample data. Pipedream will simulate a calendar event and show you exactly what message would post to Slack. Check that your filtering logic works and the message formatting looks clean. The test uses cached event data from your calendar if available.

  1. 1Click the 'Test' button in workflow header
  2. 2Review each step's output in the execution log
  3. 3Check that Slack received the test message
  4. 4Verify message formatting in your Slack channel
What you should see: You should see green checkmarks on all steps and a formatted message in your Slack channel.
Pipedream
▶ Deploy & test
executed
Google Calendar
Slack
Slack
🔔 notification
received
10

Workflow > Deploy

Deploy Workflow

Click 'Deploy' to activate your workflow for real calendar events. The status changes from 'Inactive' to 'Active' with a green indicator. Pipedream starts monitoring your calendar webhook immediately. You can pause/resume anytime using the toggle switch next to the deploy button without losing your configuration.

  1. 1Click 'Deploy' button in the top right
  2. 2Confirm deployment in the popup dialog
  3. 3Verify status shows 'Active' with green indicator
  4. 4Check webhook URL appears in Google Calendar settings
What you should see: Workflow status should show 'Active' and execution logs will start appearing when OOO events are created.
Common mistake — Google Calendar webhooks expire after 30 days - Pipedream auto-renews them but check logs if notifications stop working.

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 instant notifications without polling delays. The webhook-based trigger fires within 30 seconds of calendar changes, compared to 15-minute polling intervals on other platforms. The Node.js code steps handle complex filtering logic better than basic conditional modules. Skip Pipedream if you need advanced Slack formatting - Zapier's Slack integration has better native message builder options.

Cost

This workflow costs about 1 credit per OOO event created. At 20 team members taking 2 weeks vacation annually, expect roughly 40 credits per year. That's essentially free on Pipedream's generous usage tiers. Zapier charges per trigger fire and would cost $20/month at this volume. Make's operations are cheaper per execution but require a $9/month minimum.

Tradeoffs

Make handles Google Calendar webhooks more reliably - their webhook processing rarely fails compared to Pipedream's occasional timeout issues. Zapier's Slack formatting tools are superior with built-in message templates and emoji selectors. N8n gives you more control over webhook retry logic and error handling. Power Automate integrates better with Microsoft calendars if that's your ecosystem. But Pipedream's instant webhook processing and flexible Node.js filtering make it ideal for real-time team notifications.

You'll hit Google's webhook expiration after 30 days - Pipedream auto-renews but monitor your execution logs for renewal failures. Personal calendar events often lack attendee data, so your messages might show 'undefined' for names without proper fallbacks. Slack rate limits kick in at 1 message per second if you batch-create multiple OOO events, causing delayed notifications.

Ideas for what to build next

  • Add return date remindersCreate a second workflow that posts when people return from OOO using delayed actions in Pipedream.
  • Sync to other toolsExtend the workflow to update status in tools like Microsoft Teams, Asana, or your CRM when people are out.
  • Build OOO dashboardSend OOO data to Google Sheets or Airtable to track team availability patterns and plan around busy periods.

Related guides

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