Bookings
Sell bookable services in free time slots — set a booking's length and how many can book the same slot, book from the console, and read slots from the API in your app.
Bookings
A bookable service is a product the customer books for a time instead of having it delivered: a haircut, a cleaning visit, a repair. Storefront cuts the service's hours into slots of the booking's length and keeps count of how many places each slot has left, so two customers can't book the same provider at once.
Deposits are not supported yet. The service settings deposit_percent and travel_fee are reported by the slots API, but nothing charges them: a booking is paid like any other order, and a booking at the customer's address is charged the store's delivery fee as its travel fee.
Setting up a bookable service
Open the product in Storefront → Products and turn on This is a service and This service is bookable (is_service, is_bookable). See Products.
In the Booking section, set the Length of a booking (minutes) — 60 by default, at least 5 — and Bookings at the same time, the number of customers who can book the same slot (for example the number of providers) — 1 by default.
Optionally give the product its own hours in the Availability panel. Without them, the service follows the hours of the store's first location.
Save the product.
The booking settings are stored on the product as meta.service.duration_minutes and meta.service.capacity.
How slots are made
For a given day, Storefront takes the service's opening windows for that weekday — the product's own hours, or else the hours of the store's first location — and cuts each window into back-to-back slots of the booking's length. A window of 09:00–12:00 with 60-minute bookings gives slots at 09:00, 10:00 and 11:00; a slot that wouldn't end before the window closes is left out.
- Times are in the store's time zone (else the organization's, else the server's), and the console and the app show them on the store's clock, whatever the timezone of the browser or phone (see the store's clock).
- Each booked unit takes one place in the slot it starts in: an order line booking the service with quantity 2 takes two places.
- Bookings on canceled, expired or failed orders don't take a place.
- A slot is available when it has places left and hasn't started yet.
Booking from the console
Click New booking in Storefront → Orders (next to New order). The form puts services first:
- Customer, then Services and products: the bookable service, plus any products the provider brings along to the job. Each line shows whether it's a Service or a Product.
- When and where: a week of days, each with its places left, Full or Closed, and the chosen day's start times in the store's time zone. The length shown (1 h job) is the service's Length of a booking; change it on the product. Then At the customer's address (the provider goes out; the service address shows its distance from the store) or At the store (the customer comes in), and Access and job notes.
- Provider: Any available, or pick a driver. Providers are drivers: the chosen driver is assigned to the booking once it's placed.
- Payment: Cash after the job or Paid now. A booking at the customer's address adds the store's delivery fee as the travel fee, priced by distance like any delivery (see Service Quotes).
A booking can't be placed without a service and a time. The button says what it books, for example Book Wed 10:00 · S$149.90.
Bookings in the order panel
A booking's order panel shows the booked time under the next step, for example Thu 15 Oct, 10:00 to 11:00 · starts in 1 day · Ken Driver, and its own steps: Booked, Confirmed, On the way, In progress, Done. On the way is left out for bookings at the store, and Done shows when the booking ends. The driver is labelled Provider, the drop-off Service address, and products the provider brings are listed under Bring to the job (or Hand over at the store).
The booked slot is kept in meta.booking (start, end, duration_minutes) and meta.booking_at; each service line keeps its time in meta.scheduled_at. A booking does not use the order's scheduled_at, so Fleet-Ops does not dispatch it on its own.
Rescheduling
Click Reschedule in the order panel (until the job is in progress). The dialog shows the booked time, the service's week of free times — the booking's own time counts as free — and who to tell:
- Tell customer what changed sends the
order_updatednotification: Your booking with Lion City Cleaning was moved — Deep Clean is now Mon 19 Oct, 11:00 to 12:00, in the store's time. - Tell provider (when one is assigned) pushes the change to the driver's app.
The booking can also be moved from the edit form, whose When section shows the same free times. Either way the move goes through the order edit (scheduled_at), which checks the time is still free for the service — That time is not free for Deep Clean otherwise — and moves meta.booking, meta.booking_at and the service lines' scheduled_at together.
Slots in your app
GET /storefront/v1/products/{id}/slots?date=2026-10-14
Authorization: Bearer store_your_store_key{
"date": "2026-10-14",
"service": { "duration_minutes": 60, "capacity": 2, "deposit_percent": 0, "travel_fee": 0, "provider_tag": null },
"slots": [
{ "start": "2026-10-14T09:00:00+08:00", "end": "2026-10-14T10:00:00+08:00", "time": "09:00", "past": false, "available": true, "remaining": 1, "providers": 1, "capacity": 2 },
{ "start": "2026-10-14T10:00:00+08:00", "end": "2026-10-14T11:00:00+08:00", "time": "10:00", "past": false, "available": false, "remaining": 0, "providers": 0, "capacity": 2 }
]
}dateis required, asYYYY-MM-DD. Products that aren't bookable services return404.timeis the slot's start in the store's local time;remaining(also reported asproviders) is the number of places left.
To book, add the service to the cart with the slot's start as the item's scheduled_at (see Cart), then check out as usual. If the slot filled up in the meantime, checkout initialization fails:
{
"errors": ["The time you picked for Haircut was just booked. Please pick another time."],
"code": "booking_slot_unavailable"
}with status 422. Ask the customer to pick another time. Only slots made from the service's hours are checked; a time outside them is left to the store.