

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-timeUse case type
notificationReal-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.
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 Date | ||
| End Date | ||
| Event Creator | ||
| Slack Channel | ||
| Message Text | ||
Step-by-Step Setup
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.
- 1Click 'New Workflow' button in dashboard
- 2Click the trigger step placeholder
- 3Type 'OOO Calendar Notifications' in the workflow name field
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.
- 1Click the empty trigger step
- 2Search for 'Google Calendar' in the app selector
- 3Choose 'New or Updated Event' trigger
- 4Click 'Connect Account' and authorize Google permissions
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.
- 1Select your target calendar from the 'Calendar ID' dropdown
- 2Leave 'Event Types' set to 'All Events'
- 3Enable 'Watch for Updates' checkbox
- 4Click 'Save and Continue'
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.
- 1Click the + button below the Google Calendar trigger
- 2Select 'Run custom Node.js code'
- 3Name the step 'Filter OOO Events'
- 4Clear the default code placeholder
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})`
};
}
});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.
- 1Paste the filter code in the editor
- 2Click 'Test' to validate syntax
- 3Check that steps.trigger.event contains expected calendar data
- 4Save the code step
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.
- 1Click + below the code step
- 2Search for 'Slack' in the app list
- 3Choose 'Send Message to Channel'
- 4Click 'Connect Account' and authorize your Slack workspace
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.
- 1Choose your notification channel from the dropdown
- 2If channel missing, invite @Pipedream bot to private channels
- 3Refresh the dropdown to see newly accessible channels
- 4Confirm channel selection shows correct name
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.
- 1Click in the 'Message' text area
- 2Type your base message like '🏖️ Someone is out of office:'
- 3Click 'Insert Data' to add dynamic fields
- 4Add event title, dates, and attendee information
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.
- 1Click the 'Test' button in workflow header
- 2Review each step's output in the execution log
- 3Check that Slack received the test message
- 4Verify message formatting in your Slack channel
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.
- 1Click 'Deploy' button in the top right
- 2Confirm deployment in the popup dialog
- 3Verify status shows 'Active' with green indicator
- 4Check webhook URL appears in Google Calendar settings
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 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.
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.
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 reminders — Create a second workflow that posts when people return from OOO using delayed actions in Pipedream.
- →Sync to other tools — Extend the workflow to update status in tools like Microsoft Teams, Asana, or your CRM when people are out.
- →Build OOO dashboard — Send OOO data to Google Sheets or Airtable to track team availability patterns and plan around busy periods.
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