MultiDatePick User Guide

Every component, setting and gotcha, in the order an admin meets them. No Apex required.

  • Passed Salesforce Security Review
  • 100% native: data stays in your org
  • 3 components
  • 5 views
  • 100+ properties
  • 40+ ready-made configs

1. The three components: when to use each

MultiDatePick ships three Lightning Web Components on one shared base. Pick the one that matches your data.

Date

In the builders: MultiDatePick - Dates

Pick many dates at once. Best for RSVPs, attendance, time off, blackout dates and holiday calendars.

Date component →

Date Time

In the builders: MultiDatePick - Dates & Times

Dates plus time slots. Best for classes, appointments, training blocks and shifts.

Date Time component →

Booking

In the builders: MultiDatePick - Resource Booking

Dates, times and a resource. Best for rooms, equipment, people and anything with capacity.

Booking component →

Feature comparison

Features stack. Everything on Date is also on Date Time and Booking. Date Time adds times. Booking adds resources and capacity.

Feature Date Date Time Booking
Available on all three components
Date selection✓✓✓
Five views✓✓✓
Status colors✓✓✓
Blocked dates✓✓✓
Load existing records✓✓✓
Edit mode✓✓✓
Recurring patterns✓✓✓
Date Time & Booking only
Time slots✓✓
Sub-block records✓✓
Booking only
Resource picker✓
Capacity badges✓

2. Record shapes: when to use each

A record shape is how a selection turns into records. It comes from three independent choices, and every combination works.

Choice 1
Time

Date: just dates, no times.

Date Time / Booking: each record has a start and end time.

Add-on: turn on Consolidate Time Span for one parent record across the whole time range, plus a sub-block child for each gap inside it.

Choice 2
Resource

None: Date, Date Time, or Booking without a resource.

Single resource: Booking with a resource dropdown.

Multiple resources: Booking with checkboxes, one record per checked resource.

Choice 3
Range

Per click: each selected date is its own record. Five clicks, five records.

Per range: back-to-back dates become one record with a start and end. Set End Date Field API Name.

The Setup Wizard names six shapes: one record per date, one per date range, one per time block, parent plus sub-blocks, single resource and multiple resources.

Worked examples: answer the 3 questions

Answer three questions per scenario to land on a shape. The Setup Wizard asks the same three.

MultiDatePick Setup Wizard in Salesforce: the Walk me through it questions about time, resource and range, with a small record-shape diagram on each answer card
Walk me through it asks the same 3 questions in your org and picks the shape for you.

PTO request

Do you need times? No, just dates.

Do you need a resource picker? No.

Should adjacent dates merge? Yes. Mon to Fri PTO should be ONE record.

→ Per range: one record, start Mon, end Fri.

Conference room reservation

Do you need times? Yes, each booking has a start and end.

Do you need a resource picker? Yes, pick one room.

Should adjacent dates merge? No, each booking is its own record.

→ Single resource: one record per date × time block, tied to the room.

Training across 3 rooms

Do you need times? Yes, the same start and end each day.

Do you need a resource picker? Yes, several rooms with checkboxes.

Should adjacent dates merge? Yes, it runs Mon to Fri.

→ Multiple resources, per range: one record per room covering the full week.

Full-day training with a lunch break

Do you need times? Yes, 9 AM to 5 PM with a lunch gap.

Do you need a resource picker? No.

Should the gap be tracked? Yes, as its own child record.

→ Parent plus sub-blocks: one parent from 9 AM to 5 PM, one sub-block for lunch.

The grid: every combination

Pick the row for your time and resource needs. The column depends on whether End Date Field API Name is set. Every cell is a valid setup.

Time + resource Per click
(no End Date Field)
Per range
(End Date Field set)
Date
No time. Date component.
One record per date
1 date → 1 record.
Use for: RSVPs, attendance, daily check-ins.
One record per date range
Back-to-back dates → 1 record with start and end.
Use for: PTO, travel, multi-night stays.
Date Time
A time block per record. Date Time component.
One record per time block
1 date × 1 time block = 1 record.
Use for: timesheets, shift segments, training blocks.
Range with a shared time block. Back-to-back dates with the same times → 1 record.
Use for: multi-day training with the same hours each day.
Date Time + Consolidate Time Span
Parent record plus sub-block children for gaps
Parent plus sub-blocks
One parent spans the full time range. Each gap inside it becomes a sub-block child.
Use for: training with lunch breaks, field routes with travel between stops.
Booking, single resource
One resource dropdown. Booking component.
Single resource
1 record per date × time block, tied to the resource.
Use for: conference rooms, trainer scheduling.
Single resource range. Back-to-back dates on one resource → 1 record per range.
Use for: multi-night room stays, multi-day equipment checkout.
Booking, multiple resources
Resource checkboxes (Allow Multiple Resources)
Multiple resources
1 record per resource × date × time block.
Use for: parallel team meetings, multi-room training.
Multiple resource range. Back-to-back dates across N resources → N records, one per resource.
Use for: a week of training in 3 rooms at once.
Booking + Consolidate Time Span
Parent booking plus sub-block gap children
Booking parent plus sub-blocks. A resource booked all day with its breaks on record.
Use for: lab equipment with maintenance windows.

Bottom line: any combination of the three choices works. If your scenario is not a named pattern, set each choice on its own and the component does the rest.

3. Setup Wizard walkthrough

The Setup Wizard saves a configuration once. Type its name into Config Name on any page or Flow screen and that placement uses it. Change the config and every placement follows.

  1. 1 Name & Type
  2. 2 Object & Fields
  3. 3 Time Fields
  4. 4 Status & Display
  5. 5 Review & Save

Choose a start

The Create New tab offers two paths. Walk me through it asks three questions and picks the component and shape. Configure all properties opens every setting. Two more tabs sit beside it: Existing Configurations to edit a saved config, and Import to paste one from the Config Library.

MultiDatePick Setup Wizard in Salesforce: the start screen with the Walk me through it and Configure all properties paths
Walk me through it runs the 3 questions. Configure all properties goes straight to step 1.

Step 1: Name & Type

Pick the component (Date, Date Time or Booking) and name the config. The name is what you type into Config Name later. This step also sets the views: the default view, which views the switcher offers, and the Timeline and Agenda options.

MultiDatePick Setup Wizard in Salesforce, Name and Type step: the component type chooser for Date, Date Time and Booking, with the config name and label inputs
Step 1: pick the component, name the config.
MultiDatePick Salesforce setup wizard view options: Calendar, Timeline and Agenda chosen for the view switcher, Group Timeline By set to the Advisor Specialty picklist, and Client Name, Meeting Type and Status picked as the agenda fields
View options: choose the switcher's views, group Timeline rows by any picklist or lookup, pick Agenda columns from a list.

Step 2: Object & Fields

The big one. Pick the object that holds the records, its date field, and the relationship field back to the parent. Optional fields add ranges, resources, capacity, sub-blocks and blocked dates. Booking configs set the resource object, capacity field and business hours here too.

