> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rootly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Calendar

> Connect Google Calendar to Rootly to schedule incident meetings from workflows, and import a calendar as a holiday feed for on-call schedules.

The Google Calendar integration connects Rootly with your Google Workspace so incident workflows can schedule calendar events, attach video meetings, and invite responders automatically. A Google Calendar can also be imported as a holiday feed to overlay company holidays on your on-call schedules.

With the Google Calendar integration, you can:

* Create Google Calendar events from incident workflows, with a video meeting attached
* Invite responders drawn from the incident's roles and teams
* Update an existing event's time, attendees, or duration as an incident evolves
* Import a calendar's iCal feed to overlay holidays on Rootly on-call schedules

## Before You Begin

Before setting up the integration, make sure you have:

* A Rootly account with admin permission to manage integrations
* A Google Workspace account, or a Google Cloud project if you are using a service account

<Info>
  Rootly recommends installing with a **service account** so the integration does not break if the installing user leaves your organization.
</Info>

## Installation

Locate **Google Calendar** on the [integrations catalog](https://rootly.com/account/integrations) and click **Setup**.

<Frame>
  <img alt="Google Calendar on the Rootly integrations catalog" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-1.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=2612570256a9199b6f8b883a9a88fb08" width="862" height="496" data-path="images/integrations/google-calendar/installation/images-1.webp" />
</Frame>

You will be prompted to choose a connection method: OAuth credentials, or JSON file credentials.

<Frame>
  <img alt="Choosing between OAuth and JSON credential connection methods" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-2.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=7c76ce28527ee815d469c9c25682dbde" width="862" height="476" data-path="images/integrations/google-calendar/installation/images-2.webp" />
</Frame>

<Tabs>
  <Tab title="OAuth (Recommended)">
    Use this method for non-GCP service accounts. It is the simplest approach.

    <Note>
      To install as a shared identity rather than a personal one:

      1. Create a Google account with a generic email (for example, `acme_rootly@company.com`).
      2. Log into that Google account in your browser.
      3. Add `acme_rootly@company.com` as a member of your Rootly organization.
      4. Follow the steps below while signed in as that account.
    </Note>

    <Steps>
      <Step title="Start the integration" icon="plug">
        Click **Setup** to begin. You will be prompted to select a Google account.

        <Frame>
          <img alt="Google account selection prompt" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-3.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=86c0fd02fdc00ae59a229b13a8dce5de" width="870" height="484" data-path="images/integrations/google-calendar/installation/images-3.webp" />
        </Frame>
      </Step>

      <Step title="Grant Rootly permission" icon="key">
        After selecting an account, grant Rootly permission to integrate with it.

        <Frame>
          <img alt="Google consent screen granting Rootly calendar access" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-4.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=92ee5e00dd8f437f4eb167f03e3275dc" width="871" height="504" data-path="images/integrations/google-calendar/installation/images-4.webp" />
        </Frame>

        Select **Allow**. You are redirected back to Rootly and the installation is complete.

        <Frame>
          <img alt="Completed Google Calendar installation in Rootly" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/installation/images-5.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=c51ab08058c96c82bc1d56a4b6caa454" width="865" height="498" data-path="images/integrations/google-calendar/installation/images-5.webp" />
        </Frame>
      </Step>
    </Steps>
  </Tab>

  <Tab title="GCP Service Account">
    Use this method for GCP service accounts. See the [Google service account overview](https://cloud.google.com/iam/docs/service-account-overview) for background.

    <Steps>
      <Step title="Create a service account" icon="user-shield">
        In the [Google Cloud console](https://console.cloud.google.com/), open **IAM & Admin**.

        <Frame>
          <img alt="IAM and Admin section of the Google Cloud console" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/installation/images-6.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=4a5313323bf5086a5a839ac5652fc864" width="865" height="462" data-path="images/integrations/google-calendar/installation/images-6.webp" />
        </Frame>

        Navigate to **Service Accounts** and click **Create Service Account**.

        <Frame>
          <img alt="Service Accounts page with the Create Service Account button" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/installation/images-7.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=2f490f368c69c0f543fe32008bb8381c" width="866" height="536" data-path="images/integrations/google-calendar/installation/images-7.webp" />
        </Frame>

        Fill in the service account details — the Service Account ID is generated automatically. Click **Done**.

        <Frame>
          <img alt="Service account details form" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/installation/images-8.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=bf2ab8c65ef3285e790a8dc7593a3cde" width="865" height="616" data-path="images/integrations/google-calendar/installation/images-8.webp" />
        </Frame>
      </Step>

      <Step title="Generate and download a JSON key" icon="key">
        Open the **Keys** tab and click **Add a Key**.

        <Frame>
          <img alt="Keys tab of the service account" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/installation/images-9.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=fdfcadc7b782a198cb8d6f2e34310644" width="867" height="449" data-path="images/integrations/google-calendar/installation/images-9.webp" />
        </Frame>

        Create a key and download it in JSON format.

        <Frame>
          <img alt="Creating a JSON format service account key" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-10.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=f99dc16f5543496b7309e42d38f22258" width="864" height="426" data-path="images/integrations/google-calendar/installation/images-10.webp" />
        </Frame>
      </Step>

      <Step title="Upload the key to Rootly" icon="upload">
        Return to the Rootly integration page and upload the JSON file.

        <Frame>
          <img alt="Uploading the service account JSON key in Rootly" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-11.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=d4d10b1667b7ff8d73da4fcff39e6b60" width="865" height="433" data-path="images/integrations/google-calendar/installation/images-11.webp" />
        </Frame>
      </Step>

      <Step title="Configure domain-wide delegation" icon="shield-halved">
        In [admin.google.com](https://admin.google.com/), go to **Security > API Controls > Domain Wide Delegation**. Select your service account and add these scopes:

        ```text theme={null}
        https://www.googleapis.com/auth/calendar.readonly
        https://www.googleapis.com/auth/calendar.events
        ```

        <Frame>
          <img alt="Domain-wide delegation scopes for the service account" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-12.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=e9d269c36b06e313d674c82cd0824a33" width="875" height="792" data-path="images/integrations/google-calendar/installation/images-12.webp" />
        </Frame>
      </Step>

      <Step title="Configure calendar sharing options" icon="calendar">
        In [admin.google.com](https://admin.google.com/), go to **Google Workspace > Core Google Workspace** and select **Google Calendar**.

        Configure external sharing options for the primary calendar:

        <Frame>
          <img alt="External sharing options for the primary calendar" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-13.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=897cde141972a795fce2793209651989" width="867" height="329" data-path="images/integrations/google-calendar/installation/images-13.webp" />
        </Frame>

        Configure internal sharing options for the primary calendar:

        <Frame>
          <img alt="Internal sharing options for the primary calendar" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-14.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=87436a496aa6bc318207acf17f55ad15" width="866" height="373" data-path="images/integrations/google-calendar/installation/images-14.webp" />
        </Frame>
      </Step>

      <Step title="Share your calendar with the service account" icon="share-nodes">
        Open your own calendar's settings and share it with the service account email, granting **Make changes to events** permission.

        <Frame>
          <img alt="Sharing a calendar with the service account email" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-15.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=47503b255336482131a65a4999952b0b" width="870" height="383" data-path="images/integrations/google-calendar/installation/images-15.webp" />
        </Frame>

        In the Rootly integration, enter the email of the user you want to schedule meetings as, then click **Save**.

        <Frame>
          <img alt="Entering the scheduling user email in the Rootly integration" src="https://mintcdn.com/rootly/7PwamMJIAOaYlZ7c/images/integrations/google-calendar/installation/images-16.webp?fit=max&auto=format&n=7PwamMJIAOaYlZ7c&q=85&s=e58b9fb760bb895e84eea608510a72bd" width="867" height="436" data-path="images/integrations/google-calendar/installation/images-16.webp" />
        </Frame>
      </Step>
    </Steps>
  </Tab>
</Tabs>

## Workflow Actions

The Google Calendar integration uses workflows to schedule calendar events automatically. If you are unfamiliar with how workflows function, visit the [Workflows](/workflows/workflows) documentation first.

<Frame>
  <img alt="Google Calendar workflow actions in the action picker" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-1.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=89e5e1998deff715af4467d768c72ee4" width="868" height="483" data-path="images/integrations/google-calendar/workflows/images-1.webp" />
</Frame>

<Tip>
  Use the [Incident Variable Explorer](https://rootly.com/account/help/liquid-explorer) to preview what Liquid variables return for your incidents.
</Tip>

### Create a Google Calendar Event

Schedules a new calendar event, optionally with a video meeting attached.

| Field                  | Description                                                                                                             | Required |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------- |
| **Name**               | Display name for this workflow action                                                                                   |          |
| **Summary**            | Event title. Defaults to `{{ incident.title }}`. Supports Liquid                                                        | Yes      |
| **Description**        | Event description. Supports Liquid                                                                                      |          |
| **Attendees**          | Attendee email addresses, entered directly or drawn from the incident                                                   |          |
| **Conference Type**    | Video meeting to attach to the event. Select **Hangout** to attach a Google Meet                                        |          |
| **Time Zone**          | Time zone used to schedule the event                                                                                    |          |
| **Days Until Meeting** | Number of days from now until the event                                                                                 |          |
| **Meeting Duration**   | Length of the event. Supports Liquid                                                                                    |          |
| **Time of Meeting**    | Start time, interpreted in the selected **Time Zone**                                                                   |          |
| **Slack Channels**     | Slack channels to post the result to. Use `{{ incident.slack_channel_id }}` or `{{ parent_incident.slack_channel_id }}` |          |

<Frame>
  <img alt="Create a Google Calendar Event workflow action configuration form" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-2.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=b7289dd28f42bd1917f7b6e7e3187564" width="863" height="479" data-path="images/integrations/google-calendar/workflows/images-2.webp" />
</Frame>

<Frame>
  <img alt="Selecting incident-derived attendees for a calendar event" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-3.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=10c1d1a1da5701c36f1621fe64972d0e" width="867" height="246" data-path="images/integrations/google-calendar/workflows/images-3.webp" />
</Frame>

### Update a Google Calendar Event

Updates an existing calendar event. Only the fields you specify are changed; unspecified fields keep their existing values.

| Field                | Description                                                                                         | Required |
| -------------------- | --------------------------------------------------------------------------------------------------- | -------- |
| **Name**             | Display name for this workflow action                                                               |          |
| **Event**            | Calendar event ID to update. Defaults to `{{ incident.google_calendar_event_id }}`. Supports Liquid | Yes      |
| **Summary**          | Updated event title. Supports Liquid                                                                |          |
| **Description**      | Updated event description. Supports Liquid                                                          |          |
| **Conference Type**  | Video meeting to attach to the event                                                                |          |
| **Attendees**        | Updated attendees. Overwrites the existing list only when **Replace attendees** is checked          |          |
| **Adjustment**       | Type of date-and-time adjustment to apply, if any                                                   |          |
| **Adjustment Days**  | Number of days by which to adjust the event, if any                                                 |          |
| **Meeting Duration** | Updated event length. Supports Liquid                                                               |          |
| **Time of Meeting**  | Updated start time, interpreted in the selected **Time Zone**                                       |          |
| **Slack Channels**   | Slack channels to post the result to                                                                |          |

<Frame>
  <img alt="Update a Google Calendar Event workflow action configuration form" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-4.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=070cfa26ea79b7db10c1ab0387c46b8c" width="865" height="480" data-path="images/integrations/google-calendar/workflows/images-4.webp" />
</Frame>

<Frame>
  <img alt="Replace attendees option on the update event action" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-5.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=2d66560665280a6e2e247aa151d03c88" width="868" height="247" data-path="images/integrations/google-calendar/workflows/images-5.webp" />
</Frame>

<Frame>
  <img alt="Date and time adjustment options on the update event action" src="https://mintcdn.com/rootly/PTQsS2VTzmCsSwYt/images/integrations/google-calendar/workflows/images-6.webp?fit=max&auto=format&n=PTQsS2VTzmCsSwYt&q=85&s=af4d7d572026d54c0c92663527e17a50" width="869" height="290" data-path="images/integrations/google-calendar/workflows/images-6.webp" />
</Frame>

## Importing a Google Calendar as a PTO Feed

The OAuth integration above is for event-based workflow actions. If your goal is instead to **overlay** holidays on your Rootly on-call schedules — for example, a shared team calendar tracking company holidays — no OAuth is required. Rootly accepts a Google Calendar's iCal URL as a holiday calendar feed.

<Warning>
  Use the calendar's **Secret address in iCal format** for any calendar containing HR or PTO data. The secret address works without making the calendar publicly readable on the internet. Reserve the **Public address** for calendars that are already meant to be shareable, such as a company-wide holidays calendar.
</Warning>

<Steps>
  <Step title="Open the calendar's settings">
    In Google Calendar, hover over the calendar in the left sidebar, click the overflow menu, and choose **Settings and sharing**.
  </Step>

  <Step title="Copy the iCal URL">
    Scroll to the **Integrate calendar** section and copy the URL that fits your use case:

    * For private or sensitive calendars, copy the URL under **Secret address in iCal format**. Treat this URL as a credential — anyone with it can subscribe to the calendar.
    * For calendars already intended to be public (like company holidays), copy the URL under **Public address in iCal format**. This option requires the calendar to be set as public under **Access permissions**.

    <Warning>
      Do not use the **Embed code** or the **Public URL to this calendar**. Those are for embedding the calendar on a webpage and will not work as a feed. Only the iCal URLs end in `.ics`.
    </Warning>
  </Step>

  <Step title="Add the feed to Rootly">
    In the Rootly dashboard, go to **On-Call → Schedules**, open the **Holiday calendars** dropdown, and select **Add a holiday calendar**. Paste the iCal URL, give the calendar a descriptive name, and save.
  </Step>
</Steps>

<Tip>
  For the full behavior of holiday calendars in Rootly — conflict highlighting, recurring events, multi-region setups — see [Adding a Holiday Calendar](/on-call/holiday-calendar).
</Tip>

## Uninstall

To remove the Google Calendar integration, open the integrations panel in Rootly and select **Configure > Delete**.

## Related Resources

* [Workflows](/workflows/workflows)
* [Adding a Holiday Calendar](/on-call/holiday-calendar)
* [Integrations overview](/integrations/overview)
