Coming Soon to AppExchange - 2026

Self-Service Booking on a Salesforce Experience Cloud Site

Put the calendar on a public or member-only site and let customers, candidates, students, or staff book their own dates. The records land in your org immediately, and nothing is stored anywhere else.

Notify Me at Launch See the Salesforce Calendar

The usual way to add self-service booking to Salesforce is to bolt on an external scheduling service, then spend the next three months syncing it and explaining it to your security reviewer. MultiDatePick is a Lightning Web Component, so it drops into Experience Builder like any other component and writes to the objects you already own.

"Can they just pick their own dates instead of emailing us?"

Five things people self-book

Appointments

Customers pick a date and time from the slots you make available, filtered by whichever resource they are booking with.

Their own availability

Candidates, contractors, and volunteers click the days they can work, and you get one record per date.

Shared spaces

Members book rooms, desks, courts, or equipment against live capacity, without a Salesforce license each.

Sessions and cohorts

Students or attendees enroll in dated sessions, with the slot closing once it reaches capacity.

Salesforce Experience Cloud site showing a self-service booking calendar with available time slots
The same component on an Experience Cloud site, booking against live availability.

What changes

Self-service scenario The usual approach With MultiDatePick
Let a customer book a slot External scheduler, synced back on a delay Native component writing to your object on save
Security review A second vendor, a second data processor No external host, nothing leaves the org
Show only genuinely free slots Depends on how fresh the sync is Reads your live records at page load
Everyone books the same parent record Custom development Static Record Id property, set in the builder
Cost as usage grows Per booking, or per seat, forever Site visitors are not licensed users
One setup detail worth knowing up front. App Pages, Home Pages, and Experience Sites have no automatic record context, so the component needs a Static Record Id (or a parent record field) to know what it is booking against. It is one property in the builder, and it is covered in App, Home & Experience Pages.

Guest users, honestly

Public guest access works, and there are two Salesforce platform rules to plan around rather than fight. Guests can read and create records but never edit or delete them, which is a Salesforce licensing limit that applies to every app on the platform, not something this one imposes. Plan guest-facing pages as create-only. And guest-created records need a default owner set on the site, or the insert fails. Both are one-time setup steps, and both are covered in the user guide.

The configuration, in full

Experience Cloud placement is the same component with one extra property, because a public page has no record context to inherit.

Experience Builder — public booking page
staticRecordIdthe property that makes this work. App Pages, Home Pages and Experience Sites have no automatic recordId, so you name the parent record everyone books against
relatedObjectApiNameBooking__c
relationshipFieldApiNamethe lookup back to that parent
dateFieldApiNameBooking_Date__c
resourceObjectApiNamewhatever visitors choose between: an advisor, a room, a piece of equipment
capacityFieldso a session with twenty seats closes at twenty rather than at one
businessHoursStartField
businessHoursEndField
on the resource, so you publish only the hours you actually offer
conflictBehaviorblock — on a public page a clash must never save
enableEditModefalse for guests. Guest users cannot edit or delete records anyway, so leaving it on promises something the platform will not deliver
preloadExistingDatestrue with preloadMode = readonly if you want visitors to see what is already taken without touching it
If everyone should not share one parent record, drive the page from a Screen Flow instead and pass recordId, or use parentRecordIdField to resolve the parent from a lookup on the running user's record.
Two org-level settings, not component properties
Default record ownerExperience Workspaces → Administration → Preferences → Record Ownership. Guests cannot own records, so without this every insert fails with a transfer error
Guest sharing ruleguests need read access to the resource and parent records they reference, or the insert is rejected on the cross-reference
Both are one-time setup, and both fail in ways that look like a component bug rather than a permission gap. Covered in App, Home & Experience Pages.

Choose the view for the audience, not the org

A public site and an internal page usually want different layouts of the same data, and because the view is a property on the component rather than an org-wide setting you can give them exactly that from one install.

On a guest-facing page, calendar or week is what a visitor needs: pick a day, pick a time, submit. Keep availableViews short here. A switcher offering five layouts to a member of the public is noise, and two of them are read only.

For a status or "my bookings" page, agenda is the better answer. It is read only by construction, reads well on a phone, and with agendaFields you control exactly which fields a guest sees on each row.

Guest users are Read plus Create only, which is a Salesforce guest-licence limit rather than a setting. That makes the read-only views a natural fit for anything a guest should look at but not change, and it means an edit or cancel flow has to live behind authentication regardless of which view you pick.
Agenda list view of upcoming bookings on a public Experience Cloud site

Self-service booking, without a second vendor

Coming to the Salesforce AppExchange in 2026. Tell us where to send the launch note.

Try the Live Demo Notify Me at Launch See How It Works

100% Salesforce native. Your data and your configuration never leave your org.