MultiDatePick Setup Wizard in Salesforce, Object and Fields step: the related object, date field, relationship field and end date field pickers, plus the placement chooser
Step 2: the wizard reads your org's schema and offers a dropdown for every field.
MultiDatePick Salesforce setup wizard, Object and Fields step: every field is a dropdown filtered to the chosen object, here Advisor Appointment and Advisor, with the Capacity Field list open showing only the Advisor number fields
No API names to look up. Each list shows only fields of the right type, so Capacity Field lists number fields.
MultiDatePick Salesforce setup wizard Blocked Dates section: the Advisor Closure object chosen as the source, its Closure Date, Start Time and End Time fields picked, and the resource field list open showing its lookups
Blocked dates come from any object. Pick it and the date, time and resource lists fill in.

Step 3: Time Fields

Date Time and Booking only. Map the start and end time fields, then set the Time Interval (any interval works; 15, 30 or 60 minutes are typical), the earliest and latest time, the display mode, and what happens on a conflict.

MultiDatePick Setup Wizard in Salesforce, Time Fields step: start and end time fields, a 30 minute time interval, grid display mode, 08:00 to 18:00, conflict behavior Block and 90 conflict look-ahead days, with the live preview below
Step 3: time fields, interval and conflict rules, with the live preview underneath.

Step 4: Status & Display

Status field and colors, statuses to hide, statuses users may pick, hover fields, Edit Mode, record naming, button labels, calendar size and limits such as Max Dates Allowed.

MultiDatePick Setup Wizard in Salesforce, Status and Display step: Status Field, Status Colors mapping with color swatches, and Hide Bookings With Status
Status Colors reads the picklist values from your status field. Each gets a swatch.
MultiDatePick Setup Wizard in Salesforce, Status and Display step: record naming, hover fields, calendar size, day header format, and the feature toggles
Display options and feature toggles, with the live preview underneath.

Step 5: Review & Save

Check the summary, try the live preview, then click Save Configuration. The wizard deploys the config for you in 30 to 60 seconds. Add an optional description when it finishes.

MultiDatePick Setup Wizard in Salesforce, Review and Save step: a summary of every chosen setting and a working preview of the configured calendar, with the Save Configuration button
Step 5: every setting in one list and a working preview. Nothing saves until you click Save Configuration.

Existing Configurations and Import

Saved configs list on Existing Configurations: click one to edit or export it. The Import tab takes the JSON from any Config Library card, or an export from another org.

MultiDatePick Setup Wizard in Salesforce: the Import tab with a box for pasting a JSON config and the Save Description card after import
Import: paste a JSON config to deploy the same setup anywhere.
MultiDatePick Setup Wizard in Salesforce: the Existing Configurations tab listing saved configs with their component type, label and description
Existing Configurations: every saved config, ready to edit or export.
In a Screen Flow, set Config Name and stop there. Every checkbox comes from the config, so you never need a $GlobalConstant. Bind the parent record to Parent Record Id.

4. Permission sets & access

The package ships three permission sets. Assign them in Setup, Permission Sets.

Permission setWho gets itSetup WizardUse calendars
MultiDatePick - SetupThe admins who build configs✓ YesNo
MultiDatePick - UserEveryone who uses the calendarsNo✓ Yes
MultiDatePick - All AccessAdmins who build and use them✓ Yes✓ Yes

The components run in each user's own permissions, so users also need access to your objects and fields:

  • Objects: Read and Create on the object the records save to, plus Read on any resource, closure or child object the calendar reads.
  • Fields, read: every field the calendar shows (date, status, hover fields).
  • Fields, edit: every field it writes (date, times, status, second picklist, name field, the parent lookup). A field the user cannot edit fails the save, even when reads work.
  • Referenced records: at least Read on the parent and resource the new record points to.
Admins need field access too. A brand-new custom field is invisible to everyone, System Administrators included, until a permission set grants it. If a field seems missing at save time, check field-level security first.

Each error message and its cause is on Troubleshooting: access errors. Guest sites need a few extra steps: see Public guest pages.

5. Click to Save vs Flow-Managed Save

There are two ways to save. Pick the one that fits the placement.

Click to Save

The component writes the records itself. Fill in four settings and its own Save button appears. Click it and the child records are created. No Flow elements, no code.

Use on: Record Pages, App Pages, Home Pages, Experience sites and Flow screens with a parent record.

Flow-Managed Save

The component hands the selection to your Flow. Use the bundled Parse Date Entries from JSON action, then your own Loop and Create Records elements.

Use on: Flow screens where you want full control: approvals, conditional records, extra validation.

Click to Save: the four settings

The Setup Wizard fills these in. When all four have a value, the Save button appears.

SettingWhat it holdsAPI name
Child Object API NameThe object the records save torelatedObjectApiName
Date Field API NameThe date field on that objectdateFieldApiName
Relationship Field API NameThe lookup back to the parent recordrelationshipFieldApiName
Parent Record Id or Static Parent Record IdThe parent. Filled in automatically on a Record Page. In a Flow, bind Parent Record Id. On App, Home and Experience pages, type the Id into Static Parent Record Id.recordId / staticRecordId
Two buttons in a Flow screen. With Click to Save on, the component's Save writes the records and the Flow's Next only moves on. Users click Save first, then Next.

Which parent record a page uses, and when to pick it in a Flow instead, is covered on App, Home & Experience Pages.

Flow-Managed Save: the outputs

Leave the four settings blank. The Save button hides and the selection comes out through these Flow outputs:

OutputContainsComponents
Selected Dates (Output)A text collection of dates (YYYY-MM-DD)Date, Date Time
Date Ranges JSON (Output)Back-to-back dates grouped into rangesDate, Date Time
Dates With Times JSON (Output)Each date with its timesDate Time
Successful Bookings Count / Conflict DatesResults after Booking's own saveBooking

Pass the JSON to Parse Date Entries from JSON. It returns a list you can Loop over, with a from date, to date, start time, end time and resource Id on each item. Step by step: Flow recipes.

Saving only adds

Click to Save only creates new records. Deselecting a date never deletes a saved record, so a wrong click cannot lose data. To change or remove records, use Edit Mode or the related list.

6. Status colors & edit mode

Status colors and filtering

Color records by any picklist on your object, hide some values, and limit what end users can pick.

SettingWhat it doesAPI name
Status FieldThe picklist that drives colors, for example Confirmed / Tentative / Cancelled.statusField
Status ColorsA color per value, like Confirmed:#22C55E, Tentative:#fbbf24. Leave blank for an automatic palette.statusColors
Status Color DisplayWhere colors show: calendar, grid or both. Leave it empty for a clean customer page with no colors.statusColorDisplay
Hide Records With StatusHides records with these values (for example No-Show,Cancelled) from the calendar and from capacity counts.hideBookingsWithStatus
Selectable StatusesLimits which values an end user can choose, for example only Requested, while staff see them all.selectableStatuses
Two pages, one object. A customer page can use no colors, only Requested as a selectable status, and hide No-Show and Cancelled. A back-office page on the same records turns colors on and offers every status.

Edit mode

Turn on Enable Edit Mode and an Edit Dates button appears. In edit mode users can:

  • See existing records as cards with their date and status
  • Click dates to add their records to the edit set
  • Change the date, times, resource or status, and the record updates
  • Delete with a two-click confirm, so nothing goes by accident
