← Back to Expanso + OpenClaw
📅 Integration Guide

OpenClaw Google Calendar Integration

Connect OpenClaw to Google Calendar using Expanso pipelines. Check your schedule, create events, set reminders, and build daily briefings - all while keeping your Google credentials on your own machine.

⚠️

Prerequisites

You need OpenClaw installed (install guide), a free Expanso Cloud account (sign up), and a Google account with Calendar access.

How it works
👤You
🤖OpenClaw
Expanso
📅Calendar
OpenClaw sends the scheduling request to Expanso. Expanso resolves your Google OAuth credentials locally and calls the Calendar API. The AI never sees your tokens.

Two ways to connect Google Calendar

Choose the method that fits your needs:

ICS Feed (read-only)

Subscribe to a calendar's ICS URL. Read-only access, no event creation. Simplest setup with no OAuth required. Good for schedule queries only.

Method 1: OAuth integration (recommended)

Set Up Google Cloud OAuth Credentials

Create OAuth credentials in Google Cloud Console so Expanso can access Calendar on your behalf.

1.1 Create a Google Cloud project

Go to Google Cloud Console. Create a new project (or use an existing one). Enable the Google Calendar API under APIs & Services.

1.2 Create OAuth credentials

Under APIs & Services > Credentials, click Create Credentials > OAuth client ID. Choose "Desktop app" as the application type. Download the credentials.json file.

1.3 Authenticate with gog CLI

The gog CLI handles Google OAuth token management locally:

# Install gog (Google OAuth Gateway)
npm install -g gog-cli
# Authenticate - opens browser for Google OAuth consent
gog auth
# Test - list upcoming events
gog calendar list

Tokens are stored locally on your machine. You can revoke them at any time from Google Account Permissions.

1.4 Store the token path

# The gog CLI stores tokens locally. Set the path for Expanso:
export GOOGLE_CREDENTIALS_PATH="$HOME/.config/gog/credentials.json"
export GOOGLE_TOKEN_PATH="$HOME/.config/gog/token.json"
Security: OAuth tokens are stored on your local filesystem. Expanso reads them at pipeline runtime - they're never sent to OpenClaw or any AI model. You can revoke access at any time.

Deploy the Calendar Pipeline

Create Expanso pipelines for reading and creating calendar events.

