Opsgenie shuts down April 2027 - migrate to Pagerly in one click
PagerlyPagerly
← All postsEngineering

How to Sync Slack Status with Google Calendar

Sync Slack status with Google Calendar in three steps, learn why it sometimes fails, and keep on-call routing separate from meeting status.

How to Sync Slack Status with Google Calendar

If you want to sync Slack status with Google Calendar, the quickest route is Slack's own Google Calendar app: connect it, open Settings on its Home tab, and turn on status sync. From then on, accepted meetings set your status to "In a meeting" and events titled OOO or PTO set "Out of office". That covers most people. It stops covering engineering teams the moment status starts doing a second job: telling colleagues who can be pulled into an incident right now.

This guide walks through the native setup step by step, the rules that decide when your status actually changes (and the ones that make it look broken), how to build a custom sync with the Slack and Google Calendar APIs when the built-in app is not enough, and where status should stop and a real on-call signal should take over.

How to sync Slack status with Google Calendar using the native app

Slack documents the setup in its help article on syncing your status with your calendar. The flow is short, and it is done on desktop.

Step 1: add the Google Calendar app to your workspace

Google Calendar for Slack is a Slack app, so it has to be installed in the workspace first. On many workspaces it already is. If your workspace restricts app installs, you will need to request it from a workspace admin, which is worth doing once for the whole team rather than person by person.

Step 2: connect your Google account

Open the app from the Apps section of the sidebar and follow the prompts to link your Google account. You are granting the app read access to your calendar so it can see when events start and end. On organisations that use domain wide authentication, an admin may already have handled the Google side.

Step 3: turn on status sync

On the app's Home tab, select Settings and switch on status syncing. That is it. Your status will update at the start of your next qualifying event. There is no separate schedule to configure, and nothing for your teammates to install.

Outlook users

The Outlook Calendar app works the same way, with a "Turn on" button after you link your account. Mixed shops (some people on Google Workspace, some on Microsoft 365) can still get consistent status behaviour, as long as everyone uses the app that matches their calendar.

What triggers a status change (and why it sometimes does not)

Most complaints that "status sync is broken" are really the rules working as designed. Slack's Google Calendar for Slack article lists them, and they are worth knowing before you roll this out to a team.

"In a meeting" needs other invitees

An event only sets "In a meeting" when it has other invitees. A solo block you created for yourself, such as "Write design doc", will not change your status even though it is on your calendar and marked busy. If your team uses solo blocks for focus time and expects status to reflect them, it will not, and you will need either a manual status or a custom sync (covered below).

Only accepted or busy events count

Events you have not accepted, or that do not mark you as Busy, are ignored. A tentative invite to a large all hands, for example, may not flip your status. This is mostly a good thing: you do not want every speculative invite to make you look unavailable.

Overlapping events are skipped

If two events overlap, the app does not update your status. Engineers with double booked calendars (common for managers and incident leads) will see status stay put during exactly the busiest hours. The fix is calendar hygiene: decline the meeting you are not attending so only one remains.

Out of office comes from the event title

The app sets "Out of office" when the event title contains OOO or PTO. "Vacation", "Holiday", or "Off" will not trigger it. If you want reliable out of office status across a team, agree on a naming convention and write it down. One line in your team handbook ("put OOO in the title of time off events") saves a lot of confusion.

Manual status always wins

A status you set yourself is never overwritten by the sync. This is the single most common reason people think sync stopped working: they set "Commuting" three days ago with no expiry, and the calendar has been politely leaving it alone ever since. Clear your manual status (or give it an expiry) and the sync takes over again.

Primary calendar only

Status sync only reads your primary calendar. You can connect additional calendars to the app for notifications and viewing, but events on a secondary or shared calendar will not drive your status. This matters a lot for on-call, because shared team calendars are exactly where rotations tend to live.

Meeting names stay private

Your status says "In a meeting", not the event title. That is the right default. It means you do not have to worry about "Performance review with Sam" appearing next to your name in a busy channel.

Troubleshooting a Slack status that will not sync