Animated demo of MultiDatePick Edit Mode on a Salesforce calendar: two days of Requested appointments are selected, Select All picks both bookings, the status is changed to Confirmed, and after Apply Changes both days turn from blue to green
Bulk status change: select the days, Select All, pick the status, Apply.
Animated demo of MultiDatePick Edit Mode on a Salesforce calendar: one day's two client appointments are selected, a new date is entered in Move to date, and after Apply Changes the bookings leave the 16th and appear on the 22nd
Move bookings: pick the day, choose a new date, Apply. The same panel changes resource or times.
Salesforce booking calendar with status colors on each day and Edit Mode open: the selected day lists each appointment by client name with its status, time and advisor, ready for a bulk status change or move
Status colors paint each day. Edit Mode lists the day's records, ready to change.

7. Views: five layouts, one component

Every component draws five layouts. They read the same records through the same field mappings, follow the same conflict rules, blocked dates and business hours, and save the same way. Switching views changes how records look, never what they mean.

The five, and the question each answers

ViewThe questionLayoutWritable?
CalendarWhat is happening on the 14th?A month at a time, status colors per day.Yes. The default.
TimelineWhich resource is free, and when?Resources down the side, dates across the top. Multi-day records draw as one bar.Yes
WeekWho is free Thursday at 2pm?Seven days across, business hours down. Drag across days and hours at once.Yes
UtilizationWho is over capacity?Heatmap of capacity used, per resource per day.No, read only
AgendaWhat is next?A list of the next 60 days in order.No, read only
Do not default a booking page to Utilization or Agenda. Both are read only, so the page would lose its main job. Offer them in Available Views and open on a writable view.

Settings

SettingDefaultWhat it does
ViewviewCalendarThe layout the component opens on.
Available ViewsavailableViewsblankViews the switcher offers, for example calendar,timeline,agenda. Blank offers all five. Your default view is always included, so list only the extras.
Timeline Window (Days)timelineWindowDays14Days Timeline shows at once. A full month leaves each booking about twenty pixels wide and clips its label. Set 0 for the full month. The inner arrows step one window, the outer arrows one month.
Resource RowsresourceViewFilterallbooked draws only resources with a booking in view. The best way to shorten a long list, because an empty row carries no information. Shows every resource again when nothing is booked anywhere.
Max View ResourcesmaxViewResources0 (all)Caps how many resource rows Timeline and Utilization draw, busiest first. Everything is still counted. Prefer Resource Rows, which only hides empty rows.
Agenda FieldsagendaFieldsblankExtra fields on each Agenda row, up to four. Blank reuses Hover Popover Fields. Date, time and name are already on the row.
Capacity FieldcapacityFieldblankNot a view setting, but Utilization needs it to show percentages instead of raw counts.

A different view per page

The view is a setting on each placement, so the same records can look different wherever they appear. One install, one set of field mappings.

PlacementViewAvailable Views
Recruiter's interview pageWeekcalendar,agenda
Facilities room booking pageCalendartimeline,utilization
Shift manager's rosterTimelineweek,agenda
Operations wall displayAgendautilization,timeline
Public Experience Cloud pageCalendarblank, or keep it short

Edit mode works in every view

With Enable Edit Mode on, the Edit button shows in every view. Click a record in Timeline, Week or Agenda to add it to the edit set, just like a date on the month calendar. A bulk status change from Timeline works exactly like one from the calendar.

Timeline: collapsed rows

When a resource has overlapping bookings, its row collapses to one strip with an N at once chip. A twisty opens one lane per booking. Collapsed rows still accept drag, hover and click.

Salesforce timeline view with overlapping multi-day bookings stacked into lanes under each resource, a twisty on each multi-lane row, and a combined capacity strip across the top
Overlapping bookings stack into lanes. The strip on top shows how full each day is.

Timeline: drag to reschedule

With Enable Edit Mode on, Timeline bars drag. Grab the middle to move a booking to other days. Grab an edge to change its start or end. The bar shows where it will land and saves when you let go. In Day zoom the same gestures change the times.

Animated demo of rescheduling on the MultiDatePick Salesforce timeline: dragging the right edge of an engagement stretches it two days, then dragging another engagement slides it two days later, each saving on release with its new dates shown on the bar
Stretch one booking from its edge, slide another to later days. Each saves on release.

Schedule people, not just rooms

Resource Object API Name takes any object. Set it to User and Timeline becomes a roster, Week a shift grid and Utilization a team capacity dashboard.

  • User has no standard capacity field. Add a custom one (for example Daily Capacity) to see Utilization in percentages.
  • Map Business Hours Start Field and Business Hours End Field to User fields and the Week grid follows each person's own hours.

The Config Library has two ready-made examples: Team Capacity Planning and Staff Shift Roster.

MultiDatePick showing Salesforce bookings in all five views: resource timeline, month calendar, utilization heatmap, week grid and agenda list
The same bookings in all five views.

8. Resource booking & capacity (Booking component)

Single resource

Users pick one resource from a dropdown. The time grid loads that resource's bookings and capacity.

Multiple resources

Turn on Allow Multiple Resources and the dropdown becomes checkboxes. The grid shows only slots open on every checked resource, and Save books them all at once.

Salesforce booking calendar in multi-resource mode with two resources checked, showing a combined capacity grid with X/Y badges on each time slot
Two resources checked. Each badge shows bookings over capacity across both.

Capacity

Let several bookings share a slot, with live 3/5 badges. A full slot stops taking bookings.

SettingWhat it doesAPI name
Capacity FieldA number field on the resource, for example Capacity = 5.capacityField
Show Availability CountShows the X/Y badges.showAvailabilityCount
Capacity AggregationCombined (default) adds bookings and capacities across checked resources: two rooms of 5 read 0/10. Distinct counts one event booked across several resources once and uses the largest single capacity: a class in 4 rooms reads 1/5, not 4/20.capacityAggregation
Capacity needs both booking time fields. Without Booking Start Time Field and Booking End Time Field there are no slots to count, and the component shows an amber banner instead of the calendar.

Conflicts

Conflict Behavior decides what happens when a picked slot is already taken. Conflict Look-Ahead Days sets how far ahead to check (default 360).

ValueWhat happensBest for
Block (default)A taken slot cannot be picked, and the save stops with the conflicts highlighted.Most booking pages
SkipSaves the open slots and skips the taken ones. The skipped dates come back in Conflict Dates (Output).Grabbing whatever is still open across many dates
AllowNo conflict check. Bookings can go past capacity.Deliberate overbooking

A closure always wins. Nothing saves onto a blocked slot, even with Allow.

9. Limiting what users select

Cap how much one person can pick, by dates or by time slots.

SettingWhat it doesAPI name
Max Dates Allowed
Booking: Max Dates Per Booking
Most dates a user can pick. 0 means no limit.maxSelections
Max Time SlotsMost time slots in total, across all dates. 0 means no limit. Use 1 for one appointment per person.maxTimeSlotSelection
Earliest / Latest Selectable DateGreys out dates outside the window.minDate / maxDate
Allow Past DatesOff means today and later only. On by default for Date and Date Time, off for Booking.allowPastDates
Max Dates Allowed caps dates, not slots. With a limit of 1, a user can still pick several slots on that one date. Add Max Time Slots to cap the number of bookings.