2.1 Set up Expanso (if you haven't already)

Follow the Expanso setup guide to create your account and install the CLI.

2.2 Create the calendar reader pipeline

Open cloud.expanso.io, click New Pipeline, and paste:

# calendar-read.yaml
# Reads upcoming calendar events
input:
  http_server:
    path: /calendar-read
    allowed_verbs: [ "POST" ]
pipeline:
  processors:
    - http:
        url: "https://www.googleapis.com/calendar/v3/calendars/primary/events"
        verb: GET
        headers:
          Authorization: "Bearer ${GOOGLE_ACCESS_TOKEN}"
        rate_limit: ""
    - mapping: |
        root.events = this.items.map_each(event -> {
          "title": event.summary,
          "start": event.start.dateTime.or(event.start.date),
          "end": event.end.dateTime.or(event.end.date),
          "location": event.location.or(""),
          "attendees": event.attendees.or([]).map_each(a -> a.email),
          "status": event.status
        })
        root.count = this.items.length()
output:
  sync_response: {}

2.3 Create the event creator pipeline

For scheduling new events:

# calendar-create.yaml
# Creates new calendar events
input:
  http_server:
    path: /calendar-create
    allowed_verbs: [ "POST" ]
pipeline:
  processors:
    - mapping: |
        root.summary = this.title
        root.description = this.description.or("")
        root.start.dateTime = this.start_time
        root.start.timeZone = this.timezone.or("America/Los_Angeles")
        root.end.dateTime = this.end_time
        root.end.timeZone = this.timezone.or("America/Los_Angeles")
        root.attendees = this.attendees.or([]).map_each(email -> {
          "email": email
        })
        root.reminders.useDefault = false
        root.reminders.overrides = [
          {"method": "popup", "minutes": 10}
        ]
    - http:
        url: "https://www.googleapis.com/calendar/v3/calendars/primary/events"
        verb: POST
        headers:
          Authorization: "Bearer ${GOOGLE_ACCESS_TOKEN}"
          Content-Type: "application/json"
output:
  sync_response: {}

2.4 Deploy both pipelines

Click Deploy for each pipeline. They run on your edge node with OAuth tokens resolved locally.

Method 2: ICS feed (read-only)

Simple read-only access via ICS

If you only need to query your schedule (no event creation), an ICS subscription is the simplest option.

1 Get your ICS URL

In Google Calendar, go to Settings > [Your Calendar] > Integrate calendar and copy the "Secret address in iCal format" URL.

2 Store it securely

export GOOGLE_CALENDAR_ICS_URL="https://calendar.google.com/calendar/ical/your-id/private-key/basic.ics"

3 Create an ICS reader pipeline

# calendar-ics.yaml
# Reads events from ICS feed
input:
  http_server:
    path: /calendar-ics
    allowed_verbs: [ "POST" ]
pipeline:
  processors:
    - http:
        url: "${GOOGLE_CALENDAR_ICS_URL}"
        verb: GET
    - mapping: |
        # Parse ICS format and extract events
        root.events = this.split("BEGIN:VEVENT").slice(1).map_each(block -> {
          "title": block.re_find("SUMMARY:(.+)").index(1).or(""),
          "start": block.re_find("DTSTART[^:]*:(.+)").index(1).or(""),
          "end": block.re_find("DTEND[^:]*:(.+)").index(1).or("")
        })
output:
  sync_response: {}

Limitations: ICS feeds are read-only and update periodically (not real-time). For creating events or instant access, use the OAuth method above.

Connect to OpenClaw

Register the Expanso MCP server so OpenClaw can invoke your Calendar pipelines.

3.1 Register the MCP server

# Register Expanso pipelines with OpenClaw
expanso-cli mcp add npx @expanso/mcp-pipelines

3.2 Test the integration

Open OpenClaw and try these commands:

# Check your schedule
"What do I have on my calendar today?"
# Find free time
"Am I free Thursday afternoon between 2-5pm?"
# Create an event
"Schedule a 30-minute call with Sarah tomorrow at 3pm"
# Morning briefing
"Give me my schedule for this week with travel time estimates"
# Cross-platform
"Check my calendar for today and post my schedule to #daily on Slack"

Common calendar workflows

☀️ Daily schedule briefing

Every morning, OpenClaw reads your calendar through Expanso and sends a formatted schedule summary to Slack or your preferred chat channel. Includes meeting details, gaps between meetings, and preparation notes.

📅 Smart scheduling

Ask "Schedule a call with Sarah sometime this week" and OpenClaw checks your availability, finds open slots, and creates the event with the right duration, timezone, and attendees.

🔔 Meeting reminders

Configure OpenClaw to send you meeting reminders via WhatsApp, Telegram, or Slack at custom intervals. "Remind me 15 minutes before every meeting today" works with natural language.

📊 Time analysis

Ask "How much time did I spend in meetings this week?" and OpenClaw analyzes your calendar events, categorizes them (1:1s, standups, external calls), and gives you a breakdown.

🔗 Calendar + email + Jira

Morning briefing that combines your calendar, unread emails, and Jira sprint status into a single digest. All three data sources flow through separate Expanso pipelines with separate credentials.

🌐 Multi-calendar support

Connect both work and personal calendars with selective access. Check "Am I free?" across all calendars, but only show work event details to team members.

Frequently asked questions

Are my Google OAuth tokens safe?
Yes. OAuth tokens are stored locally on your filesystem (managed by the gog CLI). Expanso reads them at pipeline runtime. Neither OpenClaw nor any AI model ever sees your Google credentials. You can revoke access at any time from your Google Account Permissions.
Can OpenClaw see all my calendar events?
The pipeline has access to calendars you've authorized through the OAuth consent screen. You can limit access to specific calendars during setup. OpenClaw sees event data only during the active request - nothing is stored or cached.
Can OpenClaw create events without my approval?
That depends on your configuration. By default, OpenClaw will propose an event and ask for confirmation before creating it. You can configure auto-creation for specific patterns (e.g., always create daily standups), but the safety boundaries are always under your control.
Does this work with Google Workspace calendars?
Yes. The OAuth flow works identically for personal Gmail and Google Workspace (formerly G Suite) accounts. For Workspace, your admin may need to approve the OAuth app for your organization.
What about other calendar providers (Outlook, Apple)?
Expanso supports 200+ connectors. You can create similar pipelines for Microsoft Outlook (via Microsoft Graph API) or Apple Calendar (via CalDAV). The architecture is the same - Expanso handles the API calls, credentials stay local, and OpenClaw orchestrates through natural language.
Can I combine calendar with other integrations?
Absolutely. That's the core value of Expanso. A single OpenClaw command like "Check my schedule and email, then post a morning briefing to Slack" chains three Expanso pipelines: Calendar reader, Gmail reader, and Slack poster. Each uses its own credentials, all resolved locally.

Start connecting Google Calendar

Get your OpenClaw wired up to Google Calendar in under 10 minutes.

Related guides