Why am I seeing free slots during booked events?

Read as Markdown

This article outlines reasons why an Availability Query may return free slots at times when a participant has booked events.

The event is on a calendar not included in the query #

A participant may have multiple calendars across one or more connected providers. If calendar_ids is specified in the query, only events on those calendars contribute to the participant’s busy times. If the booked event is on a calendar not included in that list, it will not block availability. You can call List Calendars to see all calendars connected to an account and verify the right ones are included.

If calendar_ids is set to an empty array, no calendars are chosen and all events for the participant are ignored. If it is omitted entirely, all calendars for the participant are checked - unless managed_availability is set to true, in which case the calendars are determined by their Availability Rules (see below).

Managed Availability is scoping which calendars are checked #

When managed_availability is set to true for a participant and calendar_ids is omitted in the Availability Query, the calendars used for checking busy times comes from the participant’s Availability Rules rather than their full calendar profile. If the Availability Rules reference only a subset of calendars, events on other calendars will not block availability, even if they appear as booked in the user’s calendar.

See Managed Availability for more information.

The event’s transparency is set to free #

Every event has a transparency value - opaque means the event blocks availability, while transparent means it does not. You can check this field on events in the relevant time window using Read Events.

For Microsoft 365 and Exchange calendars, there is also an extended_transparency field which provides a more granular view - see the parameter reference for a full breakdown of which values are considered free or busy. If ignored_extended_transparencies is set in your query, check that the values listed there are intentional, as events matching those values will be treated as free.

The calendar sync has not completed or the profile is disconnected #

When a user first connects their calendar, Cronofy performs an initial sync of their existing events. Until this completes, availability data may be incomplete. You can check profile_initial_sync_required and from the Userinfo endpoint to see whether the initial sync has completed and whether the profile is still connected.

If a calendar profile becomes disconnected (for example due to invalid credentials), availability data will reflect the last known state. You can check profile_connected from the Userinfo endpoint to see if the calendar is still connected. In general, we recommend setting up Push Notifications so you can notified via a profile_disconnected event as soon as a disconnection occurs.

You can also pass include_member_statuses in your Availability Query, which returns a sync_status for each participant - a status of pending means the initial sync has not finished yet, and disconnected means the calendar profile has become disconnected and the data reflects the last known state.

only_managed_events is set to true #

If only_managed_events is set to true for a participant, only events created by your application are considered when determining busy times. Events the user has created directly in their calendar will be ignored. If external events should also block availability, this should be set to false or omitted.

If none of these reasons explain the issue, please email support@cronofy.com with the details of an example query and the affected slot so we can investigate further.