SalesCal Docs
Integrations

Outlook Calendar Integration

Connect Microsoft Outlook to sync meetings, check conflicts, and auto-create Microsoft Teams links.

Benefits

  • Automatic Calendar Events: Meetings appear on your Outlook calendar
  • Conflict Detection: Existing Outlook events block booking slots
  • Microsoft Teams Links: Auto-generated for Microsoft 365 work accounts
  • Two-Way Sync: Reschedule or cancel in Outlook and SalesCal updates to match

Outlook works with both Outlook.com (personal) and Microsoft 365 / Office 365 (work or school) accounts. Teams meeting links are only auto-created on Microsoft 365 work accounts — personal accounts can still book but need a manual meeting link.

Connecting Outlook

You can connect Outlook from two places:

Onboarding wizard (first-time setup):

  1. During onboarding, the calendar step shows Outlook Calendar alongside Google
  2. Click Connect next to Outlook
  3. Sign in with your Microsoft account
  4. Grant the requested permissions
  5. The badge changes to Connected with a green check

Anytime from the dashboard:

  1. Go to Settings > Integrations
  2. Find Outlook Calendar in the available integrations grid
  3. Click Connect
  4. Sign in and grant permissions

Required Permissions

SalesCal requests these Microsoft Graph scopes:

PermissionPurpose
offline_accessPersist refresh tokens so you don't have to reconnect every hour
User.ReadRead your Microsoft profile to label the connection
Calendars.ReadWriteRead existing events for conflict detection; create, update, and delete meetings for SalesCal bookings
OnlineMeetings.ReadWriteAuto-generate Microsoft Teams meeting links on work accounts

If your event's location is set to Microsoft Teams, SalesCal asks Microsoft Graph to create the meeting with an online meeting attached. Microsoft returns a Teams join URL which gets stored with the booking.

  • Work / Microsoft 365 accounts (e.g. you@company.com): Teams links auto-generate
  • Personal accounts (@outlook.com, @live.com, @hotmail.com, @msn.com): Teams creation silently fails — Microsoft's consumer accounts don't support Teams API meeting creation. Use Zoom or Google Meet for these accounts, or add the meeting link manually after booking

We classify your account when you connect — if you're on a personal account and want Teams, you'll need to upgrade to Microsoft 365 then reconnect.

How Sync Works

New Bookings

When someone books a meeting:

  1. SalesCal creates the meeting record in its own database
  2. An Outlook calendar event is created via Microsoft Graph on the assigned host's calendar
  3. If the location is Teams, an online meeting is attached and the join URL is captured
  4. The prospect receives the calendar invite

Availability Checking

When prospects view your booking page:

  1. SalesCal queries Microsoft Graph's calendarView endpoint for your existing events
  2. Existing events block those time slots
  3. Only truly free times appear to the prospect

External Changes (Outlook → SalesCal)

SalesCal subscribes to Microsoft Graph webhooks so changes made directly in Outlook flow back:

  • Reschedule in Outlook: SalesCal detects the new start time and updates the meeting record
  • Cancel in Outlook: SalesCal marks the meeting as cancelled
  • Edit time in Outlook: SalesCal re-syncs the new time

Limitation: Internal Edits Don't Sync to Outlook

If you reschedule a booking from within SalesCal, the existing Outlook event is updated. But editing the meeting from Outlook then editing again from SalesCal can produce edge cases where the two systems briefly disagree — re-fetch one side if you notice a mismatch.

Calendar Selection

SalesCal writes new bookings to your default Outlook calendar and always checks it for conflicts. You can also have it check additional calendars for conflicts:

  1. Go to Settings > Integrations
  2. Click your connected Outlook Calendar tile
  3. Your default calendar is shown at the top (always checked, and where bookings are created)
  4. Turn on any additional calendars you also want checked for conflicts, then Save changes

Additional calendars are read-only — they're only used to detect conflicts. New bookings always go to your default calendar. If you keep work meetings on a secondary calendar and want bookings created there, set it as your default in Outlook before connecting (or move bookings yourself after they're created).

Conflict Detection

What Blocks Slots

  • Existing calendar events marked "Busy" (default)
  • All-day events explicitly marked as "Busy"
  • Events on your default Outlook calendar
  • Events on any additional calendars you've turned on for conflict checking

What Doesn't Block

  • Events marked as "Free" (including all-day events — Outlook's default for all-day)
  • Events marked "Working Elsewhere"
  • Declined invitations
  • Cancelled events
  • Events on calendars you haven't turned on for conflict checking

Team Members

Each team member connects their own Outlook account from their own SalesCal session. Round-robin and multi-host event assignment uses each host's own Outlook calendar:

  • Conflicts are checked against the assigned host's calendar
  • The booking event is created on the assigned host's calendar
  • Hosts who haven't connected Outlook (or Google) won't appear in availability checks

There is no shared / delegated calendar support — if you book on behalf of someone, do it from their own SalesCal account.

Troubleshooting

"Failed to Connect"

  • Try disconnecting and reconnecting
  • Clear browser cookies for Microsoft (login.microsoftonline.com)
  • If you're on Microsoft 365, your admin may have restricted third-party OAuth apps — ask them to allow SalesCal
  • Confirm your account is a Microsoft 365 work account, not a personal @outlook.com account
  • Verify Microsoft Teams is enabled for your Microsoft 365 tenant
  • Check that the event's location is set to Microsoft Teams specifically (not "Custom" or another video provider)

"External edits aren't syncing back"

Webhook subscriptions expire after about 3 days and SalesCal renews them in the background. If renewals fail (rare), external sync stops. Disconnect and reconnect Outlook to recreate the subscription.

"Conflicts not being detected"

  • Confirm the events are on a calendar that's being checked — your default calendar, or an additional calendar you turned on under the Outlook Calendar settings tile
  • All-day events show as "Free" by default in Outlook — only events marked Busy block slots
  • Refresh the booking page to fetch the latest availability

"Wrong calendar events being checked"

Outlook's default calendar is whichever calendar Microsoft considers your primary. Set the right one as default in Outlook (Calendar settings) and reconnect.

Outlook vs Google Calendar

FeatureOutlookGoogle Calendar
Conflict detectionYesYes
Two-way syncYesYes
Auto video linksTeams (work accounts only)Google Meet
Multiple calendarsYes (check extra calendars; bookings go to default)Yes (check extra calendars; bookings go to primary)
Personal accountsSupported, but no Teams linksSupported, no Meet on personal Gmail
Webhook renewalEvery ~3 daysEvery ~7 days

Pick Outlook if your team is on Microsoft 365; pick Google Calendar if you're on Google Workspace. You can connect different team members on different platforms — the booking widget assigns based on whoever's free, regardless of which calendar they use.

Disconnecting Outlook

  1. Go to Settings > Integrations
  2. Find Outlook Calendar
  3. Click Disconnect

Existing Outlook events remain in your calendar. New bookings stop syncing to Outlook and your availability is no longer checked against your Outlook calendar.

Privacy & Security

Best Practices

  • Bookings are created on your default calendar — if you also keep busy time on other calendars, turn them on for conflict checking under the Outlook Calendar settings tile
  • Add buffer time in your event rather than as separate Outlook events; buffers are kept correct as you reschedule
  • For Teams on personal accounts, switch to Zoom or Google Meet
  • Test before launching: book a test meeting, verify the calendar event and Teams link land correctly, then go live