Coming Soon to AppExchange — 2026

Booking Booking tier

The most advanced resource booking component for Salesforce. Book rooms, equipment, vehicles, or people across multiple dates with a visual time-slot grid, conflict detection on save, capacity tracking with live availability badges, status colors, and inline edit mode.

Notify Me at Launch See Use Cases
Booking component in action — booking resources with time slots in Salesforce

Overview

Booking is the most advanced component in the MultiDatePick suite. It combines the calendar with a resource selection panel and a visual time-slot grid. Users pick a resource (or multiple resources), select dates, and then click available time slots to create bookings. The component queries your resource object for available items, checks for existing bookings on save to detect conflicts, and creates booking records automatically.

Capacity mode supports multiple bookings per time slot — perfect for training rooms, class enrollments, and hot-desk pools. Live badges show "3/10" fill counts. Status colors distinguish bookings by any picklist values you define — Confirmed, Tentative, Cancelled, or anything else. Edit mode lets users modify, reassign, or delete existing bookings inline. Business hours are pulled from each resource record, so different resources can have different availability windows.

Object & Field Mapping

When configuring this component on a Lightning Page or via the Setup Wizard, these are the object and field API names you'll need to provide.

Your Record Object
Related_Object__cObject API Name
Date_Field__cDate field
End_Date_Field__cDate range end (optional)
Relationship_Field__cLookup to parent
Booking_Resource_Field__cLookup to resource
Start_Time_Field__cTime field
End_Time_Field__cTime field
Status_Field__cPicklist field (optional)
Hover_Fields__cPopover detail fields (optional)
linked via
lookup
Your Resource Object
Resource_Object__cObject API Name
Resource_Name_Field__cDisplay name
Business_Hours_Start_Field__cTime field
Business_Hours_End_Field__cTime field
Capacity_Field__cNumber field (optional)
Resource_Filter_Field__cFilter field (optional)
Resource_Filter_Value__cFilter value (optional)
Blocked Dates Object Optional
Blocked_Dates_Source_Object__cObject API Name
Blocked_Dates_Date_Field__cDate field
Blocked_Dates_Filter_Field__cLookup to parent (optional)
Important: Replace the orange values with your record object and field API names, and the green values with your resource object and fields. If you use blocked dates, replace the red values too. Everything else works as-is.
Power Feature

Filter the resources shown in the picker by ANY field type on your resource object — including multiple fields combined

Don't show every resource record to every user. resourceFilterField + resourceFilterValue let you scope the picker to exactly the resources you want.

Supported field types on the resource object
  • Checkbox (Boolean) — value is true or false. Wizard renders a True/False dropdown.
  • Picklist — single or multi-value. Wizard renders a dual-listbox of the field's actual picklist entries; multiple selections are saved comma-separated and treated as IN.
  • Text / Long Text — exact-match string. Use comma for multiple values (IN).
  • Number — exact numeric value (or comma-separated list).
  • Lookup (Id reference) — paste record Ids; comma-separated for multiple.
  • Multi-field AND — semicolon-separated field names with matching value count (e.g. Active__c;Type__c + true;Conference Room).
Use case Field Type Filter Field Filter Value
Only active resourcesBooleanActive__ctrue
Only ground-floor roomsTextFloor__cGround Floor
North or South buildingPicklistBuilding__cNorth,South
Capacity = 12 or 16NumberCapacity__c12,16
Specific Owner recordLookupOwnerId005xx00000ABC123
Two fields combined (AND)Multi · ANDType__c;Building__cConference Room;North,South

Separators: , = OR within one field (IN clause). ; = AND across multiple fields. Field counts on each side of ; must match.

Setup Wizard auto-detects the field type

Once you pick the Resource Filter Field in the wizard, the Filter Value input switches to the right control automatically — a True/False dropdown for Booleans, a multi-select dual-listbox of real picklist values for Picklists, and a free-text input for Text / Number / Lookup or the multi-field ; form. No more guessing the right syntax.

Use Cases for Booking

The Booking component is ideal for any scenario where a shared resource needs to be reserved on specific dates and times, with conflict detection and optional capacity tracking. Here are 15 real-world use cases.

1. Conference Room Booking