10. Blocking dates, times & resources (closures)

Any calendar can read closures from another object and grey out the dates, time slots or resources they cover, so users only book when you are open. Point a few settings at the closure object and the component does the rest. Whole-day blocks work on all three components. Time and resource blocks need the time grid of Date Time or Booking.

Blocking vs. hiding: what's the difference?

The two sound alike but do opposite things. Blocking takes availability away: the slot shows but cannot be booked. Hiding takes records out of view, which frees their slots.

Blocking (closures) Hiding (by status)
What it controlsWhich dates, times and resources can be bookedWhich saved records appear
SettingBlocked Dates Object and its date, time and resource fieldsHide Records With Status
Driven byA closure or holiday list: its own object, or your booking object filteredA status value on the records themselves
What users seeThe slot is there but struck through, greyed and unclickableThe record is gone from the calendar
Effect on capacityRemoves availabilityFrees availability: the hidden record stops counting
The dataNo booking exists; you are marking it off-limitsRecords still exist in Salesforce
Use it forHolidays, maintenance windows, a closed room or regionCancelled or Rejected bookings that should not clutter the grid or count against capacity
One status can do either, depending on the feature you wire it to. Take a Cancelled booking:
  • Hide Records With Status = Cancelled → the booking disappears and its slot opens up.
  • Blocked Dates Object = your booking object, filtered to Status = Cancelled → the booking blocks its date so nobody rebooks it.
Hide to free the slot. Block to keep it off-limits.

The blocked-dates settings

SettingWhat it doesAPI name
Blocked Dates ObjectThe object holding closures, such as an Office Closure object or your booking object. Setting it turns blocking on.blockedDatesSourceObject
Blocked Dates Date FieldThe date field on that object.blockedDatesDateField
Blocked Dates Start / End Time FieldOptional time fields. Set both for partial-day blocks; leave them blank for whole-day. Date Time and Booking.blockedDatesStartTimeField / blockedDatesEndTimeField
Blocked Dates Resource FieldOptional lookup that narrows a closure to one resource. Blank means the closure applies to every resource. Booking.blockedDatesResourceField
Blocked Dates Filter Field / ValueOptional scope, such as Region = North or Status = Cancelled. This is how one closure table serves many calendars.blockedDatesFilterField / blockedDatesFilterValue

Three levels of blocking

  1. Whole day: a closure with no times greys out the whole date. All three components. A closed date stays closed even if it already has bookings.
  2. Part of a day: a closure with a start and end time blocks just those slots. The rest of the day stays bookable. Blocked slots show once a date is selected.
  3. One resource: a closure pointing at a resource closes only that resource. In a single-resource view the slot is struck through. In the combined view it gets a small corner flag and stays bookable on the open resources.

Using the time grid? You want part-of-day blocks. Whole-day blocks suit date-only pickers.

Two patterns for the closure object

  • Same object, flagged by status: point Blocked Dates Object at your booking object and filter Status = Cancelled, so cancelled bookings double as closures. Simplest, but every calendar on that object shares them. See the Holiday Aware Appointment Booking config in the Config Library.
  • A dedicated closure object: an Office Closure object with a date, optional start and end times, a Region field and an optional resource lookup. Each calendar filters by its region, and a closure can target one resource. See the Time-Aware Resource Closures config.

To let people block their own time (an owner blocking a morning, say), place a Date Time component that saves to the closure object on an internal page or site.

How blocked slots behave

  • Look: a fully closed slot is struck through and greyed. A slot closed for only some of the picked resources gets a corner flag.
  • Selection: a fully closed slot cannot be clicked or dragged over.
  • Save: nothing saves onto a closed resource, date and time. With multiple resources, only the closed one is left out; the open ones still book.

One closure table, many calendars

Give the closure object a tag field (Region, Location, Building) and put the same field on your resources. Each calendar then uses Resource Filter Field / Value to show its own resources and Blocked Dates Filter Field / Value to read its own closures.

11. Public guest pages (Experience Cloud)

Put a component on an Experience Cloud site and anyone can book without logging in. Do all five steps before testing as a guest.

  1. Object permissions. Give the site's guest user Read, plus Create if guests submit, on each object. Salesforce never lets guests edit or delete records, so keep edit, cancel and delete pages for logged-in users.
  2. Field-level security on every field the component touches, including resource business-hours fields and closure time fields. One missing field stops the resource or closure query.
  3. A guest sharing rule (Read) so the guest can see the records. The object's external org-wide default must be Private for the rule to apply. A rule deployed as metadata needs one click on Recalculate in Setup, Sharing Settings.
  4. Apex class access to MultiDatePickController on the guest profile. The component loads its data through it.
  5. Activate the site. Publishing and activating are separate steps.
Empty calendar for guests? If objects, fields and class access all look right, it is almost always the sharing recalculation in step 3. Steps 4 and 5 are the next most often missed.
  • Which record guests see: a public page uses Static Parent Record Id, so every guest books against the same parent (one office, location or resource). For a record per visitor, drive it from a Flow with a URL parameter. True per-user calendars need logged-in users.
  • Contacts and Accounts: Salesforce restricts guest access to them heavily. Book guests against a custom object, or use an authenticated site.
  • Several components on one page: they do not live-sync. Add a refresh prompt between them so a block made in one shows in the next.

Placement steps are on App, Home & Experience Pages. A full worked site is on Experience Cloud Booking.

12. Common gotchas (FAQ)

Seeing a banner, a missing Save button or an empty calendar? Troubleshooting shows each message with a screenshot and the fix.

My status colors aren't applying
Check three things. (a) Is Status Field the exact picklist API name? It is case sensitive. (b) Does Status Colors use the format Value:#hex, Value:#hex with no quotes? 'Confirmed':'#22C55E' breaks it silently. (c) Do the records actually have a value in that picklist?
Records save with unexpected names
Check Record Name Field: if the field is short, long names get cut. Check Append Date to Record Name: when on, the selected date and time are added to every name.
How do I hide Cancelled records from the capacity grid?
Set Hide Records With Status to Cancelled, or a list such as Cancelled,Rejected. They drop out of the calendar and the capacity count.
What's the difference between blocking and hiding?
Blocking (closures) keeps a date, time or resource visible but unbookable: holidays, maintenance, a closed room. Hiding removes records such as Cancelled from the calendar and capacity, which frees the slot. See Blocking vs. hiding.
The Edit button isn't appearing
Turn on Enable Edit Mode. That is the only requirement, on all three components. A Status Field is optional; it only adds a status dropdown in the editor. If the button is still missing, the page or the config has Enable Edit Mode off.
I only want some resources (rooms, not equipment)
Use Resource Filter Field and Resource Filter Value. One value: field Active__c, value true. Several values (OR): North,South. Several fields (AND): field Type__c;Active__c, value Conference Room;true.
Date Time keeps showing one shared time picker
Time Display Mode is the setting to use: Grid or Dropdown. In Grid mode every date shares the grid. For a separate time per date, choose Dropdown and turn on Allow Different Times Per Date.
How do I move from Flow-Managed Save to Click to Save?
Fill in Parent Record Id, Child Object API Name, Date Field API Name and Relationship Field API Name. Remove the Parse Date Entries from JSON action and the loop that created records. The component's own Save button now writes them.
I get an error toast with no detail
Open the browser's developer console and look for lines starting [MDP:ERROR]. The full error is always logged there, even when the toast is short.

