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
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.
These are Google’s rules, from Google’s docs. Workwae does not remove consent or quota.
A Cloud project, an OAuth client and a consent screen, with Calendar scopes such as calendar.events or the full calendar scope. Calendar scopes
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
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
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 (as of October 2026)
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.
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.
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 or Webex.
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.
The same call works on Google, Microsoft 365 and CalDAV accounts. Shapes match the TypeScript (@workwae/sdk) and Python (workwae) SDKs.
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
});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
)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 for the consent side.
For calendars Workwae can watch, a 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.
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.
Contacts use the People API and are polled; Google offers no contact push. The provider matrix lists push and polling per service.
Tell us how many Google calendars you need to sync.