Reserve conference rooms across multiple dates and time slots. The booking grid shows live room availability. businessHoursStartField and businessHoursEndField pull availability from each room record — so a boardroom open 7 AM to 7 PM and a huddle room open 8 AM to 5 PM each show their own hours. allowMultipleResources lets users compare availability across rooms.

2. Training Enrollment

Employees enroll in training sessions by selecting a course, choosing dates, and picking time slots. capacityField points to Max_Participants__c on the course record — capacity tracking shows how many seats remain per session. Status colors distinguish Enrolled, Waitlisted, and Cancelled. showAvailabilityCount displays live "3/10" badges.

3. Desk Hoteling

Employees reserve hot desks by selecting a desk resource and choosing dates with 1-hour time blocks. Capacity badges show desk availability — when a shared desk hits its limit, the slot shows as full. Status colors distinguish Reserved, Checked In, and Cancelled. twoMonthView helps employees plan hybrid schedules weeks in advance. enableEditMode lets employees modify or cancel reservations.

4. Vehicle & Fleet Reservation

Reserve company vehicles for specific dates and time ranges. The booking grid shows which vehicles are available. allowMultipleResources lets fleet managers compare availability across the entire fleet. bookingResourceField links each reservation to the vehicle. hoverFields shows vehicle details (Make, Model, License Plate) on hover.

5. Therapist & Counselor Scheduling

Clients book sessions with a specific therapist (the resource). timeInterval = 60 shows 1-hour session blocks. businessHoursStartField pulls each therapist's available hours. statusColorDisplay=grid shows which slots are Booked vs. Available. enableEditMode lets clients reschedule by moving to a new date/time.

6. Classroom & Seminar Room Allocation

Schools allocate classrooms for courses and events. capacityField tracks room capacity (e.g., 30 seats). Capacity badges show how many courses are scheduled in each slot. disableTimeSlotGrid can be turned ON for full-day bookings where time doesn't matter — just the date and the room.

7. Coworking Space Booking

Members book desks, private offices, or meeting pods. capacityField handles shared spaces (e.g., a 4-person pod shows "2/4" availability). enableEditMode lets members cancel or shorten their booking. hideBookingsWithStatus = 'Cancelled' removes cancelled bookings from the grid and capacity counts.

8. Hotel & Property Management

Property managers handle room reservations. disableTimeSlotGrid turns off time selection for full-night stays — just pick dates and the room. capacityField handles room types with multiple units (e.g., 5 Standard Kings). endDateField consolidates multi-night stays into single check-in/check-out records.

9. Field Service Technician Scheduling

Dispatchers assign jobs to technicians (the resource) across dates and time windows. allowMultipleResources lets dispatchers compare a team of 25+ techs at once. conflictBehavior = 'block' prevents double-booking a tech. resourceFilterField = 'Active__c' hides inactive techs. Capacity tracking handles techs who can do multiple jobs per slot.

10. Service Truck & Vehicle Dispatch

Match jobs to trucks based on time window and capacity. resourceFilterField = 'Vehicle_Type__c;Region__c' with paired values like 'Service Truck;North' filters trucks by type AND region. businessHoursStartField pulls each truck's shift window. capacityField caps how many stops fit in one slot.

11. Event Venue & Aquarium Space Booking

Venues with multiple event spaces (galleries, halls, tents) handle bookings per space. capacityField tracks attendee capacity. endDateField handles multi-day setups + tear-downs as one record. statusColorDisplay = 'both' shows the booking calendar AND time grid color-coded by Confirmed / Tentative Hold / Block / Move-in.

12. Photography / Recording Studio Booking

Creative resources (studios, photographers, gear) get booked by clients. timeInterval = 60 sets hourly blocks. businessHoursStartField and businessHoursEndField let each studio expose its own hours. preloadMode = 'readonly' shows existing bookings on a public community page so clients see availability before requesting.

13. Sports Field & Court Reservations

Community sports facilities — soccer fields, tennis courts, basketball courts. allowMultipleResources lets leagues book multiple courts for tournament days. capacityField tracks how many teams share a multi-court facility. availabilityLookAhead blocks bookings further out than allowed (e.g., max 30 days advance).

14. Doctor & Medical Appointment Booking

