Microsoft 365 Calendar Integration
Sync Outlook / Microsoft 365 Calendar for free/busy availability, automatic event creation on Workestra bookings, and Microsoft Teams meeting links.
Microsoft 365 Calendar Integration
Connect a Microsoft 365 account so Workestra can:
- Read your free/busy — booking links hide slots that overlap with events on your Outlook / M365 calendar (even meetings booked outside Workestra)
- Write events — every confirmed Workestra booking auto-creates an event on your M365 calendar with the attendee invited
- Generate Teams meeting links — when Auto-generate meeting link is on for a booking link and your provider is set to Microsoft, every event includes a Microsoft Teams URL automatically
If you only need to view your calendar inside Workestra, you don't need the integration — Workestra has its own Calendar dashboard. The integration matters when you want free/busy syncing with the booking flow or Teams link automation.
Screenshot needed — Settings → Connected Accounts with the Microsoft Calendar card connected
What you get
- Availability checking — slots overlapping any event on your M365 calendar are hidden from public booking pages
- Event creation — confirmed bookings land on your M365 calendar with the attendee in the invitee list
- Teams meeting links — Workestra calls Microsoft Graph with
isOnlineMeeting: trueandonlineMeetingProvider: "teamsForBusiness"so each event includes a real Teams join URL - Round-robin per-member fan-out — in a team round-robin link, each rep's M365 calendar is consulted individually. A 5-rep team where Alice is on Microsoft and Bob is on Google works out of the box; both calendars are checked when computing availability.
Connecting Microsoft 365 Calendar
OAuth flow
- Go to Settings → Connected Accounts
- Click Connect Microsoft Calendar
- Sign in with your Microsoft 365 / work account
- Grant the requested Graph API permissions (see below)
- Save
Workestra stores the OAuth token in user_integrations under provider='microsoft_calendar'. It's separate from any Microsoft email connection you may have for Outlook inbound mail — Workestra keeps calendar tokens and email tokens in their own slots, so revoking one doesn't affect the other.
Permissions explained
| Permission | Purpose |
|---|---|
Calendars.ReadWrite | Read your free/busy and create / update events on your behalf |
OnlineMeetings.ReadWrite | Generate Teams meeting URLs at event creation time |
User.Read | Identify the connected account |
offline_access | Keep the connection alive across sessions |
Workestra only accesses the connected user's calendar. Other users in your tenant aren't affected, and admin consent isn't required for personal account-level connection.
Picking your provider per booking link
Each booking link has a Calendar provider field (/settings/booking-links/<id> → Calendar integration). It's set per-link, so a sales rep who lives in M365 and a recruiter who lives in Google can each pick their own without affecting the other:
| Setting | Meaning |
|---|---|
| None | No external calendar consulted. Slots are derived purely from your weekly hours. |
| Use the connected Google Calendar (see Google Calendar integration) | |
| Microsoft | Use the connected Microsoft 365 calendar (this page) |
When the field is set to Microsoft and Auto-generate meeting link is on, every confirmed booking gets a Teams URL. The URL is included in the attendee's confirmation email and shown as a Join button on the Calendar dashboard.
Round-robin links across mixed providers
Round-robin is provider-agnostic. The rotation pool can mix:
- Reps connected to Microsoft Calendar
- Reps connected to Google Calendar
- Reps with no provider connected (their availability is the link's weekly hours, no external check)
When Workestra computes slot availability for a round-robin link, it looks up each rep's connected provider individually and asks the right calendar API per rep. The slot is shown on the public page if at least one rep is free, and assignment at confirmation re-verifies the chosen rep's calendar. See Round-Robin for the full mechanics.
Two-way sync
Today the M365 integration is outbound + free/busy read — Workestra creates events on M365 when a booking lands, and reads M365 free/busy when computing availability. Inbound sync (an event you create directly in Outlook becoming a Workestra activity) isn't shipped yet; for now, consider Outlook the source of truth for non-Workestra meetings, and Workestra the source of truth for booked appointments.
Troubleshooting
"Calendar not found" or empty free/busy
- Re-authenticate the connection in Settings → Connected Accounts
- Confirm the M365 account has at least one calendar (default is the user's primary)
- If you're on a tenant that requires admin consent for
Calendars.ReadWrite, an admin needs to approve the app
Events not appearing in Outlook
- Check the booking actually succeeded — visit
/calendarand find the event - Verify the booking link's Calendar provider is set to Microsoft, not None or Google
- Re-authenticate; the OAuth token may have expired (offline_access should keep it alive, but tenant policies vary)
Teams link missing on the event
- Confirm Auto-generate meeting link is on for the link
- Confirm the connection includes the
OnlineMeetings.ReadWritescope (re-authenticate to refresh it) - Personal Microsoft accounts (
@outlook.com,@hotmail.com) don't have Teams for Business. Only M365 / work accounts do.
Wrong timezone
- The booking link's Timezone field is the host's timezone for slot generation; it doesn't have to match your M365 timezone, but the resulting event respects the host's timezone setting
- If events show up at unexpected times in Outlook, double-check the booking link's timezone, not Outlook's display preference
How it interacts with booking links
| Booking link setting | Effect with Microsoft Calendar connected |
|---|---|
| Calendar provider: Microsoft | Slots overlapping any event on the connected M365 calendar are hidden on /book/<slug>. Meetings booked outside Workestra still block availability — no double-booking. |
| Auto-generate meeting link | Every confirmed booking creates an M365 event with a Microsoft Teams URL. |
Read next
- Calendar & Scheduling overview — Workestra's own scheduling features
- Booking Links — set the Calendar provider field per link
- Round-Robin — per-member fan-out across mixed providers
- Google Calendar Integration — the equivalent for Gmail / Google Workspace teams
- Embed Widget — host the booking flow on your own site