13. Flow recipes

Everything here is built in Flow Builder. No Apex.

Loop over the selected dates

  1. Add a Screen with the Date Time component. Leave the Click to Save settings blank.
  2. After the screen, add the Parse Date Entries from JSON action. Pass it Dates With Times JSON (Output).
  3. Loop over the action's list. Each item has a from date, to date, start time and end time.
  4. Inside the loop, assign the values to a record variable and add it to a collection. Create the records once, after the loop.

Roll the first and last date up to the parent

Want the parent to show the earliest and latest child date? Pick the no-code route that fits your data.

Your setupDo this
Master-detail relationshipAdd two Roll-Up Summary fields on the parent: MIN of the date field and MAX of the date field. Done.
Lookup relationshipA Record-Triggered Flow on the child (after save). Get Records on the child object for the same parent, sorted by date ascending, first record only. Do the same sorted descending. Update the parent's start and end date with the two dates.

More Flow patterns: Screen Flow Guide.

14. Object & field mapping

Each component page has a full object and field mapping diagram:

The components work with any object. The sample objects in the package (Schedule, Event, Resource, Sub Block) are only defaults. Point the settings at your own custom or standard objects with the right fields.

15. All properties reference

Every setting on the three components, by the label you see in Lightning App Builder, Experience Builder and Flow Builder. The API name sits under each label.