Patient-facing booking on a community / portal page — pick doctor, date, and 15-minute slot. resourceFilterField = 'Specialty__c' lets the page filter doctors by the specialty selected. timeInterval = 15 for granular slots. Pair with FLS-restricted user (community) to keep patients in their own record scope.

15. EV Charging Bay Reservations

Reserve charging stations for fleet electric vehicles. Each bay is a resource. businessHoursStartField handles bays restricted to certain hours. capacityAggregation = 'Combined' when bookings are flexible across bays; 'Distinct' when each car uses one specific bay. hoverFields shows charging speed (Level 2, DC Fast) on hover so users pick the right bay.

Lightning Page Setup

1

What You Need First

The Booking component requires two objects: a Resource object (what gets booked) and a Booking object (where reservations are stored).

Resource Object (e.g. Meeting_Room__c):

FieldTypePurpose
NameText (standard)Display name shown in the resource dropdown
Business_Hours_Start__cTimeWhen the resource becomes available each day
Business_Hours_End__cTimeWhen the resource stops being available
Capacity__cNumberOptional — max bookings per time slot (for capacity mode)
Active__c (or any field)AnyOptional — any field you want to use as a filter to limit which resources appear in the picker. Set resourceFilterField to the field API name and resourceFilterValue to the desired value(s). Supports Checkbox, Picklist, Text, Number, and Lookup. See the resource filter section above for full syntax.

Booking Object (e.g. Room_Booking__c):

FieldTypePurpose
Booking_Date__cDateThe date of the reservation
End_Date__cDateOptional — stores the end date when adjacent dates are consolidated into one record
Start_Time__cTimeWhen the booking starts
End_Time__cTimeWhen the booking ends
Meeting_Room__cLookup (to Resource)Which resource is booked
Contact__cLookup (to Parent)Links to the parent record
Status__cPicklistOptional — for status color coding
Note: recordId is passed automatically on Record Pages. For App Pages, Home Pages, or Experience Sites, use staticRecordId. Create a few resource records so the dropdown has items to show.
2

Drop It In

Drag the Booking component onto your page in App Builder and configure:

Resource Object Settings

  • resourceObjectApiName — the resource object, e.g. Meeting_Room__c
  • resourceNameField — display name field, usually Name
  • businessHoursStartField — e.g. Business_Hours_Start__c
  • businessHoursEndField — e.g. Business_Hours_End__c
  • capacityField — optional capacity field, e.g. Capacity__c
  • capacityAggregation — picklist: Combined (default) or Distinct. Controls how X/Y occupancy is computed when multiple resources are selected. Combined sums bookings AND capacities across resources — best when each resource is independent inventory (4 records across 4 rooms with capacity 5 each = 4/20). Distinct counts unique events (records sharing the same date + start + end across resources count as ONE) and uses the MAX single-resource capacity — best when one event spans multiple resources simultaneously (4 records across 4 rooms = 1/5).
  • allowMultipleResources — ON to let users book multiple resources at once
  • resourceFilterField — optional. API name of a field on the resource object used to limit which resources appear in the picker. Pair with resourceFilterValue. Supported field types: Checkbox (Boolean), Picklist, Text, Long Text, Number, and Lookup. Use ; to combine multiple fields (AND). Examples: Active__c, Type__c;Building__c
  • resourceFilterValue — optional. Value(s) the filter field must equal. , between values within ONE field = OR (IN clause); ; between values = AND across multiple fields. Booleans use true/false. Examples: true, Conference Room, North,South, Conference Room;North,South (Type = Conference Room AND Building IN North or South). The Setup Wizard auto-renders the matching control for the picked field — True/False dropdown for Booleans, dual-listbox for Picklists, free text for the rest.

Booking Object Settings

  • resourceBookingObject — the booking object, e.g. Room_Booking__c
  • bookingDateField — the Date field, e.g. Booking_Date__c
  • bookingStartTimeField — e.g. Start_Time__c
  • bookingEndTimeField — e.g. End_Time__c
  • bookingResourceField — lookup to the resource, e.g. Meeting_Room__c
  • relationshipFieldApiName — lookup to the parent, e.g. Contact__c

Or use the Setup Wizard:

  • configName — e.g. Training_Enrollment or Desk_Hoteling
