Skip to main content
The booker atom is a dynamic component that facilitates the booking process for users. It allows individuals to easily select available time slots and confirm their participation in various events, streamlining the scheduling experience. It is one of the most important atoms and a critical piece of our scheduling system.

Basic usage

Below code snippet can be used to render the booker atom:

Team events

For team events, you must set isTeamEvent to true and provide a teamId:

Dynamic bookings

Dynamic bookings allow multiple users to be booked simultaneously. Pass multiple usernames as an array or a plus-separated string:
For a demonstration of the booker atom, please refer to the video below.

It is also possible to change the booker layout into a week or column view, you just need to pass in the view prop the layout you want to use. The layouts are as follows: MONTH_VIEW, WEEK_VIEW and COLUMN_VIEW. Both the week and column layouts come with an Overlay Calendar feature, which allows users to overlay multiple calendars on top of their primary calendar. Below code snippet can be used to render the booker atom with week view
For a demonstration of the booker atom along with calendar overlay, please refer to the video below.

Advanced usage patterns

Prefilling booking form data

You can prefill booking form fields using the defaultFormValues prop:

Rescheduling bookings

To enable rescheduling, pass the rescheduleUid or bookingUid:

Custom start time

Control the first available date shown to users with the startTime prop:

Handling booking state changes

Monitor the booker’s internal state with onBookerStateChange:

Custom metadata

Pass custom metadata to track booking sources or additional context:

Timezone restrictions

Limit available timezones for the booker:

Setting the default timezone

By default the booker remembers the last timezone the user selected (persisted in local storage). Pass the timezone prop to control which timezone the booker opens with instead. It takes precedence over the persisted value, and the user can still change it via the timezone selector.

Handling slot reservation

Monitor slot reservation events:

Custom location URL

Override the default meeting link with a custom URL:

Instant meetings

Enable instant meeting mode:

Dry run mode

Test booking flows without creating actual bookings:

Handling timeslot loading

Execute logic when available timeslots are loaded:

CRM integration

Integrate with CRM systems for routing and tracking:

Routing form integration

Pass routing form parameters for advanced routing:

Controlling URL parameters

By default, the booker doesn’t update URL parameters in platform mode. Enable this behavior:

Disabling the confirm button

Conditionally disable the booking confirmation button:

Hiding event metadata

Hide the left sidebar containing event details:
When event metadata is hidden, the timezone selector that lives inside the sidebar is also hidden. To keep the timezone selector visible above the booker, pass showTimezoneWhenEventDetailsHidden:
If the event type has a locked timezone, that timezone is applied automatically and the selector is omitted.

Round robin configuration

For round robin team events, hide organization and team information:

Handling calendar failures silently

Display slots even when third-party calendar credentials are invalid:
When silentlyHandleCalendarFailures is enabled, the booker may show stale availability if calendar credentials are expired or invalid.

Custom event meta children

Inject custom React components into the event metadata section:

Complete example with all callbacks

We offer all kinds of customizations to the booker atom via props and customClassNames.

State management

The Booker atom uses Zustand for internal state management. You can monitor state changes using the onBookerStateChange callback:

Booker states

The booker progresses through several states during the booking flow:
  • loading - Initial state while event data is being fetched
  • selecting_date - User is viewing the calendar and selecting a date
  • selecting_time - User has selected a date and is choosing a time slot
  • booking - User is filling out the booking form
  • success - Booking has been successfully created
  • error - An error occurred during the booking process

Available state values

When using onBookerStateChange, you receive an object containing:

Example: Tracking booking progress

Props reference

Below is a comprehensive list of props that can be passed to the booker atom.

Styling

Booker atom accepts custom styles via the customClassNames prop. This prop is an object that contains root level styles and nested objects for styling different parts of the booker component. Each nested object groups related styles for a specific section of the booker (e.g., eventMeta, datePicker, availableTimeSlots, etc). Here is an example booker with root level style bookerContainer and nested object datePickerCustomClassNames with datePickerDatesActive style:
Below is a list of customClassNames properties grouped by their parent objects:

Root Level Styles

Event Meta Styles (eventMetaCustomClassNames)

Date Picker Styles (datePickerCustomClassNames)

Available Time Slots Styles (availableTimeSlotsCustomClassNames)

Confirmation Step Styles (confirmStep)

Here is an example with more custom styles:

Rescheduling a booking

The booker atom also supports rescheduling a booking. To reschedule a booking, you need to pass in the rescheduleUid prop to the booker atom along with the other necessary props. This will allow the booker to display the reschedule form and handle the rescheduling process. The rescheduleUid is the booking uid you get when you create a booking.

Host busy slot indicators

When a host reschedules their own booking while logged in, the booker displays all available time slots including ones that overlap with existing calendar events. To help the host make an informed decision, each slot shows a color-coded indicator:
  • Green dot — the slot is free on the host’s calendar
  • Red dot — the slot conflicts with an existing event on the host’s calendar
This allows hosts to intentionally double-book when needed, such as when rearranging a low-priority meeting. Guests rescheduling the same booking only see genuinely available slots and do not have the ability to override busy times.
For team events, the host can still see their own busy slot indicators, but other team members’ availability constraints remain enforced. This means the host can override only their own calendar conflicts, not those of other assigned hosts.
Here is an example of how to use the booker atom for rescheduling an individual event:
For team events, you need to pass isTeamEvent and teamId prop to the booker along with the other necessary props. This will allow the booker to display the reschedule form and handle the rescheduling process. The teamId is the team id you get when you create a team event. Here is an example of how to use the booker atom for rescheduling a team event: