Data attributes and JavaScript API
Use HTML attributes or JavaScript methods to add Tiquo login, customer fields, service catalogs, bookings, and analytics events
Data attributes and JavaScript API
The Hosted Package works with plain HTML. This makes it compatible with website builders that let you add custom attributes to elements.
Passwordless login
Use one form and one submit button for the full passwordless flow. The first submit sends the OTP email. The second submit verifies the OTP and signs the customer in.
<form data-tiquo-form="passwordless-login">
<div data-tiquo-passwordless="step-1">
<input data-tiquo-member="email" type="email" name="email" placeholder="Email" required />
</div>
<div data-tiquo-passwordless="step-2">
<input data-tiquo-member="token" type="text" name="token" inputmode="numeric" placeholder="Code" required />
</div>
<p data-tiquo-message></p>
<button
data-tiquo-passwordless-button="Sign in"
data-tiquo-passwordless-send-loading="Sending..."
data-tiquo-passwordless-verify-loading="Signing in..."
>
Send code
</button>
</form>Passwordless login form
Hover the form, either step, a field, the message, or the submit button to see the attributes attached to it.
Sign in to Atlas House
We’ll email you a secure one-time code.
Step 1 · Email
Step 2 · One-time code
Sent to your emailYour code is ready to verify.
Both steps stay in the same form. Tiquo hides step 2 until the one-time code has been sent, then uses the same button to verify it.
When the form is submitted for the first time, Tiquo sends a one-time code to the email address. When the code field is filled and submitted, the customer is signed in.
The Hosted Package hides step-2 until the OTP has been sent, then hides step-1 if you use the optional data-tiquo-passwordless="step-1" wrapper. Inputs inside a hidden step are disabled automatically so browser form validation does not block submission.
Passwordless login and signup forms are automatically hidden after the customer is signed in. They become visible again after logout.
The email field must use data-tiquo-member="email" and the OTP field must use data-tiquo-member="token". In Webflow, make sure the hidden OTP field is not configured as an email input. Use a text input with numeric input mode for the OTP code.
Webflow setup checklist
- Put both steps inside the same Webflow form.
- Use one submit button for both steps.
- Add
data-tiquo-form="passwordless-login"to the form. - Wrap the email input in an element with
data-tiquo-passwordless="step-1". - Wrap the OTP input in an element with
data-tiquo-passwordless="step-2". - Set the email input to
type="email",name="email", anddata-tiquo-member="email". - Set the OTP input to
type="text",name="token", anddata-tiquo-member="token". - Do not use
type="email"orname="email"on the OTP input. - Add
data-tiquo-passwordless-button="Sign in"to the submit button if you want the button text to change after the OTP is sent. - Add
data-tiquo-passwordless-send-loading="Sending..."to show loading text while the OTP email is being sent. - Add
data-tiquo-passwordless-verify-loading="Signing in..."to show loading text while the OTP code is being verified. - Use
data-tiquo-passwordless-loading="Loading..."if both steps should use the same loading text. - Use
?v=1.1.18or newer in the Hosted Package script URL so Tiquo intercepts submit buttons, Enter key submits, and form submits before Webflow can show its default success message.
If Webflow switches to its default Thank you! Your submission has been received! success state, the form submit is being handled by Webflow instead of only by Tiquo. Use ?v=1.1.18 or newer and keep data-tiquo-form="passwordless-login" on the actual Webflow form element.
If Webflow shows An invalid form control with name='email' is not focusable, the hidden OTP field is usually misconfigured as an email field or the hidden step contains a required control that is not disabled. Use the script URL with ?v=1.1.18 or newer so hidden-step inputs are disabled automatically.
Show or hide content by auth state
<div data-tiquo-show="logged-in">
Visible to signed-in customers.
</div>
<div data-tiquo-show="logged-out">
Visible to visitors who are not signed in.
</div>Authentication-aware content
Inspect both visibility states and their optional display overrides.
Signed in
Your account
Signed out
Welcome to Atlas House
Tiquo restores the element's requested display mode only after the authentication state is known.
You can set these elements to display: none in Webflow to prevent a visible flash before the Hosted Package finishes checking the session. Tiquo will show the matching element again when it should be visible. If the element needs a specific display type, add data-tiquo-display="flex", data-tiquo-display="grid", or another CSS display value. Use ?v=1.1.18 or newer for this behaviour.
Log out button
Add data-tiquo-logout to a button or link to sign the customer out.
<button
data-tiquo-logout
data-tiquo-logout-loading="Logging out..."
>
Log out
</button>Logout controls
Inspect a signed-in wrapper, a logout button, and a logout link with every optional behaviour.
Alex Morgan
Signed in
Buttons and links use the same logout data attribute. Loading text and the post-logout redirect are optional.
Optional attributes:
data-tiquo-logout-loading="Logging out..."changes the button text while logout is running.data-tiquo-logout-redirect="/login"redirects after logout completes.
Use data-tiquo-show="logged-in" on the button or its wrapper if it should
only be visible to signed-in customers.
Wallet card links
Use data-tiquo-wallet-card to link a signed-in customer to an Apple Wallet or
Google Wallet card. The attribute value is the wallet card design name from the
dashboard.
<a
data-tiquo-wallet-card="member-card"
data-tiquo-wallet-type="apple"
>
Add to Apple Wallet
</a>
<a
data-tiquo-wallet-card="member-card"
data-tiquo-wallet-type="google"
>
Add to Google Wallet
</a>Wallet card links
Inspect Apple Wallet, Google Wallet, and general installation links, including their loading state.
Apple Wallet
Direct Apple install
Google Wallet
Direct Google install
Wallet pass
Choose an available wallet
Use one link per wallet-card design. Omitting the wallet type opens the general installation page.
Optional attributes:
data-tiquo-wallet-type="apple"links directly to the Apple Wallet install flow.data-tiquo-wallet-type="google"links directly to the Google Wallet install flow.- Omit
data-tiquo-wallet-typeto link to the general wallet card install page. data-tiquo-wallet-card-loading="Loading..."changes the text while the link is being resolved.
The design name must match the wallet card design name configured in the dashboard. If the account has multiple wallet card designs, use one link per design name.
Advanced sites can also call:
const links = await window.Tiquo.getWalletCardLinks({
designName: "member-card"
});
console.log(links.appleWalletUrl);
console.log(links.googleWalletUrl);Render customer fields
<span data-tiquo-customer="firstName"></span>
<span data-tiquo-customer="lastName"></span>
<span data-tiquo-customer="displayName"></span>
<span data-tiquo-customer="email"></span>
<span data-tiquo-customer="phone"></span>
<span data-tiquo-customer="createdAt"></span>
<span data-tiquo-customer="firstActiveAt"></span>The field path is read from the signed-in customer record. The Hosted Package can render these customer fields:
| Field | Description |
|---|---|
id | Tiquo customer ID |
firstName | Customer first name |
lastName | Customer last name |
displayName | Customer display name |
customerNumber | Organization customer number |
email | Primary email address |
phone | Primary phone number |
profilePhoto | Profile photo URL |
status | Customer status, such as active, inactive, or banned |
totalOrders | Total number of orders |
totalSpent | Total amount spent |
createdAt | Read-only Unix timestamp in milliseconds for when the customer profile was created |
firstActiveAt | Read-only Unix timestamp in milliseconds for the customer's first qualifying activity; absent until activity exists |
emails | Full email array |
emails.0.address | First email address |
emails.0.isPrimary | Whether the first email address is primary |
phones | Full phone array |
phones.0.number | First phone number |
phones.0.isPrimary | Whether the first phone number is primary |
parameters | Full customer parameter array |
parameterValues | Customer parameter values keyed by parameter ID and normalized parameter name |
For a Webflow Image element, the package assigns profilePhoto to the image src instead of printing the URL as text:
<img data-tiquo-customer="profilePhoto" alt="Profile photo" />For a div-based avatar, bind it as a CSS background image:
<div
data-tiquo-customer="profilePhoto"
data-tiquo-style="background-image"
data-tiquo-hide-empty
aria-label="Profile photo"
></div>Set the div's dimensions, border radius, background-size: cover, and background-position: center in Webflow. Only HTTP and HTTPS image URLs are accepted. data-tiquo-hide-empty hides the element when the customer does not have a profile photo.
Complete customer record
Inspect every supported customer field, including nested contact fields, images, dates, totals, and parameter collections.
Alex Morgan
alex@example.com
Member since
18 June 2025
Every other customer field and image form
18 fieldsCustomer ID
cus_01JZ8A2K
First name
Alex
Last name
Morgan
Customer number
AH-2048
Primary phone
+44 7700 900123
Profile image element
Safely assigned to image src
Customer status
active
Total orders
18
Total spent
£1,284.50
First active date
02 July 2025
Email records
2 email records
First email address
alex@example.com
First email is primary
true
Phone records
1 phone record
First phone number
+44 7700 900123
First phone is primary
true
Parameter records
4 parameter records
Parameter value map
Membership Type: VIP
The layout and styling remain yours. Tiquo safely assigns image URLs and clears stale values after logout or customer changes.
Created and First Active dates
createdAt and firstActiveAt have different meanings:
- Created is when the customer profile was created. Customer activity never changes or backdates this value.
- First Active is when the customer first became active through qualifying customer activity. It is not the database insertion time. Activities performed by staff, systems, integrations, or imports do not set it.
The values are equal when a customer creates their own account and is immediately active in the same flow. An imported or staff-created profile can have a later firstActiveAt, or no value until the customer becomes active.
Without formatting attributes, the Hosted Package renders the raw Unix millisecond value. Use data-tiquo-date-format to format a date declaratively:
<time
data-tiquo-customer="createdAt"
data-tiquo-date-format="datetime"
data-tiquo-locale="en-GB"
data-tiquo-time-zone="Europe/London"
></time>
<time
data-tiquo-customer="firstActiveAt"
data-tiquo-date-format="date"
></time>Supported date formats:
| Value | Output |
|---|---|
raw | Unix timestamp in milliseconds |
iso | ISO 8601 date and time |
date | Locale-formatted date |
datetime | Locale-formatted date and time |
data-tiquo-locale is optional and defaults to the page language or browser locale. data-tiquo-time-zone is optional and accepts an IANA timezone such as Europe/London. When the customer changes, signs out, or does not have the selected value, the Hosted Package clears the element so stale customer dates are not displayed.
The imperative API always returns the raw millisecond values:
const session = await window.Tiquo.getUser();
console.log(session?.customer?.createdAt);
console.log(session?.customer?.firstActiveAt);Render customer parameters
Customer parameters are custom fields configured in Tiquo. Render them with data-tiquo-customer-parameter.
<span data-tiquo-customer-parameter="Membership Type"></span>
<span data-tiquo-customer-parameter="membership_type"></span>
<span data-tiquo-customer-parameter="system_source"></span>Customer parameters
Inspect parameter data attributes by display name, normalized key, system ID, and schema ID.
Membership Type
VIP
membership_type
VIP
system_source
Website
Schema ID
Events, Dining
Parameter names are normalized automatically, so human-readable names and normalized keys resolve consistently.
The value can be:
- The parameter name, such as
Membership Type - A normalized parameter key, such as
membership_type - A system parameter ID, such as
system_source - A custom parameter schema ID
Parameter names are normalized automatically, so Membership Type, membership type, and membership_type resolve to the same value.
Edit profile fields and customer parameters
Use data-tiquo-form="profile" to let a signed-in customer update their own profile.
<form data-tiquo-form="profile">
<label>
First name
<input data-tiquo-profile="firstName" />
</label>
<label>
Last name
<input data-tiquo-profile="lastName" />
</label>
<label>
Phone
<input data-tiquo-profile="phone" />
</label>
<label>
Membership type
<select data-tiquo-profile-parameter="Membership Type">
<option value="">Select one</option>
<option value="Standard">Standard</option>
<option value="VIP">VIP</option>
</select>
</label>
<label>
Interests
<select data-tiquo-profile-parameter="Interests" multiple>
<option value="Events">Events</option>
<option value="Dining">Dining</option>
<option value="Retail">Retail</option>
</select>
</label>
<label>
Marketing opt-in
<input data-tiquo-profile-parameter="system_marketing_opt_in" type="checkbox" />
</label>
<p data-tiquo-message></p>
<button type="submit">Save profile</button>
</form>Editable customer profile
Inspect every editable built-in field plus select, multiselect, checkbox-group, boolean, message, and submit elements.
Account
Edit your profile
First name
Alex
Last name
Morgan
alex@example.com
Phone
+44 7700 900123
Profile photo URL
https://images.example/alex.jpg
Membership type · Select
VIP
Interests · Multiselect
Events, Dining
Interests · Checkbox group
☑ Events ☑ Retail
Marketing opt-in · Boolean
☑ Enabled
Profile changes are ready to save.
Tiquo validates configured parameter options before saving and reports rejected values through the message element.
Editable built-in profile fields:
| Field | Description |
|---|---|
firstName | Customer first name |
lastName | Customer last name |
email | Primary email address |
phone | Primary phone number |
profilePhoto | Profile photo URL |
displayName is render-only. It cannot be edited through the Hosted Package or DOM Package. Tiquo derives it from first and last name. createdAt and firstActiveAt are also read-only system fields and are never included in profile update payloads.
Editable customer parameters use data-tiquo-profile-parameter. The value can be a parameter name, normalized key, system parameter ID, or custom parameter schema ID.
Dropdown and multiselect values are validated by Tiquo before saving:
selectparameters can only save one configured, non-archived option.multiselectparameters can only save configured, non-archived options.- Checkbox groups with the same
data-tiquo-profile-parametersave as a multiselect array. - Single checkboxes save
trueorfalse, which works for boolean parameters.
If a form tries to save a value that is not available for that parameter, the save is rejected and the message element shows the error.
Upload a profile photo
Add a photo trigger and preview within the same profile editor as the profile form. The package creates the file input, validates the selected image, previews it locally, and uploads it when the customer saves the form.
<div data-tiquo-profile-editor>
<img
data-tiquo-customer="profilePhoto"
data-tiquo-profile-photo-preview
alt="Profile photo"
/>
<button
type="button"
data-tiquo-profile-photo-trigger
>
Choose photo
</button>
<form data-tiquo-form="profile">
<input data-tiquo-profile="firstName" />
<p data-tiquo-message></p>
<button type="submit">Save profile</button>
</form>
</div>The default accepted formats are JPEG, PNG, GIF, and WebP. The maximum upload size is 5 MB. Set data-tiquo-max-size on the trigger to enforce a smaller client-side limit in bytes, or data-tiquo-accept to customise the browser file picker while keeping the same supported formats.
data-tiquo-profile-photo-preview works on an img element or a background-image element. The preview changes immediately after selection, before the form is submitted.
If the form sits elsewhere in the page, set data-tiquo-profile-editor="#profile-editor" on the form and give the containing editor that ID.
Render orders
<div data-tiquo-orders data-tiquo-limit="5">
<div data-tiquo-order-item>
<span data-tiquo-order="month"></span>
<span data-tiquo-order="day"></span>
<span data-tiquo-order="year"></span>
<span data-tiquo-order="date"></span>
<span data-tiquo-order="orderNumber"></span>
<span data-tiquo-order="status"></span>
<span data-tiquo-order="items"></span>
<span data-tiquo-order="itemQuantity"></span>
<span data-tiquo-order="total"></span>
</div>
<p data-tiquo-empty>No orders yet.</p>
</div>Orders collection
Inspect the collection, filters, template, every supported order field, and the empty-state fallback.
Account
Recent orders
Order
#TQ-1048
Placed
28 Jun 2026
Total
£42.50
Every other order field
7 fieldsOrder day
28
Order month
JUN
Order year
2026
Order status
Completed
Order items
Recovery Suite, Guest pass
Item quantity
2
Quantity label
2 items
No orders yet
Your completed orders will appear here.
Tiquo hides the first order card, clones it once per result, fills its fields, and shows the fallback only when no orders exist.
Supported order fields include:
| Attribute value | Description |
|---|---|
date | Order creation date as DD/MM/YYYY |
day | Order creation day, such as 28 |
month | Short order creation month, such as JUN |
year | Order creation year, such as 2026 |
items | Comma-separated order item names |
itemQuantity | Total quantity across all order items |
itemQuantityLabel | Total quantity with label, such as 1 item or 2 items |
total | Order total formatted with the order currency and two decimal places, such as £12.50 |
Optional filters:
data-tiquo-limit="5"data-tiquo-status="completed"
The first data-tiquo-order-item element is the template. Tiquo hides that
template and appends rendered copies for each order.
data-tiquo-status filters by the order lifecycle status, not payment status.
Use values such as completed, processing, cancelled, refunded, or
open_tab. Do not use payment statuses such as paid here.
Render bookings
<div data-tiquo-bookings data-tiquo-limit="upcoming" data-tiquo-count="5">
<div data-tiquo-booking-item>
<span data-tiquo-booking="date"></span>
<span data-tiquo-booking="day"></span>
<span data-tiquo-booking="month"></span>
<span data-tiquo-booking="year"></span>
<span data-tiquo-booking="id"></span>
<span data-tiquo-booking="serviceName"></span>
<span data-tiquo-booking="items"></span>
<span data-tiquo-booking="itemQuantity"></span>
<span data-tiquo-booking="duration"></span>
<span data-tiquo-booking="startTime"></span>
<span data-tiquo-booking="endTime"></span>
<span data-tiquo-booking="status"></span>
</div>
<p data-tiquo-empty>No upcoming bookings.</p>
</div>Bookings collection
Inspect the collection filters, repeatable template, every supported booking field, and empty state.
Bookings
Upcoming visits
Booking number
BKG-1CTYN6
Booking date
03/08/2026
Service name
Recovery Suite
Start time
11:00
End time
12:00
Booking status
Confirmed
Every other booking field
9 fieldsInternal booking ID
booking_01JZ8A2K
Booking day
03
Booking month
AUG
Booking year
2026
Service category
Wellness
Booking items
Recovery Suite
Item quantity
2
Quantity label
2 items
Duration
60 min
No upcoming bookings
Future confirmed bookings will appear here.
Canonical booking field names are shown. The documented booking-prefixed aliases bind to the same values.
Optional filters:
data-tiquo-limit="upcoming"ordata-tiquo-limit="past"data-tiquo-count="5"data-tiquo-status="confirmed"
The first data-tiquo-booking-item element is the template. Tiquo hides that
template and appends rendered copies for each booking.
data-tiquo-upcoming="true" still works for older pages, but new embeds
should use data-tiquo-limit="upcoming" instead. When using upcoming or
past, use data-tiquo-count for the number of bookings to render.
Booking fields:
| Field | Description |
|---|---|
date or bookingDate | Booking date formatted as DD/MM/YYYY |
day or bookingDay | Two-digit booking day |
month or bookingMonth | Three-letter booking month, such as JUN |
year or bookingYear | Four-digit booking year |
items or bookingItems | Booking service/item name. Falls back to the service record when no order snapshot exists. |
itemQuantity or bookingItemQuantity | Booking attendee/item quantity |
itemQuantityLabel or bookingItemQuantityLabel | Quantity with item or items label |
id or bookingId | Human booking number, such as BKG-1CTYN6 |
rawId | Internal booking row ID |
duration or bookingDuration | Booking duration, such as 30 min |
startTime or bookingStartTime | Booking start time formatted as HH:mm |
endTime or bookingEndTime | Booking end time formatted as HH:mm |
status | Booking status |
serviceName | Booking service name |
serviceCategoryName | Booking service category name, when captured |
Render a customer flow service catalog
Use service attributes to build a custom catalog from the services connected to a customer flow. Your Webflow or website-builder elements remain in full control of the layout and styling.
Service catalogs and locked booking require Hosted Package 1.1.22 or
newer. Automatic category-image fallback and the explicit service/category
image fields require 1.1.23 or newer. Service category-name fields require
1.1.24 or newer. Service category-description fields require 1.1.25 or
newer. The unversioned installation URL loads the current version.
Set data-tiquo-services to the customer flow ID. The first
data-tiquo-service-item child is the template that Tiquo hides and clones for
each service.
<div data-tiquo-services="CUSTOMER_FLOW_ID" data-tiquo-limit="20">
<article data-tiquo-service-item>
<a
data-tiquo-service-link="/services/{slug}?tiquoServiceId={id}"
>
<img data-tiquo-service="image" alt="" />
<h2 data-tiquo-service="name"></h2>
<span data-tiquo-service="categoryName"></span>
<p data-tiquo-service="categoryDescription"></p>
</a>
<p data-tiquo-service="shortDescription"></p>
<span data-tiquo-service="priceLabel"></span>
<span data-tiquo-service="durationLabel"></span>
</article>
<p data-tiquo-empty>No services available.</p>
</div>Customer flow service catalog
Inspect the catalog wrapper, template, link, every supported service field, images, pricing, booking rules, and fallback.
Experiences
Book your next visit
Services available at Atlas House.
Recovery Suite
Private sauna, cold plunge, and a quiet recovery lounge.
Every other supported service field
39 fieldsService ID
service_01JZ8A2K
Service ID alias
service_01JZ8A2K
Service slug
recovery-suite
Full description
Private sauna, cold plunge, and lounge.
Short description
Private recovery experience.
Service tags
Wellness, Recovery
Tags label
Wellness, Recovery
Featured image
Featured service image
Service image
First service image
Service image URLs
2 image URLs
Category image
Wellness category image
Category image URLs
2 category image URLs
First category name
Wellness
All category names
Wellness, Members
Category names label
Wellness, Members
All category descriptions
Restore and recharge, Member favourites
Base price
35.00
Effective price
28.00
Currency
GBP
Price type
fixed
Service type
appointment
Raw duration
60
Duration type
minutes
Capacity
4
Featured service
Yes
Payment type
online
Deposit required
Yes
Deposit amount
10.00
Deposit type
fixed
Minimum advance booking
2 hours
Maximum advance booking
90 days
Check-in time
15:00
Check-out time
11:00
Minimum stay
1 night
Maximum stay
14 nights
Category IDs
cat_wellness, cat_members
Category IDs label
cat_wellness, cat_members
Customer flow ID
flow_atlas_house
Locked booking URL
/embed/flow_atlas_house?service=...
The first service card is the template. Tiquo safely fills links, images, and text according to the element each data attribute is attached to.
The customer flow ID is the ID in its booking or embed URL. For example, use
CUSTOMER_FLOW_ID from
https://book.tiquo.app/embed/CUSTOMER_FLOW_ID.
data-tiquo-service-link sets the element's href and supports these
URL-encoded placeholders:
| Placeholder | Value |
|---|---|
{id} | Service ID |
{slug} | Service slug |
{bookingConfigId} | Customer flow ID |
If the attribute has no value, its default link is
?tiquoServiceId={id}. Use data-tiquo-limit to cap the number of services;
the default is 100.
Public services render without a customer session. When the customer is signed in, the collection also includes membership-gated services that customer is allowed to book. Inactive services, services outside their visibility window, and services unavailable to the current customer are not rendered.
Service fields
Set data-tiquo-service to any supported field:
| Field | Description |
|---|---|
id or serviceId | Service ID |
slug | Service slug |
name | Service name |
description | Full description |
shortDescription | Short description |
tags | Comma-separated service tags |
tagsLabel | Comma-separated service tags |
image | Preferred display image: the service image, then the first associated category image |
featuredImage | Featured service image, with the first service image as fallback |
serviceImage | Featured service image, with the first service image as fallback |
images | Comma-separated service image URLs |
categoryImage | First image from a flow category containing the service |
categoryImages | Comma-separated images from all flow categories containing the service |
categoryName | Name of the first flow category containing the service |
categoryNames | Comma-separated names of all flow categories containing the service |
categoryNamesLabel | Comma-separated names of all flow categories containing the service |
categoryDescription | First configured description from a flow category containing the service |
categoryDescriptions | Comma-separated configured descriptions from all flow categories containing the service |
price | Base price |
effectivePrice | Effective price after applicable flow pricing |
currency | Currency code |
priceLabel | Localized effective price, or Free |
priceType | Price type |
serviceType | Service type |
duration | Raw duration |
durationType | Duration unit or booking type |
durationLabel | Display duration, such as 60 minutes |
capacity | Service capacity |
isFeatured | Yes or No |
paymentType | Payment type |
depositRequired | Yes or No |
depositAmount | Deposit amount |
depositType | Deposit type |
minAdvanceBooking | Minimum advance-booking rule |
maxAdvanceBooking | Maximum advance-booking rule |
checkInTime | Check-in time |
checkOutTime | Check-out time |
minStay | Minimum stay |
maxStay | Maximum stay |
categoryIds | Comma-separated category IDs |
categoryIdsLabel | Comma-separated category IDs |
bookingConfigId | Customer flow ID |
bookingUrl | Locked booking URL for this service |
When data-tiquo-service="image" or another image URL field is placed on an
img, Tiquo safely sets src. On a link, it safely sets href. The existing
data-tiquo-hide-empty, data-tiquo-preserve-text, and data-tiquo-style
data attributes also work with service fields.
image is the simplest choice for catalog cards because it prefers an image
configured directly on the service and automatically falls back to the first
associated category image. Use serviceImage or categoryImage when the
image source must be explicit. The plural images and categoryImages fields
render as comma-separated URLs on text elements.
For example, use a service image as a background:
<div
data-tiquo-service="image"
data-tiquo-style="background-image"
data-tiquo-hide-empty
></div>Use categoryName to display the first associated category. If a service is
assigned to multiple flow categories, use categoryNames to display every
category as comma-separated text:
<span data-tiquo-service="categoryName"></span>
<span data-tiquo-service="categoryNames"></span>Use categoryDescription to display the first configured description from an
associated category. Use categoryDescriptions to display every configured
associated category description as comma-separated text:
<p data-tiquo-service="categoryDescription"></p>
<p data-tiquo-service="categoryDescriptions"></p>To render the two sources separately:
<img
data-tiquo-service="serviceImage"
data-tiquo-hide-empty
alt=""
/>
<img
data-tiquo-service="categoryImage"
data-tiquo-hide-empty
alt=""
/>Render a custom service detail page
Set data-tiquo-service-detail to the same customer flow ID:
<section data-tiquo-service-detail="CUSTOMER_FLOW_ID">
<img data-tiquo-service="image" alt="" />
<h1 data-tiquo-service="name"></h1>
<p data-tiquo-service="description"></p>
<p data-tiquo-service="categoryDescription"></p>
<span data-tiquo-service="priceLabel"></span>
<div data-tiquo-service-booking></div>
<p data-tiquo-empty>
This service is unavailable.
</p>
</section>Service detail and booking
Inspect the detail wrapper, every available service field, the locked booking mount, and unavailable-service fallback.
Wellness
Recovery Suite
Reset with a private sauna, cold plunge, and a calm recovery lounge.
Every other service field available on the detail page
40 fieldsService ID
service_01JZ8A2K
Service ID alias
service_01JZ8A2K
Service slug
recovery-suite
Short description
Private recovery experience.
Service tags
Wellness, Recovery
Tags label
Wellness, Recovery
Featured image
Featured service image
Service image
First service image
Service image URLs
2 image URLs
Category image
Wellness category image
Category image URLs
2 category image URLs
First category name
Wellness
All category names
Wellness, Members
Category names label
Wellness, Members
First category description
Restore, reset, and recharge.
All category descriptions
Restore and recharge, Member favourites
Base price
35.00
Effective price
28.00
Currency
GBP
Price type
fixed
Service type
appointment
Raw duration
60
Duration type
minutes
Duration label
60 minutes
Capacity
4
Featured service
Yes
Payment type
online
Deposit required
Yes
Deposit amount
10.00
Deposit type
fixed
Minimum advance booking
2 hours
Maximum advance booking
90 days
Check-in time
15:00
Check-out time
11:00
Minimum stay
1 night
Maximum stay
14 nights
Category IDs
cat_wellness, cat_members
Category IDs label
cat_wellness, cat_members
Customer flow ID
flow_atlas_house
Locked booking URL
/embed/flow_atlas_house?service=...
Locked booking flow
Choose a time
The booking mount becomes an auto-resizing iframe locked to this service. A fixed service ID is optional when the URL already contains tiquoServiceId.
By default, the detail container reads the service ID from the
tiquoServiceId query parameter written by the catalog link. To render a fixed
service instead, set it directly:
<section
data-tiquo-service-detail="CUSTOMER_FLOW_ID"
data-tiquo-service-id="SERVICE_ID"
>
<!-- Service fields and booking container -->
</section>data-tiquo-service-booking becomes an automatically resizing customer-flow
iframe. The requested service is preselected, category and service-catalog
navigation are removed, and the customer cannot return to select another
service. The remaining availability, quantity, payment, and booking steps
continue normally.
If the service is missing or unavailable to the current visitor, Tiquo clears
the service fields, hides the booking container, and shows
data-tiquo-empty. It never falls back to the full flow catalog.
Render the current membership
Use data-tiquo-memberships for the collection wrapper. The first data-tiquo-membership-item child is the Webflow template that Tiquo clones for each matching membership.
<div
data-tiquo-memberships
data-tiquo-status="active"
data-tiquo-limit="1"
>
<article data-tiquo-membership-item>
<span data-tiquo-membership="icon"></span>
<h2 data-tiquo-membership="name"></h2>
<p data-tiquo-membership="summary"></p>
<span data-tiquo-membership="statusLabel"></span>
<span data-tiquo-membership="priceLabel"></span>
<span
data-tiquo-membership="color"
data-tiquo-style="background-color"
></span>
</article>
<div data-tiquo-empty>
You do not have an active membership yet.
</div>
</div>Current memberships
Inspect collection filters, the repeatable template, every membership field, style data attribute, and empty state.
Membership
Your current plan
Membership name
Atlas Plus
Membership icon
A
Status label
Active
Membership summary
Active since Jun 2025 · Renews Jul 2026
Price label
£25/month
Current membership
Current
Every other membership field
8 fieldsPlan description
Priority access and member pricing.
Raw status
active
Payment status
Paid
Active since
Active since Jun 2025
Renewal label
Renews Jul 2026
End label
Ends 31 Jul 2026
Billing period
month
Membership features
Priority booking, Guest passes
No active membership
Available plans can be shown below this state.
Use status all to include inactive, expired, cancelled, and suspended memberships.
Useful membership fields:
| Field | Description |
|---|---|
name | Membership plan name |
description | Plan description |
icon | Configured icon, or the first letter of the plan name |
status | Raw status, such as active |
statusLabel | Display status, such as Active |
paymentStatusLabel | Display payment status |
summary | For example, Active since Jun 2025 · Renews Jul 2026 |
activeSinceLabel | For example, Active since Jun 2025 |
renewalLabel | For example, Renews Jul 2026 |
endLabel | Membership end label, when present |
priceLabel | For example, £25/month or Free |
billingPeriodLabel | For example, month or year |
features | Comma-separated plan features |
color | Configured membership color |
currentLabel | Current for the active membership |
Use data-tiquo-status="all" to include inactive, expired, cancelled, and suspended memberships.
Render available membership plans
Use a separate collection for active public customer plans:
<div data-tiquo-membership-plans data-tiquo-current="include">
<article data-tiquo-membership-plan-item>
<span data-tiquo-membership-plan="icon"></span>
<h3 data-tiquo-membership-plan="name"></h3>
<strong data-tiquo-membership-plan="priceLabel"></strong>
<p data-tiquo-membership-plan="description"></p>
<p data-tiquo-membership-plan="features"></p>
<span
data-tiquo-membership-plan="currentLabel"
data-tiquo-hide-empty
></span>
<a
data-tiquo-membership-plan="signupUrl"
data-tiquo-preserve-text
>Choose membership</a>
</article>
<div data-tiquo-empty>
There are no other memberships available.
</div>
</div>Available membership plans
Inspect current-plan filtering, the repeatable template, every plan field, signup link, badges, and empty state.
Memberships
Choose your plan
Plan name
Atlas Plus
Plan description
Priority access and member pricing.
Price label
£25/month
Plan features
Priority booking, Guest passes
Every other membership-plan field
6 fieldsPlan ID
plan_atlas_plus
Plan slug
atlas-plus
Plan type
recurring
Billing period
month
Plan colour
#7157ff
Plan icon
A
No other plans available
The current-plan filter controls which plans are listed.
Current-plan filtering accepts include, exclude, or only. Signup URLs are assigned safely to links.
data-tiquo-current accepts:
| Value | Behaviour |
|---|---|
include | Include all public plans and mark the current plan |
exclude | Omit the customer's current plan |
only | Show only the current plan |
Plan fields include id, name, description, slug, type, priceLabel, billingPeriodLabel, features, color, icon, popularLabel, currentLabel, and signupUrl.
data-tiquo-preserve-text keeps the Webflow link label while Tiquo assigns signupUrl to href. data-tiquo-hide-empty hides elements such as Current and Popular badges when their value is empty.
Render guest pre-registration flows
For signed-in customers, data-tiquo-guest-flows renders the Guest Flows returned by the Customer API.
<div data-tiquo-guest-flows data-tiquo-limit="10">
<article data-tiquo-guest-flow-item>
<h3 data-tiquo-guest-flow="label"></h3>
<p data-tiquo-guest-flow="inviteMessage"></p>
<span data-tiquo-guest-flow="availableGuestsLabel"></span>
<a data-tiquo-guest-flow="hostedUrl" data-tiquo-preserve-text>Register guests</a>
</article>
<p data-tiquo-empty>No guest registration flows are available.</p>
</div>Advanced sites can access the same data directly:
const { guestFlows } = await window.Tiquo.getGuestFlows();See the Customer API Guest Flows reference for the raw response fields.
Empty states
Place a data-tiquo-empty element inside the collection wrapper and outside its template. Tiquo hides it when results exist and shows it when the collection is empty.
This works for data-tiquo-orders, data-tiquo-bookings,
data-tiquo-services, data-tiquo-service-detail,
data-tiquo-memberships, and data-tiquo-membership-plans.
Collection empty states
Inspect the empty-state placement for every supported collection and service-detail type.
Orders
No orders yet
Bookings
No upcoming bookings
Services
No services available
Service detail
This service is unavailable
Memberships
No active membership
Membership plans
No other plans available
Keep each empty state inside its collection wrapper and outside the repeatable item template.
Wrap authenticated profile tabs in data-tiquo-show="logged-in" so signed-out visitors see the sign-in state instead of an empty customer-data message.
Authenticated membership embeds
embedMembership creates an automatically resizing membership iframe:
<div id="membership-signup"></div>
<script>
window.Tiquo.ready(function (tiquo) {
tiquo.embedMembership(
"membership_plan_id",
"#membership-signup",
{ minHeight: "240px" }
);
});
</script>Authenticated membership embed
Inspect the mount element, embed call, generated iframe, and minimum-height option.
Secure embed mount
Atlas Plus signup
Join Atlas Plus
Secure, automatically resizing membership flow
The iframe receives a short-lived one-time handoff token; raw customer access tokens are never appended to its URL.
You can also add a Tiquo /embed/ iframe directly. The package discovers existing and dynamically added Tiquo iframes.
When the website has an authenticated session, Tiquo requests a short-lived, one-time iframe token and sends it only to the matching Tiquo origin with postMessage. The access token is never appended to the iframe URL. If the visitor is not authenticated, the embedded flow displays its normal sign-in interface.
JavaScript API
Use window.Tiquo.ready when you want to call the API after the script loads.
<script>
window.Tiquo.ready(function (tiquo) {
tiquo.track("booking_started", {
eventName: "Booking Started",
eventProperties: {
source: "homepage"
}
});
});
</script>Service catalogs and locked booking are also available programmatically:
<div id="service-booking"></div>
<script>
window.Tiquo.ready(async function (tiquo) {
const catalog = await tiquo.getFlowServices("CUSTOMER_FLOW_ID");
const service = await tiquo.getFlowService(
"CUSTOMER_FLOW_ID",
catalog.services[0].id
);
if (service) {
await tiquo.embedServiceBooking(
"CUSTOMER_FLOW_ID",
service.id,
"#service-booking",
{ minHeight: "240px" }
);
}
});
</script>getFlowService() returns null when the requested service is not available
to the current visitor. embedServiceBooking() uses the same secure
authenticated iframe handoff and automatic resizing as
embedCustomerFlow().
Available methods:
Tiquo.ready(callback)Tiquo.track(eventType, options)Tiquo.identify(options)Tiquo.sendOTP(email)Tiquo.verifyOTP(email, code)Tiquo.getUser()Tiquo.updateProfile(updates)Tiquo.uploadProfilePhoto(photo)Tiquo.logout()Tiquo.getOrders(options)Tiquo.getBookings(options)Tiquo.getMemberships()Tiquo.getGuestFlows()Tiquo.getWalletCardLinks(options)Tiquo.getUpcomingBookings(options)Tiquo.getFlowServices(bookingConfigId)Tiquo.getFlowService(bookingConfigId, serviceId)Tiquo.getIframeToken(customerFlowId, handoffVersion)Tiquo.embedCustomerFlow(flowUrl, container, options)Tiquo.embedServiceBooking(bookingConfigId, serviceId, container, options)Tiquo.embedMembership(planId, container, options)Tiquo.render()Tiquo.onAuthStateChange(callback)Tiquo.setConsent(mode)Tiquo.getConsent()
Hosted Package JavaScript API
Inspect every public method, grouped by authentication, customer data, catalogs, embeds, analytics, rendering, and consent.
window.Tiquo
Complete public method set
Every available JavaScript method
21 fieldsRun after load
Tiquo.ready(callback)
Track an event
Tiquo.track(eventType, options)
Identify a customer
Tiquo.identify(options)
Send a one-time code
Tiquo.sendOTP(email)
Verify a one-time code
Tiquo.verifyOTP(email, code)
Get the current customer
Tiquo.getUser()
Log out
Tiquo.logout()
Get orders
Tiquo.getOrders(options)
Get bookings
Tiquo.getBookings(options)
Get memberships
Tiquo.getMemberships()
Get upcoming bookings
Tiquo.getUpcomingBookings(options)
Get flow services
Tiquo.getFlowServices(bookingConfigId)
Get one flow service
Tiquo.getFlowService(bookingConfigId, serviceId)
Get an iframe token
Tiquo.getIframeToken(customerFlowId, handoffVersion)
Embed a customer flow
Tiquo.embedCustomerFlow(flowUrl, container, options)
Embed a service booking
Tiquo.embedServiceBooking(bookingConfigId, serviceId, container, options)
Embed a membership
Tiquo.embedMembership(planId, container, options)
Render bound elements
Tiquo.render()
Watch authentication
Tiquo.onAuthStateChange(callback)
Set consent
Tiquo.setConsent(mode)
Get consent
Tiquo.getConsent()
Call methods inside Tiquo.ready when they depend on the Hosted Package being loaded.
The Hosted Package does not expose raw access or refresh token getters.