3

What Comes Out

Booking records created automatically. When a user selects a resource, picks dates, chooses time slots on the grid, and clicks Book, the component creates one booking record per selected time slot. Existing bookings show as unavailable (pink/red) on the time grid. In capacity mode, slots show "3/10" badges and stay available until full. For multiple resources, availability is checked across all selected resources.
4

Summary View After Save

By default the booking UI stays expanded after Book. To collapse it into a small summary card after the user books (and let them click to re-expand), set both:

PropertyValueEffect
showInlinetrueRenders the booking UI inline on the page instead of a popup modal.
showDoneButtonInlinetrueShows a Done button that collapses the booking UI to a summary card listing the booked slots. Click the card to re-expand.

Useful on record pages where the booking widget should step out of the way once a reservation has been made.

Flow Setup

1

What You Need First

Same two objects as the Record Page section above (Resource + Booking). Create these Flow variables:

Variable NameTypeCollection?Notes
{!bookingSuccessCount}NumberNoHow many booking records were successfully created
{!bookingConflictDates}TextYesDates where bookings failed due to conflicts
2

Drop It In

Add a Screen element in Flow Builder, drag the Booking component onto it, and configure the same Resource and Booking Object settings as above, plus:

  • bookingSuccessCount (Output) — wire to {!bookingSuccessCount}
  • bookingConflictDates (Output) — wire to {!bookingConflictDates}
3

What Comes Out

Auto-saved — no Loop/Create Records needed. The component handles record creation internally when the user clicks Book. Use {!bookingSuccessCount} to show a confirmation message like "Successfully booked 3 time slots." Use {!bookingConflictDates} in a Decision element to notify the user about dates that couldn't be booked.
All Properties Reference

Configuration

PropertyTypeDefaultDescription
configNameStringName of a saved Config Custom Metadata record. Loads all settings from that record.

Display Properties

Shared display properties from Date: label (default: "Book Resource"), modalTitle (default: "Book Resource"), showInline, twoMonthView, calendarSize, dayHeaderFormat, weekStartsOnMonday, showRecurringPattern, showSelectedSummary, showDoneButtonInline, disabled, required.

Resource Configuration

PropertyTypeDefaultDescription
resourceObjectApiNameStringAPI name of the object storing your bookable resources (e.g. Meeting_Room__c).
resourceNameFieldStringNameField containing the resource's display name.
businessHoursStartFieldStringTime field defining when the resource becomes available each day.
businessHoursEndFieldStringTime field defining when the resource stops being available.
capacityFieldStringNumber field on the resource defining max concurrent bookings per time slot. When set, enables capacity mode with live "3/10" badges.
allowMultipleResourcesBooleanfalseWhen ON, users can select and book multiple resources at once.
showAvailabilityCountBooleantrueWhen ON with capacityField, shows live availability badges on time slots.

Booking Record Configuration

PropertyTypeDefaultDescription
resourceBookingObjectStringAPI name of the object where booking records are created.
bookingDateFieldStringDate field on the booking object.
bookingResourceFieldStringLookup field pointing to the resource being booked.
bookingStartTimeFieldStringTime field for the booking start time.
bookingEndTimeFieldStringTime field for the booking end time.
relationshipFieldApiNameStringLookup field linking each booking to the parent record.
resourceBookButtonLabelStringBookCustom label for the Book button, e.g. "Reserve" or "Schedule".

Time Slot Configuration

PropertyTypeDefaultDescription
timeIntervalInteger30Size of each bookable time slot in minutes: 15, 30, or 60.
disableTimeSlotGridBooleanfalseWhen ON, hides the time grid entirely — bookings are date-only (useful for full-day reservations like hotel rooms).
allowDifferentTimesBooleanfalseWhen ON, each date gets its own time slot grid instead of sharing one.
groupTimeSlotsByPeriodBooleanfalseWhen ON, groups time slots into Morning, Afternoon, and Evening sections.

Conflict Detection

PropertyTypeDefaultDescription
conflictLookAheadDaysInteger360Days ahead to scan for both availability badges (e.g. "3/5 days available") and booking conflicts on save. One setting controls both windows. Reduce for performance on high-volume booking objects.
conflictBehaviorStringblockblock — conflicting slots are unclickable. warn — conflicting slots show a warning but can be selected.

