---
title: "Google Calendar API alternative · Workwae"
description: "Read and write Google Calendar events through Workwae: sync tokens, watch channels, recurring series and Meet links handled for you."
url: https://workwae.com/providers/google-calendar
---

Providers

# A Google Calendar API alternative with sync and push handled.

Workwae keeps an index of each Google account’s calendars and events, renews the watch channels, and sends your app a webhook when an event changes.

What Google requires

## The Calendar API is yours to operate.

These are Google’s rules, from Google’s docs. Workwae does not remove consent or quota.

### OAuth scopes

A Cloud project, an OAuth client and a consent screen, with Calendar scopes such as `calendar.events` or the full `calendar` scope. [Calendar scopes](https://developers.google.com/workspace/calendar/api/auth)

### Incremental sync

Store a `nextSyncToken` per calendar and send it back on the next list. A `410` means the token is invalid, and the local copy has to be wiped and listed again. [Synchronize resources](https://developers.google.com/workspace/calendar/api/guides/sync)

### Push channels

A `watch` channel per resource posts to an HTTPS endpoint you run. There is no automatic renewal: before a channel expires you replace it with a new one. [Push notifications](https://developers.google.com/workspace/calendar/api/guides/push)

### Quota

10,000 requests per minute per project and 600 per minute per user per project. Google’s own advice is to use push rather than poll every calendar. [Usage limits](https://developers.google.com/workspace/calendar/api/guides/quota) (as of October 2026)

What Workwae does

## Calendars as a synced index, not a proxy.

### Sync token and window

Each calendar syncs with its sync token. Series are expanded locally into a window of 90 days back to 365 days ahead by default, so listing events for a range does not call Google.

### Channels and backstop poll

Workwae watches the calendar list and every calendar the account owns or can write, and renews channels before they expire. Holiday and read-only calendars have no channel and are caught by a backstop poll, a day by default. If a watch fails, the poll covers it.

### Recurring events and Meet

Recurrence is RFC 5545 lines, evaluated in the event’s time zone. Occurrences and exceptions are separate kinds in the list. Set `onlineMeeting` to get a Google Meet link, or `onlineMeetingService` for [Zoom](https://workwae.com/providers/zoom) or [Webex](https://workwae.com/providers/webex).

### Scopes Workwae asks for

New consent asks for the granular events, calendar list (read-only) and free/busy scopes. Grants that already hold the full calendar scope keep working. Calendar management on Google stores name, description, time zone and color.

SDK

## Create an event with a video link.

The same call works on Google, Microsoft 365 and [CalDAV](https://workwae.com/glossary#caldav) accounts. Shapes match the TypeScript (`@workwae/sdk`) and Python (`workwae`) SDKs.

calendar.tscalendar.py

```ts
const event = await workwae.calendarEvents.create({
  accountId,
  calendarId,
  subject: "Weekly sync",
  start: { dateTime: "2026-11-02T10:00:00", timeZone: "Europe/Berlin" },
  end: { dateTime: "2026-11-02T10:30:00", timeZone: "Europe/Berlin" },
  attendees: [{ name: "Ada", address: "ada@example.com" }],
  recurrence: ["RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=10"],
  onlineMeeting: true, // a Google Meet link
});
```

```python
from datetime import datetime

event = workwae.calendar_events.create(
    account_id=account_id,
    calendar_id=calendar_id,
    subject="Weekly sync",
    start={"date_time": datetime(2026, 11, 2, 10, 0), "time_zone": "Europe/Berlin"},
    end={"date_time": datetime(2026, 11, 2, 10, 30), "time_zone": "Europe/Berlin"},
    attendees=[{"name": "Ada", "address": "ada@example.com"}],
    recurrence=["RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=10"],
    online_meeting=True,  # a Google Meet link
)
```

FAQ

## Questions teams ask.

**Does Google Calendar need its own connection?**

No. It is part of the same Google account. Calendar sync runs when the account’s `calendarEnabled` setting is on and the grant holds the Calendar scopes. See [Gmail and Google Workspace](https://workwae.com/providers/gmail) for the consent side.

**Does a webhook arrive the moment an event changes?**

For calendars Workwae can watch, a [change notification](https://workwae.com/glossary#change-notification) from Google wakes the sync and your webhook follows. Calendars without a channel, such as read-only ones, update on the backstop poll.

**Can I create and delete calendars, not just events?**

Yes, with the `calendars` routes. The primary calendar can be renamed but not deleted. Writing to a calendar the account cannot edit answers `calendar_read_only`.

**What about Google contacts?**

Contacts use the People API and are polled; Google offers no contact push. The [provider matrix](https://workwae.com/providers/) lists push and polling per service.

Early access

## Stop renewing Calendar watch channels yourself.

Tell us how many Google calendars you need to sync.

[Request early access](https://workwae.com/early-access/) [All providers](https://workwae.com/providers/)
