Tiquo
Integrations OverviewAirtableAsanaSlackGoogle AnalyticsMetabaseMixpanelPendoSegmentTableau (PAT)ActiveCampaignBrevoEmarsys Core API (WSSE)EventbriteFacebookGoogle AdsHighLevelInstagramKlaviyoMailchimpMailgunMicrosoft AdsSendGridTwitter (v2)HubSpotNotionAcuity SchedulingAirtable (Personal Access Token)BasecampCal.com (v2)CalendlyClickUpCodaConfluence Data CenterExpensifyGoogle CalendarGoogle SheetHarvestLinearMicrosoft Power BIMicrosoft TeamsMindbodyMondayOpenAIPerplexityPingboardPivotal TrackerProductboardQuickbaseServiceM8ServiceNowTeamworkTickTickTimelyTodoistTrafftTrelloWrikefal.aixAIZendeskIntercomAircall (OAuth)DixaFreshDeskFreshserviceFrontPlainRingCentralZoho DeskBrazeDialpadGoogleMicrosoftOutlookPodiumSednaSharePoint OnlineTwilioWhatsApp BusinessZoho MailBambooHRADPDeelEmployment HeroGustoHibob Service UserNamelyOracle Fusion Cloud (HCM)PaychexPayfitPaylocityPersonioRipplingSAP SuccessFactorsSage HRTSheetsUKG ProUKG ReadyWorkdayZoho PeopleQuickBooksBuildiumExact OnlineFreshBooksIntuitNetSuitePennylaneSageSage IntacctTwinfieldUnanetWave AccountingXeroZoho BooksSalesforceAffinityAttioCopperFreshsalesGainsight CCInsightlyKustomerMedalliaPipedriveTwenty CRMZoomInfoApaleoMewsMicrosoft Business CentralOdooSAP ConcurZuoraAcceloCoupa CompassZoho InvoiceAnrokAvalaraDocuSignDropbox SignPandadocSignNowLinkedInSplitwiseTikTok AdsJotformQualtricsRefinerTypeformShopifyCin7 CoreGoogle MapsRingoverListrakRydooTalentLMSApple Business ManagerCrunchbaseRocketReachOcean.ioFreepikEnergy Performance Certificates (Gov.UK)JustworksGristSAP S/4HANA Cloud3CX8x8Adobe CommerceBirdCloudbedsConstant ContactBufferCustomer.ioCrispFreeAgentGreenhouseMeta Marketing APIMollienocrm.ioOomnitzaDigitsPylonSage 200ShopwareAnvilShippoEasyPostAltrataMicrosoft PeopleMicrosoft IntuneCloudTalkGoogle FormsMaximizerMicrosoft PlannerSalesmsgSellercloudTallyTimifyUpsalesCleverReachHeymarketMailjetPleoProvenExpertTelegramToggl TrackTenzoASSA ABLOY Vingcard VisionlineASSA ABLOY Vingcard VostioASSA ABLOY TESA HotelASSA ABLOY SMARTairSalto KSSalto Space OnlineDormakabaOmnitecHotekTT LockWebLockISEOKleverKeyAperioISONASHIDSouthcoThird MillenniumSTidAxis CommunicationsBooking.comExpediaHotels.comAirbnbGoogle HotelsTripadvisorAgodaHotelbedsTravelgateXHyperguestRoibosReconlineTraviaOpenGDS.comMG BedbankDidatravelHotelREZHRSHotelnetworkGetaroomWinkBookeasyVRBOInntopiaHookusbookusHipcampSpot2niteCamping VisionMinistry of VillasTrip.comTravelokaTiketMakeMyTripHoteripKlookeDreamsSzallasEmerging Travel GroupCheck24Bed-and-Breakfast.itWorld2Meet (W2M)Ctoutvert / SecureholidayDespegarPriceTravelRoombeastMitchell CorpHRS AustraliaResonlineHostelworldHostelhopTablet MichelinMr & Mrs SmithHopperHotel TonightPitchupMoveriiLocalOTAAlaricBooknpayCultbookingGuestTractionLevartWeSpeakMake.comZapierPricelabsPricepointRategenieElastic HotelRoom Price GenieTurbosuiteUber EatsDeliverooDoorDashBolt FoodGlovo
API and AuthenticationDOM Package

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 booking require @tiquo/dom-package 1.6.3 or newer. Use 1.6.6 or newer for the complete typed field set documented on this page, including explicit service/category images, names, and descriptions.

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_ID

pass 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.serviceImage);
  console.log(service.categoryImage);
  console.log(service.categoryName);
  console.log(service.categoryNames);
  console.log(service.categoryDescription);
  console.log(service.categoryDescriptions);
  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.

Membership eligibility and service price are separate. A free or paid membership can grant permission to see or book a service, but the service remains paid unless a discount, store credit, or another pricing rule changes its effective price.

The catalog response contains:

FieldDescription
bookingConfigIdCustomer flow ID supplied to getFlowServices()
flowPublic flow information: id, name, and optional description
servicesServices available to the current visitor
categoriesFlow categories and the service IDs assigned to each category
catalogSectionsConfigured catalog sections with category and service IDs
currencyFlow 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:

FieldDescription
idService ID used by getFlowService() and embedServiceBooking()
nameService name
slugOptional service slug
descriptionFull service description
shortDescriptionOptional short description
tagsService tags
imagePreferred display image: the service image, then the first associated category image
featuredImageFeatured service image, with the first service image as fallback
serviceImageFeatured service image, with the first service image as fallback
imagesAll images configured directly on the service
categoryImageFirst image from a flow category containing the service
categoryImagesImages from all flow categories containing the service
categoryNameName of the first flow category containing the service
categoryNamesNames of all flow categories containing the service
categoryDescriptionFirst configured description from a flow category containing the service
categoryDescriptionsConfigured descriptions from all flow categories containing the service
priceBase service price
effectivePriceCurrent effective price after applicable flow pricing
currencyCurrency code, when configured
priceTypeService price type
serviceTypeService type
durationConfigured service duration
durationTypeDuration unit or booking type
capacityConfigured service capacity
isFeaturedWhether the service is featured
paymentTypeConfigured payment type
depositRequiredWhether the service requires a deposit
depositAmountConfigured deposit amount
depositTypeConfigured deposit type
minAdvanceBookingMinimum advance-booking rule
maxAdvanceBookingMaximum advance-booking rule
checkInTimeCheck-in time, when configured
checkOutTimeCheck-out time, when configured
minStayMinimum stay, when configured
maxStayMaximum stay, when configured
categoryIdsIDs of the flow categories containing the service

Use image for a ready-to-display image with automatic category fallback. Use serviceImage or categoryImage when the UI needs to distinguish where the image was configured. images remains service-only, while categoryImages contains the category image URLs. categoryName is the first associated flow category, while categoryNames contains every associated category name. categoryDescription is the first configured description from an associated category, while categoryDescriptions contains all configured associated category descriptions.

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 autoResize is set to false

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:

  1. The catalog route calls getFlowServices() and renders a card or block for each service.
  2. Each card links to a custom detail route with the service ID in the route or query string.
  3. The detail route calls getFlowService() and renders the service's image, description, price, and other fields.
  4. 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.

On this page