Status & Visual Properties

PropertyTypeDefaultDescription
statusFieldStringAPI name of a status field on the booking object for color coding.
statusColorsStringComma-separated mapping: Confirmed:green,Pending:orange,Cancelled:red.
statusColorDisplayStringbothWhere status colors appear: grid (time slots only), calendar (date cells only), or both.
hideBookingsWithStatusStringRecords with this status are hidden from the grid AND excluded from capacity counts. E.g. Cancelled.
statusFieldLabelStringCustom display label for the status field in edit mode.
hoverFieldsStringComma-separated field API names for tooltip on hover over booked slots.

Edit Mode Properties

Edit Mode opens a panel below the calendar where users can click dates to load their booking records, then bulk-update status, move to a new date, change times, or reassign a resource — all in a single Apply Changes click. The capacity-aware conflict check blocks moves that won't fit; reassign uses the same conflict detection as the booking flow. Two-click confirm protects deletes.

PropertyTypeDefaultDescription
enableEditModeBooleanfalseWhen ON, an Edit Bookings button appears next to the calendar. Clicking it reveals the bulk edit panel.
editButtonLabelStringEdit BookingsCustom label for the Edit Bookings button.
editRecordDisplayStringComma-separated list of fields to show in each row of the records list (e.g. name, status, time, resource).

Record Name Properties

PropertyTypeDefaultDescription
recordNameFieldStringText field on the booking object for a descriptive record name.
defaultRecordNameStringDefault record name, e.g. "Room Booking".
appendDateTimeToNameBooleanfalseWhen ON, appends date and time to the record name.

Constraint Properties

Shared from Date: maxSelections, allowPastDates (default: false), minDate, maxDate, disabledDates, defaultDates, availableDates, autoJumpToFirstAvailable.

Click-to-Save Properties

PropertyTypeDefaultDescription
saveButtonLabelStringSaveText on the save button.
preloadExistingDatesBooleantrueWhen ON, queries and displays existing booking records on the time grid.
preloadModeStringeditableeditable or readonly.
staticRecordIdStringHardcoded parent record ID for App Pages, Home Pages, and Experience Sites.
parentRecordIdFieldStringAlternative parent record linking field.
endDateFieldStringEnd Date field for consolidating adjacent date selections into ranges.
blockedDatesSourceObjectStringObject to query for blocked/unavailable dates.
blockedDatesDateFieldStringDate field on the blocked dates object.
blockedDatesFilterFieldStringOptional filter field on the blocked dates object.

Sub-Block Properties (Consolidate Time Span)

When consolidateTimeSpan is ON, the whole selection collapses into a single parent booking spanning the first slot through the last. Gaps between selected slots become child records on the sub-block object. Use for trainer day-bookings, vehicle reservations with travel time, or shifts with mandated breaks — situations where the resource stays held through the gap. Do not enable for conference-room-style use cases where the room should release between meetings.

PropertyTypeDefaultDescription
consolidateTimeSpanBooleanfalseMaster toggle. When ON, all selected slots collapse into one parent booking; gaps save as sub-block child records.
subBlockObjectApiNameStringAPI name of the child object that stores sub-block records (e.g. Sub_Block__c).
subBlockParentLookupFieldStringLookup field on the sub-block object pointing back to the parent booking.
subBlockDateFieldStringDate field on the sub-block object.
subBlockStartTimeFieldStringStart Time field on the sub-block object.
subBlockEndTimeFieldStringEnd Time field on the sub-block object.
subBlockNameFieldStringOptional Name field on the sub-block object — populated with the value of subBlockModeButtonLabel for every sub-block created.
subBlockModeButtonLabelStringOptional label for a manual "Mark as Sub-Block" toggle. Example: Mark as Break, Mark as Travel.
showSubBlockButtonBooleanfalseShows the manual toggle in the time grid header. Requires subBlockModeButtonLabel.

Output Properties (Read-Only)

PropertyTypeDescription
bookingSuccessCountIntegerNumber of booking records successfully created.
bookingConflictDatesString[]Dates where bookings could not be created due to conflicts.