Online shop
Bookings
Service products can be booked online. The customer picks a date, a time and optionally a team member; the slot is held while they pay and confirmed once the order is paid.
The merchant turns booking on per service in the dashboard (Online shop → Bookings) and sets its rules: duration, buffers, places per slot (1 = appointment, more = a class), start interval, minimum notice, how far ahead, the free cancellation window, full price or a deposit online, the location and who performs it. Opening hours can be set for the business, a location or one team member, with blocked time and extra openings on top.
Is a product bookable?
In the catalog, a bookable service has a
booking object:
{
"durationMinutes": 45,
"capacity": 1,
"paymentMode": "DEPOSIT",
"depositPercent": 30,
"cancelWindowHours": 24
}capacitynumberpaymentModeFULL | DEPOSITcancelWindowHoursnumberFind free slots
/shop/{slug}/products/{productId}/slots?from=2026-11-03&to=2026-11-09&staffId=&seats=1curl https://api.baxpay.com/v1/shop/maison-lumiere/products/8b21c7f0-…/slots{
"success": true,
"data": {
"timeZone": "Europe/Paris",
"today": "2026-11-02",
"from": "2026-11-02",
"to": "2026-11-15",
"service": { "durationMinutes": 60, "capacity": 1, "paymentMode": "FULL", "cancelWindowHours": 1 },
"staff": [],
"slots": [{ "startsAt": "2026-11-03T08:00:00.000Z", "endsAt": "2026-11-03T09:00:00.000Z", "seatsLeft": 1, "staffIds": [] }]
}
}from, toYYYY-MM-DDstaffIduuidseatsnumber{
"timeZone": "Europe/Paris",
"today": "2026-11-02",
"lastDate": "2026-12-31",
"from": "2026-11-03",
"to": "2026-11-09",
"service": { "durationMinutes": 45, "capacity": 1, "paymentMode": "DEPOSIT", "depositPercent": 30, "cancelWindowHours": 24 },
"staff": [{ "id": "…", "name": "Anna B." }],
"slots": [
{ "startsAt": "2026-11-03T08:00:00.000Z", "endsAt": "2026-11-03T08:45:00.000Z", "seatsLeft": 1, "staffIds": ["…"] }
]
}Slots are instants (UTC): show them in timeZone. Opening hours follow the wall clock, so 09:00
stays 09:00 across daylight-saving changes. Team members are shown by first name and initial.
A service that cannot be booked online answers 404.
Book at checkout
A bookable line carries the slot picked, in both the
quote and the
checkout. quantity is the number of places.
{
"productId": "…",
"quantity": 1,
"booking": { "startsAt": "2026-11-03T08:00:00.000Z", "teamMemberId": "…" }
}curl -X POST https://api.baxpay.com/v1/shop/maison-lumiere/checkout \
-H "Content-Type: application/json" \
-d "{
\"items\": [{ \"productId\": \"8b21c7f0-…\", \"quantity\": 1, \"booking\": { \"startsAt\": \"$SLOT_START\" } }],
\"customer\": { \"name\": \"Camille Martin\", \"email\": \"[email protected]\" },
\"locale\": \"fr\"
}"Leave out teamMemberId for "anyone". The line is priced at the full price or the deposit and
named after its time, so the receipt and e-invoice show exactly what was charged. Services never
need delivery: a cart of services only gets the NONE option.
At checkout the slot is held for about 17 minutes while the customer pays (the payment link
itself closes after 15). If someone else took the time meanwhile, the checkout fails with 409
and "reason": "SLOT_TAKEN", and the order is cancelled: ask the customer to pick another time.
Booking lifecycle
PENDING_PAYMENT
CONFIRMED
booking.ics calendar file, and a reminder 24 hours before.COMPLETED or NO_SHOW
A booking can be CANCELLED by the customer (inside the window), by the merchant (optionally
refunded), or by BaxPay when the payment is not completed in time. An order made only of
bookings follows them: cancelled when all are, completed when all are done.
The customer's booking page
Every confirmation email links to https://{shop}/booking/{token}. Your own front end can use the
same endpoints:
/shop/{slug}/bookings/{token}/shop/{slug}/bookings/{token}/icstext/calendar file/shop/{slug}/bookings/{token}/cancel/shop/{slug}/bookings/{token}/reschedulecurl https://api.baxpay.com/v1/shop/maison-lumiere/orders/kW3c…curl https://api.baxpay.com/v1/shop/maison-lumiere/bookings/Q14uj_pG…{
"success": true,
"data": {
"serviceName": "…",
"status": "PENDING_PAYMENT",
"startsAt": "2026-11-03T08:00:00.000Z",
"timeZone": "Europe/Paris",
"seats": 1,
"canChange": false,
"canReschedule": false,
"order": { "number": 1001 }
}
}curl https://api.baxpay.com/v1/shop/maison-lumiere/bookings/Q14uj_pG…/ics -o booking.ics && head -3 booking.icsThe booking returns serviceName, startsAt, endsAt, timeZone, staffName, seats,
status, location, paidMinor, balanceDueMinor (still to pay on site), refundedMinor,
changeDeadline, and canChange / canReschedule. Booking tokens are found in the order's
bookings[].token (order page).
Cancel refunds what the booking cost online, through the order's payment. Reschedule takes
a free slot from …/slots:
curl -X POST https://api.baxpay.com/v1/shop/maison-lumiere/bookings/Q14uj_pG…/reschedule \
-H "Content-Type: application/json" \
-d '{ "startsAt": "2026-11-04T09:00:00.000Z" }'Both need a paid booking (canChange: true) and only work until changeDeadline; otherwise they
answer 400 and the customer should contact the shop. They are limited to 10 requests a minute. The customer is emailed the new time,
or the cancellation with the refund amount.
What the merchant sees
New, moved and cancelled bookings arrive in the Business dashboard calendar and as push notifications in the Business app. The merchant can mark bookings completed or no-show, move them, cancel them with a refund, add bookings taken by phone, and block time. Online shop sales paid by bookings are labelled Booking in payments and analytics (see Online shop).
Related
- Storefront API — catalog, quote, checkout
- Online shop — orders, domains, roles
- Products & catalog — creating service products