Skip to content

Calendar Integrations

Connect Google or Microsoft Calendar so Ascend can hide slots that conflict with your other meetings — and write confirmed bookings back to your real calendar automatically.

Quick Start

  1. Settings → Integrations → Calendars.
  2. Click Connect Google or Connect Microsoft.
  3. Approve the OAuth scope on the provider's page.
  4. Pick which calendar(s) on that account to sync.
  5. Done — slots will start respecting external busy time within ~30 seconds.

What Gets Synced

DirectionWhat happens
External → Ascend (free / busy)Every event on your selected external calendars is treated as busy time. Slots that would overlap are removed from your booking page.
Ascend → External (write-back)Every confirmed booking creates a real calendar event on your external calendar with the attendee, location, and meeting link.
RescheduleUpdates the existing calendar event (move the time block, keep the same event id).
CancelDeletes the calendar event.

We don't sync metadata you didn't put on the booking (descriptions, attachments, custom calendar colours) — just the basics needed for "this slot is taken."


Supported Providers

ProviderOAuthWebhooksNotes
Google CalendarYesYes (push notifications)Free / paid both work. Write-back creates events on your primary calendar by default.
Microsoft 365 / Outlook.comYesYes (Graph subscriptions)Personal @outlook.com and work / school accounts both supported.
iCloud / Apple CalendarNoNoNot natively supported — use a CalDAV bridge if needed (manual workaround).
Other CalDAVNoNoSame as above.

Free / Busy Caching

To keep slot generation fast, Ascend doesn't hit the provider every time someone opens your booking page. Instead:

  1. On connect, we pull the next ~60 days of events into a local cache.
  2. We subscribe to the provider's webhook so any change pushes an update to us within seconds.
  3. The cache is queried (not the provider) when generating slots.

This means slot pages load in ~50ms even with many calendars on many hosts. Webhook subscriptions auto-renew before they expire.

Re-sync if it drifts

If you suspect the cache is stale (e.g. you just deleted a meeting and the slot still shows busy), Settings → Integrations → click the calendar → Re-sync now. Forces a fresh pull.


Multiple Calendars per Host

You can connect multiple calendars per account (work + personal) and multiple accounts per Ascend user (e.g. two Google logins). The pick-list on connect lets you choose which to use:

  • For free / busy — every selected calendar's events block slots.
  • For write-back — pick one calendar as the "primary write target" per account.

What Bookers See

The external-calendar conflict check is invisible to the booker — they just see the conflict-free slot list. Ascend doesn't expose what other meetings you have or who they're with.

For multi-host event types (collective / round-robin), each host's own external calendar is checked independently — see Multi-Host & Pools.


Privacy

Ascend reads your calendar's busy times via OAuth. We don't read event titles, descriptions, attendee lists, or attachments. Specifically:

  • Google scope: https://www.googleapis.com/auth/calendar.events.owned (read busy + create events you own).
  • Graph scope: Calendars.ReadWrite (Microsoft's least-scoped option that still allows write-back).

Tokens are stored encrypted at rest. Disconnect from Settings → Integrations → click the calendar → Disconnect. We delete the cached events immediately and revoke the token.


What If I Don't Connect a Calendar?

Bookings still work — Ascend just can't detect external conflicts. You'll see a yellow No host calendar warning on the publish-readiness checklist (it doesn't block publish). Connect later any time; existing bookings are unaffected.


Troubleshooting

SymptomLikely causeFix
Slot shows free in Ascend but my real calendar has a meetingWebhook hasn't fired or cache is staleClick Re-sync now. If it persists, disconnect + reconnect.
Booking didn't appear in my external calendarWrite-back failed (transient API error). Check the booking's workflow run log for the calendar action's status.Use the booking side sheet's Resync to calendar button.
OAuth flow returns "access denied"You declined a scope or your admin has restricted the app.For Google Workspace, ask your admin to allowlist the Ascend OAuth client id.
Token expiredProvider revoked or 6 months of inactivityReconnect from Settings → Integrations.