When someone reports that their status is not updating, work through this list in order. It resolves the vast majority of cases in a few minutes.

  • Check for a manual status. Open your profile and clear any status you set yourself, especially ones with no expiry.
  • Confirm sync is on. Open the Google Calendar app's Home tab, go to Settings, and check the status sync toggle.
  • Check the event. Does it have other invitees? Did you accept it? Is it marked Busy? Does it overlap another event?
  • Check the calendar. Is the event on your primary calendar, not a shared or secondary one?
  • Check the title for time off. Does it include OOO or PTO?
  • Reauthorise. If events are missing or out of date in the app itself, Slack's guidance is to revoke the authorisation in the app's Configuration tab and add it again.

If all of that checks out and status still does not change, the problem is usually that the app's model of "busy" does not match how your team uses the calendar. That is the point where a custom sync starts to make sense.

Building a custom Slack status sync with the APIs

Some teams want rules the native app does not offer: focus time blocks that set a "heads down" status, different emoji for customer calls, or status driven by a shared calendar. Both platforms have the APIs to do it, and a small script on a schedule is enough.

Reading events from Google Calendar

The Google Calendar API's events.list method returns events in a time window. Query a short window around now (for example the next five minutes) with singleEvents=true so recurring events are expanded into individual instances. Each event carries an eventType, which distinguishes ordinary events from out of office, focus time and working location entries. That is a much more robust signal than matching the letters OOO in a title, and it is the main reason to build your own.

Writing status to Slack

Slack's users.profile.set method sets status through three profile fields: status_text (up to 100 characters), status_emoji, and status_expiration, a Unix timestamp after which Slack clears the status on its own. Always set the expiration to the event's end time. If your script crashes halfway through a meeting, the status still clears itself instead of claiming you are in a meeting for the rest of the week.

A few constraints shape the design:

  • It needs a user token. The method uses the users.profile:write scope on a user token, so each person authorises the app for their own profile. Setting another person's profile is limited to admins on paid plans, with role restrictions, and is not a good basis for a team tool.
  • Clear both fields together. To remove a status, send empty strings for both status_text and status_emoji. Clearing just one returns an error.
  • Respect rate limits. Slack limits how often a token can update a single profile (its docs cite 10 updates per minute per user). Only call the API when the desired status actually changes, not on every polling loop.
  • Do not trample manual statuses. Read the current status first. If it is not one your script set, leave it alone, the same courtesy the native app extends.

A minimal sync loop

The logic fits in a page of code:

  • Every few minutes, fetch the user's current and next events from Google Calendar.
  • Map the current event to a desired status: out of office event to "Out of office", focus time to "Heads down", meeting with attendees to "In a meeting", nothing to empty.
  • Compare with the status your script last set. If different, call users.profile.set with an expiration at the event's end.
  • Store what you set, so you can tell your statuses apart from manual ones next time.

Before writing it, check whether a no code automation tool or an existing app already does what you need. Custom code is cheap to write and slightly annoying to own: tokens expire, people leave, and somebody has to notice when the cron stops running.

Slack status is not an on-call signal

Here is where calendar driven status gets risky for engineering teams. Once statuses update automatically, people start reading them as availability. "She's in a meeting, I'll ping someone else." "He's OOO, skip him." That instinct is reasonable for everyday questions and dangerous for incidents.

Status describes a person, not a responsibility

"In a meeting" tells you what one person is doing. It tells you nothing about who owns the payments service tonight, who is primary versus secondary, or who has already been paged. During an incident, responders need the answer to "who is on call for this", and a channel full of meeting emoji does not give it to them.

The on-call calendar is usually not the primary calendar

Most teams keep their rotation on a shared calendar or in a scheduling tool. Native status sync reads only each person's primary calendar, so an on-call shift on a shared calendar will never show up in anyone's status. If you are relying on status to show who is on call, you are almost certainly showing stale or missing information. We covered the mechanics of shared calendar rotations in our guide to the Google Calendar Slack integration.

Status is easy to override and forget

Manual statuses win, and they often have no expiry. An engineer who sets "Back Monday" and returns Thursday will look unavailable for days. That is a minor annoyance in a product channel and a real problem if somebody uses it to decide not to escalate.

Status cannot wake anyone up

