HTML page structure
A minimal page structure with a header, an optional sidebar, and a widget in the main area.- The script is loaded once in the
<head>. a-login-buttonanda-cart-modal-buttonbelong in the header, so they stay visible on all pages.- Replace the panel with a page widget using
fullscreen="true"andnav-heightif the booking should fill the entire viewport height (see Full-page widgets further below).
Full-page widgets
Page widgets are suitable when the widget is the main content of the page. Page widgets:a-organization-pagea-organization-mapa-organization-calendara-resource-pagea-resource-mapa-resource-calendara-service-pagea-subscription-pagea-package-pagea-my-bookings
Recommended integration for full-page layouts
Usefullscreen="true" so the widget fills the available viewport height. If your website has a fixed header, also pass nav-height so the widget is not rendered underneath it.
fullscreen="true"corresponds toheight: 100vh.nav-heightchanges this tocalc(100vh - nav-height).- If you set
height, automatic resizing is disabled and the iframe has a fixed height. - For
*-page, map, calendar, anda-my-bookingswidgets, full-page layouts are usually the cleanest integration.
Organization map and organization calendar
These are page widgets, not modal buttons. Treat them like a full page section.a-organization-page.
Panels
Booking panels are deliberately kept compact and lock the navigation. Panel widgets:a-resource-booking-panela-service-booking-panel
- Panels always use dynamic height.
- External
heightandfullscreenvalues are ignored. - Panels are meant to embed the booking flow into your own page layout.
Login button and cart button
These two components are configured under Organization → Settings → Booking page → Global components. They are intended as shared controls that are usually located in the site header or in a fixed navigation bar.Login button
Usea-login-button when you need a shared login/logout element that stays in sync with the widget session.
- Loads its own login iframe.
- Automatically switches to the logged-in avatar state.
- Forwards auth changes so neighboring widgets update their authentication state.
- Main site header
- Mobile navigation drawer
- Top bar on booking landing pages
Cart button
Usea-cart-modal-button when users should add items from booking widgets and check out later.
- Shows a live badge with the item count.
- Stays in sync with neighboring widgets on the same page.
- Opens the checkout in a modal overlay.
a-resource-booking-paneltogether witha-cart-modal-button- Several booking widgets on one page with a shared cart button
Events and tracking
Most embed widgets forward booking lifecycle events as DOM custom events. This applies to everything except the login button. Supported event names:view-pageadd-to-cartstart-checkoutcomplete-checkout
event_namevaluegross_valuetaxcurrencytransaction_iditems
a-login-buttonanda-cart-modal-buttonare helper widgets and do not send booking events.- Page widgets, maps, calendars, booking panels, and checkout-focused pages send booking events.
- Subscription and package widgets send checkout-focused events. In practice,
view-page,start-checkout, andcomplete-checkoutare the most relevant.
UTM parameters and click IDs
You don’t need to do anything else for attribution. When a widget loads, it reads the query string of the parent page URL and automatically forwards these parameters into the embedded iframe:
So if a user arrives on your page via
?utm_campaign=spring&gclid=abc123, the widget carries these values through the entire booking flow. Conversion tracking works without any additional configuration.
No HTML attribute is required. The forwarding happens automatically on every widget load.
Start and end date
Most widgets acceptstart (and sometimes end) to pre-navigate the calendar or map to a specific date range.
ISO 8601 date string for an exact date:
a-resource-calendar and a-organization-calendar, which require ISO 8601.
end always expects an ISO 8601 date string.
Customization options by widget type
This section documents the public HTML attributes. Admin-generated snippets usually already cover the most important ones.Common attributes for embed widgets
Applies to page widgets and panel widgets. Not applicable to button widgets.
All embed widgets additionally accept the design attributes from
WIDGET_DESIGNING.md.
Organization widgets
a-organization-page
Note:
- The “Calendar board” option in the admin corresponds to
calendar-view="list".
a-organization-calendar
a-organization-map
Resource widgets
a-resource-page
a-resource-calendar
a-resource-map
a-resource-booking-panel
Service widgets
a-service-page
a-service-booking-panel
Subscription and package widgets
a-subscription-page
a-subscription-button
a-package-page
a-package-button
Button widgets
Applies to:a-organization-buttona-resource-buttona-service-buttona-subscription-buttona-package-buttona-modal-buttona-cart-modal-button
Common modal attributes
Trigger attributes for entity buttons
Applies to:a-organization-buttona-resource-buttona-service-buttona-subscription-buttona-package-button
a-modal-button is different:
- no
labelprop - no built-in trigger styling props
- use your own element in the slot as the trigger
Custom trigger (slot)
All button widgets accept a default slot that replaces the built-in trigger. Use this when you want to style the trigger yourself or use a different element as the button.label, button-background, button-text, and button-width are ignored. Click and keyboard handling are still managed by the widget wrapper.
a-resource-button
a-service-button
a-organization-button
a-modal-button
Use this button when you need a custom modal trigger without an entity-specific button component.
Helper widgets
a-cart-modal-button
a-login-button
a-my-bookings
Note:
a-my-bookingsalways requires authentication.should-loginis not available, since login is mandatory.
Recommendations
- Use the admin-generated snippet first and only refine it manually when needed.
- Use page widgets for dedicated booking pages.
- Use panels for editorial pages around the booking flow.
- Use button widgets when booking should only become visible after a click.
- Place
a-login-buttonanda-cart-modal-buttonin stable, clearly visible positions in the UI. - Prefer
drawerfor desktop-side checkout flows andfullscreenfor mobile experiences.