All properties 100+ properties Click to expand: searchable
Property Date Date Time Booking Type Default Description
Setup
Config NameconfigName✓✓✓StringblankOptional: DeveloperName of a Config__mdt record created by the Setup Wizard. When set, all field/object settings from that config are applied as defaults. Text and number properties you set here override the config. Checkboxes always come from the config: an unticked box is indistinguishable from one never set.
Views
Viewview✓✓✓StringcalendarWhich renderer to use. calendar is the month grid (default). timeline shows resources as rows and dates as columns. week is a day-by-hour grid. utilization is a capacity heatmap, read only. agenda is a chronological list, read only.
Available ViewsavailableViews✓✓✓StringblankComma-separated list of views to offer in the switcher, e.g. calendar,timeline,agenda. Leave blank to offer all five. The default View above is always included.
Timeline Window (Days)timelineWindowDays✓✓✓Integer14How many days the Timeline view shows at once. A whole month leaves each booking about twenty pixels wide and clips every label, so 14 is the default. Set 0 to show the full month instead.
Timeline ZoomtimelineZoom✓✓✓StringweekStarting zoom for the Timeline view: day (hours of one day), week (the Timeline Window) or month. Users can switch zoom while viewing.
Timeline Group By FieldtimelineGroupByField✓✓✓StringblankAPI name of a field on the resource object (for example Building__c) to group Timeline rows under headers with a capacity strip. Leave blank for one flat list.
Max View ResourcesmaxViewResources✓✓✓Integer0Most resource rows the Timeline and Utilization views draw, busiest first. Keeps a large resource list from turning either view into an unreadable wall.
Agenda FieldsagendaFields✓✓✓StringblankComma-separated fields to show on each row of the Agenda view, after the record name. Leave blank to reuse Hover Fields. The date, time and record-name fields are skipped automatically because the row already prints them.
Resource RowsresourceViewFilter✓✓✓StringallWhich resources get a row in Timeline and Utilization. all draws every resource; booked draws only those with a booking in the current window, which is the better way to shorten a long resource list because hiding an empty row loses nothing.
Display and layout
Button Labellabel✓✓✓StringDate: Select Dates; Date Time: Select Dates & Times; Booking: Book ResourceText shown on the button that opens the date picker. Example: 'Choose Dates' or 'Add Dates'
Calendar TitlemodalTitle✓✓✓StringDate: Select Dates; Date Time: Select Dates & Times; Booking: Book ResourceTitle displayed at the top of the calendar modal.
Show Inline (Always Visible)Also shown as Show Inline (No Button)showInline✓✓✓BooleantrueWhen ON, the calendar is always visible without needing to click a button. When OFF, a button opens the calendar in a popup.
Two-Month ViewtwoMonthView✓✓✓BooleanfalseWhen ON, shows two side-by-side months for easier range selection. When OFF, shows one month at a time.
Calendar SizecalendarSize✓✓✓StringmediumControls the overall size of the calendar. Valid values: small, medium, large. Default is medium. Use small for tight spaces, medium for most layouts, large for touch-friendly experiences.
Day Header FormatdayHeaderFormat✓✓✓String3Length of day-of-week headers. Valid values: 3, 2, 1. Default is 3. 3 = SUN MON TUE, 2 = SU MO TU, 1 = S M T.
Week Starts on MondayweekStartsOnMonday✓✓✓BooleanfalseWhen ON, the calendar week begins on Monday (ISO standard). When OFF, the week begins on Sunday (US standard).
Show Recurring Pattern ButtonshowRecurringPattern✓✓✓BooleantrueWhen ON, shows a button that lets users quickly select all weekdays, weekends, or specific days of the week up to an end date.
Show Selection SummaryshowSelectedSummary✓✓✓BooleantrueWhen ON, displays a summary showing how many dates are selected and which ones.
Show Done Button in Inline ModeshowDoneButtonInline✓✓✓BooleanfalseWhen ON and Show Inline is enabled, shows a Done button that collapses the calendar to a summary view.
Show In-Component ToastshowSuccessToast✓✓✓BooleanfalseDraw a success/error toast inside the component (needed on Experience sites, where the standard toast does not show). Also works on record pages.
Success Toast Message (optional)successToastMessage✓✓✓StringblankOptional custom message on a successful save. Blank uses the default.
Selection rules
Requiredrequired✓✓✓BooleanfalseWhen ON, the user must select at least one date before the Flow can advance to the next screen.
Max Dates AllowedAlso shown as Max Dates Per BookingmaxSelections✓✓✓Integer0Maximum number of dates a user can select. 0 = unlimited.
Max Time SlotsmaxTimeSlotSelection✓✓Integer0Maximum number of time slots a user can select in total (across all dates). 0 = unlimited.
Allow Past DatesallowPastDates✓✓✓BooleanDate: true; Date Time: true; Booking: falseWhen ON, users can select any past date. When OFF, only today and future dates are selectable.
Earliest Selectable DateAlso shown as Earliest Bookable DateminDate✓✓✓DateblankThe earliest date users can select. Dates before this are greyed out.
Latest Selectable DateAlso shown as Latest Bookable DatemaxDate✓✓✓DateblankThe latest date users can select. Dates after this are greyed out.
Pre-Selected DatesdefaultDates✓✓✓String[]blankDates that are already selected when the calendar opens. Provide as ISO format (YYYY-MM-DD).
Blocked DatesdisabledDates✓✓✓String[]blankSpecific dates that cannot be selected (shown greyed out). Use for holidays or blackout dates. Provide as ISO format (YYYY-MM-DD).
Only These Dates Are SelectableavailableDates✓✓✓String[]blankWhen set, ONLY these dates are selectable: all others are greyed out. Provide as ISO format (YYYY-MM-DD). Useful when valid dates come from another source in your Flow.
Auto-Jump to First Available DateautoJumpToFirstAvailable✓✓✓BooleanfalseWhen ON and 'Only These Dates Are Selectable' is set, the calendar automatically opens to the month of the first available date.
Allow Whole-Day (No Times)allowWholeDayNoTimes✓✓BooleanfalseWhen on, selecting a date with no time slots saves a whole-day record (blocks or books the entire day). Dates with time slots save as timed records.
Records and saving
Parent Record IdrecordId✓✓✓StringblankWhen set, the component runs in Click to Save mode and writes child records linked to this parent. Pass in a record Id from a Get Records or recordCreate output (e.g. {!recordVar.Id}). Leave blank to use the standard parser+loop+create pattern.
Static Parent Record IdstaticRecordId✓✓✓StringblankEdge case: hardcode a Record Id to pin this calendar to a single parent record. Works on Record Page, App Page (requires static id), Home Page (requires static id), and Experience Site (requires static id). On a Record Page, leave blank: the page's record is auto-injected.
Parent Record Id FieldparentRecordIdField✓✓✓StringblankOnly needed when this component lives on a DIFFERENT object's record page than the parent. Enter the API name of the lookup field that points to the real parent. Leave blank when this component is on the parent object's page.
Child Object API NameAlso shown as Related Booking Object API Name; Child Object API Name (for preload)relatedObjectApiName✓✓✓StringblankAPI name of the object where each selected date is saved as a record. Example: Appointment__c, Schedule_Entry__c. Required for Click to Save.
Date Field API NameAlso shown as Date Field API Name (for preload)dateFieldApiName✓✓✓StringblankAPI name of the Date field on the child object that stores the selected date. Example: Event_Date__c, Start_Date__c
End Date Field API NameAlso shown as End Date FieldendDateField✓✓✓StringblankAPI name of an End Date field on the child object. When set, adjacent selected dates are consolidated into a single record with start and end dates instead of one record per date. Example: End_Date__c
Relationship Field API NameAlso shown as Parent Record Relationship FieldrelationshipFieldApiName✓✓✓StringblankAPI name of the lookup field on the child object that links back to the parent record. Example: Account__c, Contact__c, Order__c
Load Existing DatesAlso shown as Load Existing BookingspreloadExistingDates✓✓✓BooleantrueWhen ON, queries existing child records and shows their dates in the calendar on load. Requires Child Object, Date Field, and Relationship Field.
Existing Dates ModeAlso shown as Existing Bookings ModepreloadMode✓✓✓StringeditableControls how loaded dates appear. Only applies when Load Existing Dates is ON. Valid values: editable, readonly. Default: editable. editable = dates are selected and can be changed. readonly = dates appear greyed out and cannot be removed. In Flow this renders as a free-text input, so type one of these exact values.
Save Button LabelsaveButtonLabel✓✓✓StringSaveText on the save button when in Click to Save mode. Example: 'Save Dates', 'Confirm Selection'
Record Name FieldrecordNameField✓✓✓StringblankAPI name of a text field on the child object where a record label is saved. When set, a text input appears for users to enter a label.
Default Record NamedefaultRecordName✓✓✓StringblankPre-fills the record name input. Users can change it at runtime. Example: 'PTO Day', 'Team Meeting'.
Append Date/Time to Record NameAlso shown as Append Date to Record NameappendDateTimeToName✓✓✓BooleantrueWhen ON, appends the date to the record name.
Status and edit
Status FieldstatusField✓✓✓StringblankAPI name of a picklist/status field on the child object. When configured, a status dropdown appears alongside the record name input so users can assign a status when selecting dates. Required for Status Colors, Hide Records With Status, Status Field Label, and Enable Edit Mode. Example: Status__c
Status ColorsstatusColors✓✓✓StringblankComma-separated mapping of status values to hex colors. Format: Value:#hex. Status colors are shown on calendar date cells. Requires Status Field. Example: Confirmed:#22C55E, Tentative:#fbbf24, Pending:#60a5fa, Cancelled:#a1a8b5
Status Color DisplaystatusColorDisplay✓✓✓StringDate: calendar; Date Time: both; Booking: bothWhere status colors are rendered. For the Dates component, only 'calendar' is available: date cells on the calendar are colored by their status.
Hide Records With StatusAlso shown as Hide Bookings With StatushideBookingsWithStatus✓✓✓StringblankComma-separated list of status values whose records are hidden from the calendar. Hidden records are excluded from visual rendering. Records remain in Salesforce. Requires Status Field. Example: Cancelled, Rejected
Selectable Statuses (Status Picker)selectableStatuses✓✓✓StringblankComma-separated status values the booking status picker may set. Leave blank to allow all (back-office). e.g. 'Scheduled' for a customer site. When exactly one status is selectable it is auto-selected and the picker is hidden. Requires Status Field.
Second Picklist FieldsecondStatusField✓✓✓StringblankOptional second picklist field API name the user picks on save (e.g. Reason__c). Not color-coded: statusField owns calendar colors. Add it to Hover Popover Fields to show it. Works in Flow, App Builder, and Communities.
Second Picklist LabelsecondStatusFieldLabel✓✓✓StringblankOptional display label for the second picklist dropdown. If blank, the component humanizes the field API name.
Selectable Second-Picklist ValuesselectableSecondStatuses✓✓✓StringblankOptional comma-separated whitelist of values the user may pick for the second picklist. Leave blank to allow all. When exactly one is listed it is auto-selected and the picker is hidden.
Status Field LabelstatusFieldLabel✓✓✓StringblankOptional display label for the status dropdown shown to end users. Do NOT enter a field API name here: this is a display label only. If blank, the component auto-humanizes the Status Field API name.
Hover Popover FieldshoverFields✓✓✓StringblankComma-separated list of field API names to display when hovering over a calendar date that has existing records. Fields are queried from the Child Object. Supports relationship fields. Only shows data when existing records are loaded (via Load Existing Dates). Example: Name, Status__c, Notes__c. Leave blank to disable hover popovers.
Enable Edit ModeenableEditMode✓✓✓BooleantrueWhen ON, users can click existing dates to edit the date value or status, or delete the record. Requires Status Field AND Status Colors to be configured.
Edit Button LabeleditButtonLabel✓✓✓StringblankCustom label for the Edit Mode toggle button. Defaults to 'Edit Dates' if left blank.
Edit Record DisplayeditRecordDisplay✓✓✓StringblankComma-separated keywords controlling which fields show in the edit mode record list and in what order. Keywords: name, status, time, date, resource. Default when blank: name, status, time. Example: name, date, status
Time slots
Time Display ModetimeDisplayMode✓StringgridHow time is presented. Valid values: grid, dropdown. Default: grid. grid = visual slot grid where users click or drag to select time blocks. dropdown = lightning-input time pickers. Use Allow Different Times Per Date to control shared vs. per-date pickers in dropdown mode. In Flow this renders as free text, so type one of these exact values.
Time Interval (Minutes)Also shown as Time Slot Interval (Minutes)timeInterval✓✓Integer30Minutes between time slots. Any whole number works; 15, 30 or 60 minutes are typical. Example: 30 shows 9:00, 9:30, 10:00.
Earliest TimeminTime✓String09:00Earliest time shown in the time selector. Use 24-hour format (HH:mm). Examples: 08:00 = 8:00 AM, 13:00 = 1:00 PM. Leave blank to start at 12:00 AM.
Latest TimemaxTime✓String18:00Latest time shown in the time selector. Use 24-hour format (HH:mm). Examples: 17:00 = 5:00 PM, 20:00 = 8:00 PM. Leave blank to end at 11:30 PM.
Start Time FieldAlso shown as Start Time Field API NamestartTimeField✓StringblankAPI name of a Time field on the child object for the slot start time. Example: Start_Time__c
End Time FieldAlso shown as End Time Field API NameendTimeField✓StringblankAPI name of a Time field on the child object for the slot end time. Example: End_Time__c
Allow Different Times Per DateallowDifferentTimes✓✓BooleanfalseWhen ON and Time Display Mode is 'dropdown', each date gets its own time picker (grouped by week). When OFF, all dates share one time. Has no effect when Time Display Mode is 'grid'.
Enable End TimeenableEndTime✓BooleantrueWhen ON, shows a separate End Time dropdown alongside Start Time. Outputs both startTime and endTime in the JSON output. Only applies in dropdown mode (Time Display Mode = 'dropdown'). Has no effect in grid mode.
Group Time Slots by PeriodgroupTimeSlotsByPeriod✓✓BooleanfalseWhen ON, time slots are grouped into Morning, Afternoon, and Evening sections. When OFF (default), shows a flat grid. Only applies when Time Display Mode is 'grid'.
Time Grid OnlytimeGridOnly✓✓BooleanfalseWhen ON, hides the calendar entirely and shows ONLY the time-slot grid for one implied date. The user picks time slots; records save to the host record via Click to Save (no date-picking step). The implied date comes from Time Grid Date, else Time Grid Date Field, else today.
Time Grid DatetimeGridDate✓✓StringblankOptional explicit ISO date (YYYY-MM-DD) for the implied date when Time Grid Only is ON. Highest priority. Leave blank to read from Time Grid Date Field or fall back to today.
Time Grid Date FieldtimeGridDateField✓✓StringblankOptional API name of a Date field on the host record to read the implied date from when Time Grid Only is ON (record-page context). Used only when Time Grid Date is blank. Example: Appointment_Date__c
Disable Time Slot Grid (Full-Day Mode)disableTimeSlotGrid✓BooleanfalseWhen ON, hides the time slot grid for full-day booking scenarios where only the date matters. When OFF (default), shows the time slot grid for granular time-based booking.
Resources and capacity
Resource Object API NameresourceObjectApiName✓StringblankAPI name of the object storing your bookable resources. Each record = one bookable resource shown in the dropdown. Example: Room__c, Equipment__c, Vehicle__c, Staff__c
Resource Name FieldresourceNameField✓StringNameAPI name of the field containing the resource's display name. Usually 'Name'.
Resource Filter Field (optional)resourceFilterField✓StringblankAPI name of a field on the resource object used to limit which resources appear in the picker. Pair with Resource Filter Value. Use ';' to combine multiple fields (AND). Examples: 'Active__c' (one boolean field), 'Type__c' (one picklist), 'Type__c;Building__c' (TWO fields combined with AND). Leave blank to show every resource.
Resource Filter Value (optional)resourceFilterValue✓StringblankValue(s) the filter field must equal. ',' between values within ONE field = OR (IN clause). ';' between values = AND across multiple fields (must match the field count in Resource Filter Field). Examples: 'true': Active=true. 'Conference Room': Type=Conference Room. 'North,South': Building IN North or South. 'Conference Room;North': Type=Conference Room AND Building=North. 'Conference Room;North,South': Type=Conference Room AND Building IN North or South.
Business Hours Start FieldbusinessHoursStartField✓StringblankAPI name of the Time field on the resource object defining when it becomes available each day. Example: Business_Hours_Start__c (set to 08:00:00.000Z for 8:00 AM). Leave blank to use time slots for the full configured interval.
Business Hours End FieldbusinessHoursEndField✓StringblankAPI name of the Time field on the resource object defining the last available time each day. Example: Business_Hours_End__c (set to 18:00:00.000Z for 6:00 PM).
Allow Multiple ResourcesAlso shown as Allow Booking Multiple ResourcesallowMultipleResources✓BooleanfalseWhen ON, users can select multiple resources with checkboxes and book all of them simultaneously. The time grid shows only slots available for ALL selected resources. Example: Book a room AND a projector at the same time.
Allow No ResourceAlso shown as Allow Save Without Picking a ResourceallowNoResource✓BooleanfalseWhen ON, users can Save without picking any resource: the saved record's resource lookup is left null. Intended for closure or blackout writers where a blank resource means 'applies to everyone.' Downstream calendars that read closures with a per-resource filter (blockedDatesResourceField) treat a null resource as region-wide, so paired with allowNoResource it delivers the 'optional advisor scoping' pattern. Leave OFF (default) for normal booking scenarios where a resource must always be chosen.
Booking Object API NameresourceBookingObject✓StringblankAPI name of the object where booking records are created. One record per date per resource. Example: Room_Booking__c, Equipment_Reservation__c
Booking Date FieldbookingDateField✓StringblankAPI name of the Date field on the booking object. Must be a Date type (not DateTime). Example: Booking_Date__c
Booking Resource FieldbookingResourceField✓StringblankAPI name of the lookup field on the booking object that points to the resource. Example: Room__c (lookup from Room_Booking__c to Room__c)
Booking Start Time FieldbookingStartTimeField✓StringblankAPI name of the Time field on the booking object for the start time. Example: Start_Time__c. Leave blank for date-level bookings without time slots.
Booking End Time FieldbookingEndTimeField✓StringblankAPI name of the Time field on the booking object for the end time. Example: End_Time__c. The system calculates end time based on selected slots.
Book Button LabelresourceBookButtonLabel✓StringBookText on the button that confirms the booking. Example: 'Book Now', 'Reserve', 'Confirm Booking'
Capacity FieldcapacityField✓StringblankAPI name of a Number field on the resource object defining the maximum concurrent bookings per time slot. When set, slots display an X/Y badge and stay available until full. Ideal for training rooms, hot desks, or class registrations. Leave blank for one-booking-per-slot behavior. Example: Capacity__c
Capacity Aggregation (multi-resource)capacityAggregation✓StringCombinedCAPACITY BOOKING MODE ONLY (requires Capacity Field). Controls how X/Y capacity is calculated when multiple resources are selected. COMBINED (default) sums bookings AND capacities: best when each resource is independent inventory (e.g. 4 records across 4 rooms with capacity 5 each = 4/20). DISTINCT counts unique events (records sharing the same date + start time + end time 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).
Show Availability CountshowAvailabilityCount✓BooleantrueWhen ON, shows availability details in the resource panel (e.g. '3/5 days available'). Helps users choose the best resource before booking. Requires Resource Object API Name to be configured.
Conflicts
Conflict BehaviorconflictBehavior✓✓StringblockControls what happens when selected dates have time conflicts with existing records. 'block' (default): save is blocked and conflicting dates are highlighted. 'skip': save proceeds but conflicting dates are skipped. 'allow': no conflict checking. Only applies in grid-shared mode (Time Display Mode='grid' + Allow Different Times Per Date=OFF).
Conflict Look-Ahead DaysconflictLookAheadDays✓✓Integer360Number of days ahead to check for time slot conflicts and load availability. Default: 360. Reduce for better performance on high-volume objects.
Sub-blocks
Consolidate Time SpanconsolidateTimeSpan✓✓BooleanfalseWhen ON, selected time slots output as a single span from first slot start to last slot end. Gaps between selected slots auto-turn orange and are tracked as sub-blocks. Use for scheduling scenarios where you need a full shift span (e.g. 9 AM-5 PM) while separately tracking breaks. Only applies in grid mode.
Sub-Block Button LabelsubBlockModeButtonLabel✓✓StringblankWhen set, adds a toggle button letting users manually mark slots as sub-blocks (orange). Useful for sub-blocks at the edge of the work span. Leave blank to use auto-orange only. Example: 'Mark as Break', 'Mark as Lunch'. Requires Consolidate Time Span to be ON.
Show Sub-Block Toggle ButtonshowSubBlockButton✓✓BooleanfalseWhen ON, displays the sub-block toggle button in the time grid header. Requires Consolidate Time Span to be ON and Sub-Block Button Label to be set.
Sub-Block Object API NamesubBlockObjectApiName✓✓StringblankAPI name of the child object for sub-block records. Example: Work_Break__c. Requires Consolidate Time Span to be ON and Click to Save mode (Parent Record Id set).
Sub-Block Parent Lookup FieldsubBlockParentLookupField✓✓StringblankLookup field on the sub-block object linking to the parent record. Example: Shift__c. Required when Sub-Block Object is set.
Sub-Block Date FieldsubBlockDateField✓✓StringblankDate field on the sub-block object. Example: Break_Date__c. Required when Sub-Block Object is set.
Sub-Block Start Time FieldsubBlockStartTimeField✓✓StringblankStart Time field on the sub-block object. Example: Break_Start__c. Required when Sub-Block Object is set.
Sub-Block End Time FieldsubBlockEndTimeField✓✓StringblankEnd Time field on the sub-block object. Example: Break_End__c. Required when Sub-Block Object is set.
Sub-Block Name FieldsubBlockNameField✓✓StringblankText field on the sub-block object to store a label. Example: Break_Name__c. Required when Sub-Block Object is set.
Blocked dates
Blocked Dates ObjectblockedDatesSourceObject✓✓✓StringblankAPI name of an object to query for dates that should be blocked from selection. Example: Public_Holiday__c
Blocked Dates Date FieldblockedDatesDateField✓✓✓StringblankAPI name of the Date field on the blocked dates object. Requires Blocked Dates Object to be set.
Blocked Dates Start Time FieldblockedDatesStartTimeField✓✓✓StringblankOptional: Time field on the blocked object marking the START of a partial-day closure. When both Start and End Time fields are set and a blocked record carries both, only that time range is closed on the date (the rest stays bookable). Leave blank for whole-day blocking.
Blocked Dates End Time FieldblockedDatesEndTimeField✓✓✓StringblankOptional: Time field on the blocked object marking the END of a partial-day closure. Pairs with Blocked Dates Start Time Field.
Blocked Dates Resource FieldblockedDatesResourceField✓✓✓StringblankOptional: narrows an existing closure to one resource. Give the API name of a lookup/resource field on the blocked object; when a blocked record's resource matches the calendar's selected resource, only that resource is closed for the time range. Leave it blank and each closure applies to ALL resources (region-wide). Blocking itself is switched on by Blocked Dates Source Object, not by this field. Only meaningful with resource booking.
Blocked Dates Filter FieldblockedDatesFilterField✓✓✓StringblankOptional: filter field on the blocked object. Two modes: (a) value mode: when Blocked Dates Filter Value is set, scopes blocked records by <field> = <value> (e.g. Status__c = Cancelled). (b) parent-scope mode: when Filter Value is blank, treats this field as a lookup to the current record and scopes by <field> = recordId. Leave blank to block globally.
Blocked Dates Filter ValueblockedDatesFilterValue✓✓✓StringblankOptional: value to filter Blocked Dates Filter Field by. When set, blocked records must match <filterField> = <filterValue> (e.g. Status__c = Cancelled). Lets multiple categories of blockers coexist in the same table: each consumer calendar picks which category applies.
Flow outputs
Output Date Ranges as JSONoutputAsJson✓✓BooleanfalseWhen ON, populates the Date Ranges JSON output with consecutive dates grouped into ranges. Required if you want to use the MultiDatePickParser action to loop through ranges.
Selected Dates (Output)selectedDates✓✓String[]blankOUTPUT: Array of all selected dates in ISO format (YYYY-MM-DD). Use this in your Flow to create records or pass to the next screen.
Date Ranges JSON (Output)selectedDateRangesJson✓✓StringblankOUTPUT: JSON of consecutive dates grouped into ranges. Only populated when 'Output Date Ranges as JSON' is ON. Pass to MultiDatePickParser to loop in Flow.
Dates With Times JSON (Output)selectedDatesWithTimesJson✓StringblankOUTPUT: JSON string with each date and its selected time. Pass to MultiDatePickParser to loop through in your Flow.
Sub-Blocks JSON (Output)subBlocksJson✓StringblankOUTPUT: JSON of sub-block (gap/break) windows per date. Only populated when Consolidate Time Span is ON. Use in a Flow loop to create child records.
Successful Bookings Count (Output)bookingSuccessCount✓IntegerblankOUTPUT: Number of booking records successfully created. Use in your Flow to show a confirmation message.
Conflict Dates (Output)bookingConflictDates✓String[]blankOUTPUT: List of dates where bookings could not be created due to conflicts with existing reservations.

16. Security & accessibility

  • Passed the Salesforce AppExchange Security Review.
  • 100% native. Your data stays in your Salesforce org. No external servers, no callouts. See Trust & Security.
  • Your permissions, always. Every read and save runs in the user's own access, so object permissions, field-level security and sharing are enforced on each record.
  • Accessible. WCAG 2.1 AA, tested with axe-core. Full VPAT 2.5.
  • 9 languages: English, Spanish, French, German, Japanese, Hindi, Portuguese (Brazil), Italian, Chinese (Simplified).

17. Questions or bugs?

Found a gap in this guide, or something broken? Email support@multidatepick.com.

Ready to see it in your org?

$20 per user per month, every feature included, 30-day free trial. Coming soon to the Salesforce AppExchange.