Even a perfectly accurate status is passive. It only helps if someone looks at it. An on-call signal has to push: a page by phone, SMS, or app notification that keeps going until somebody acknowledges it.

A practical setup: status for colleagues, on-call for incidents

The healthy pattern is to let each tool do the job it is good at. Use calendar driven status for everyday courtesy, and a separate, explicit mechanism for on-call.

Let status handle everyday availability

  • Turn on native status sync for the team, or build the custom sync if you need focus time and event types.
  • Agree on a time off convention (OOO in the title, or use Google Calendar's out of office event type if you build your own sync).
  • Ask people to set an expiry on any manual status.
  • Decline meetings you are not attending so overlap does not freeze your status.

Give on-call its own handle

The most useful single change is an on-call Slack user group, such as @payments-oncall, whose membership follows the rotation automatically. Anyone can mention it in a channel and reach whoever is actually on shift, without checking a calendar or a status. Our walkthrough on how to sync a Slack user group with your on-call schedule covers the setup. Pagerly keeps @oncall style groups in step with the rota, whether the rota is built in Pagerly or comes from a calendar or an existing paging tool, and you can create rotations directly in Slack if you do not have one yet.

Page, do not just mention

For anything urgent, a Slack mention is a starting point, not the whole escalation. A real page reaches the on-call engineer when they are away from the laptop or in a meeting with notifications paused. Pagerly's on-call paging covers email, Slack, SMS, phone call and the mobile app, so a status of "In a meeting" stops being a reason an alert goes unanswered.

Make the two systems agree where it matters

If you want status to hint at on-call, add it deliberately rather than hoping the calendar does it. A custom sync can set a pager emoji during on-call shifts by reading the rotation's shared calendar or scheduling tool, with an expiry at the shift handoff. Treat that emoji as a courtesy for colleagues, though, not as the source of truth. The user group and the paging policy remain what incident responders rely on.

Rolling this out to an engineering team

A one week rollout keeps it painless:

  • Day 1: confirm the Google Calendar app is installed and approved for the workspace. Post a short message with the three setup steps.
  • Day 2: publish the conventions: OOO or PTO in time off titles, expiries on manual statuses, decline meetings you will miss.
  • Day 3: create or verify on-call user groups for each service, linked to the rotation so membership changes on handoff.
  • Day 4: update your incident runbook so the first step is "mention the on-call group" or "page", never "check who looks available".
  • Day 5: spot check. Pick a few people, compare status with their calendars, and fix the gaps the troubleshooting list above predicts.

Expect a handful of "my status is wrong" messages in the first week. Almost all will be manual statuses with no expiry, overlapping meetings, or events on a secondary calendar.

Common questions about Slack and Google Calendar status sync

Can I sync status from a shared team calendar?

Not with the native app, which reads only your primary calendar for status. You can connect other calendars for notifications, but to drive status from a shared calendar you need a custom sync.

Will my status show the meeting title?

No. The native app shows a generic status without the event name. A custom sync can show more, but think hard before putting meeting titles in a field the whole company can see.

Does focus time change my status?

Not through the native app unless the block has other invitees, which focus time usually does not. Reading the event type through the Google Calendar API and setting your own status is the reliable way to show focus time.

Should do not disturb follow my calendar?

For most people, pausing notifications during focus blocks is helpful. For whoever is on call, it is a risk. Make sure your paging path does not rely on Slack notifications alone, so a quiet laptop never means a missed incident.

Conclusion

To sync Slack status with Google Calendar, install the Google Calendar app, link your account, and switch on status sync in Settings. Learn its rules (invitees, acceptance, overlap, OOO or PTO in the title, primary calendar only, manual status wins) and most "it's broken" reports disappear. If you need focus time, event types, or shared calendars, a small script using events.list and users.profile.set fills the gap, as long as every status it sets has an expiry.

Just do not let a meeting emoji become your incident routing. Status is for colleagues. On-call needs an explicit owner, a user group that follows the rotation, and a page that reaches someone wherever they are. Get both right and your team gets fewer pointless pings during meetings and faster answers when something actually breaks. If you want the on-call half handled inside Slack, see Pagerly pricing, which starts per team rather than per seat.