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
- Settings → Integrations → Calendars.
- Click Connect Google or Connect Microsoft.
- Approve the OAuth scope on the provider's page.
- Pick which calendar(s) on that account to sync.
- Done — slots will start respecting external busy time within ~30 seconds.
What Gets Synced
| Direction | What 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. |
| Reschedule | Updates the existing calendar event (move the time block, keep the same event id). |
| Cancel | Deletes 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
| Provider | OAuth | Webhooks | Notes |
|---|---|---|---|
| Google Calendar | Yes | Yes (push notifications) | Free / paid both work. Write-back creates events on your primary calendar by default. |
| Microsoft 365 / Outlook.com | Yes | Yes (Graph subscriptions) | Personal @outlook.com and work / school accounts both supported. |
| iCloud / Apple Calendar | No | No | Not natively supported — use a CalDAV bridge if needed (manual workaround). |
| Other CalDAV | No | No | Same as above. |
Free / Busy Caching
To keep slot generation fast, Ascend doesn't hit the provider every time someone opens your booking page. Instead:
- On connect, we pull the next ~60 days of events into a local cache.
- We subscribe to the provider's webhook so any change pushes an update to us within seconds.
- 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
| Symptom | Likely cause | Fix |
|---|---|---|
| Slot shows free in Ascend but my real calendar has a meeting | Webhook hasn't fired or cache is stale | Click Re-sync now. If it persists, disconnect + reconnect. |
| Booking didn't appear in my external calendar | Write-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 expired | Provider revoked or 6 months of inactivity | Reconnect from Settings → Integrations. |
Related
- Availability — Where free / busy is consumed
- Multi-Host & Pools — Per-host calendar checks
- Workflows & Reminders — Calendar invite is sent automatically by Google / Microsoft, not via Ascend workflows