Service Catalogs and Locked Booking
Load the services in a customer flow, build custom catalog and detail pages, and embed booking with one service selected
Service Catalogs and Locked Booking
Use the DOM Package to load the services connected to a customer flow without rendering the complete customer-flow interface. Your application can build its own catalog and service-detail pages, then embed only the booking journey for the selected service.
Service catalogs and locked service booking require @tiquo/dom-package
1.6.3 or newer.
Customer flow ID
The methods on this page use the customer flow's booking configuration ID. It is the ID in the flow's booking or embed URL.
For example, if the embed URL is:
https://book.tiquo.app/embed/CUSTOMER_FLOW_IDpass CUSTOMER_FLOW_ID as bookingConfigId.
The customer flow must belong to the same organization as the Website SDK public key used to initialize the package. The current website domain must also be enabled under Settings > Website SDK.
Load a service catalog
Call getFlowServices() to load the active services connected to a customer
flow:
const catalog = await tiquo.getFlowServices('CUSTOMER_FLOW_ID');
for (const service of catalog.services) {
console.log(service.id);
console.log(service.name);
console.log(service.image);
console.log(service.effectivePrice);
}Public services can be loaded without signing in. When the DOM Package has an authenticated customer session, the catalog also includes membership-gated services that the customer is allowed to book. Services that are inactive, outside their visibility window, or unavailable to the current customer are not returned.
The catalog response contains:
| Field | Description |
|---|---|
bookingConfigId | Customer flow ID supplied to getFlowServices() |
flow | Public flow information: id, name, and optional description |
services | Services available to the current visitor |
categories | Flow categories and the service IDs assigned to each category |
catalogSections | Configured catalog sections with category and service IDs |
currency | Flow location currency, when configured |
Each category contains id, name, optional description, optional image,
serviceIds, and optional presetSection. Each catalog section contains id,
name, categoryIds, and serviceIds.
Service fields
Each item in catalog.services uses the TiquoFlowService type:
| Field | Description |
|---|---|
id | Service ID used by getFlowService() and embedServiceBooking() |
name | Service name |
slug | Optional service slug |
description | Full service description |
shortDescription | Optional short description |
tags | Service tags |
image | Featured image, or the first service image |
images | All configured service images |
price | Base service price |
effectivePrice | Current effective price after applicable flow pricing |
currency | Currency code, when configured |
priceType | Service price type |
serviceType | Service type |
duration | Configured service duration |
durationType | Duration unit or booking type |
capacity | Configured service capacity |
isFeatured | Whether the service is featured |
paymentType | Configured payment type |
depositRequired | Whether the service requires a deposit |
depositAmount | Configured deposit amount |
depositType | Configured deposit type |
minAdvanceBooking | Minimum advance-booking rule |
maxAdvanceBooking | Maximum advance-booking rule |
checkInTime | Check-in time, when configured |
checkOutTime | Check-out time, when configured |
minStay | Minimum stay, when configured |
maxStay | Maximum stay, when configured |
categoryIds | IDs of the flow categories containing the service |
Load one service
Use getFlowService() on a detail page:
const service = await tiquo.getFlowService(
'CUSTOMER_FLOW_ID',
'SERVICE_ID'
);
if (!service) {
// The service does not exist in this flow or is unavailable to this visitor.
}The method returns null when the service is not in the flow catalog visible
to the current visitor. It does not fall back to a different service.
Embed booking for the selected service
After rendering your custom service content, call embedServiceBooking():
<div id="service-booking"></div>await tiquo.embedServiceBooking(
'CUSTOMER_FLOW_ID',
service.id,
'#service-booking',
{
width: '100%',
minHeight: '240px',
autoResize: true,
}
);The embed:
- Preselects the exact service before the flow renders
- Removes the category and service-catalog navigation
- Prevents the customer from returning to select another service
- Keeps the flow's normal date, quantity, availability, payment, and booking steps
- Reuses the DOM Package's secure authenticated iframe handoff
- Automatically resizes unless
autoResizeis set tofalse
If the service ID is missing, invalid, or unavailable to the current customer, the embedded flow does not fall back to the full service catalog.
Custom catalog and detail page pattern
A typical integration uses two application routes:
- The catalog route calls
getFlowServices()and renders a card or block for each service. - Each card links to a custom detail route with the service ID in the route or query string.
- The detail route calls
getFlowService()and renders the service's image, description, price, and other fields. - The detail route calls
embedServiceBooking()inside the booking section.
This keeps discovery and page design fully controlled by your application while Tiquo handles the final availability and booking journey.