During the October 2025 integration progress call, the team identified a key technical constraint: the Bookly widget can filter and display a selected service when a customer clicks "Book Now," but it cannot natively handle product variations. Addressing variations requires a custom implementation approach, and the chosen path has significant implications for project timeline.
This article documents the options discussed, the approach agreed upon, and the complexity considerations that apply to similar WooCommerce + Bookly setups.
Bookly's widget supports filtering to a specific service (product), but it has no built-in mechanism for surfacing variations within a service (e.g., different durations, formulations, or pricing tiers of the same treatment). When a service has variations, Bookly treats them as a flat list rather than a structured selector.
"We can't through Bookly go granular and do variations. So if we do variations, it'll have to be individual service pages that we create."
— Chris Østergaard, developer lead
Create a dedicated WooCommerce page for each variation. Each page passes its own filter parameter to the Bookly widget, pre-selecting the correct service.
Pros:
- Clean URL structure; each variation is independently bookable
- Consistent with how Bookly's filter already works for top-level services
- Easier to maintain per-page SEO and content
Cons:
- High volume of pages to create and maintain (La Marie has many services with multiple variations)
- Hard-coded variable updates required for each product — time-consuming at scale
- Any service catalog change requires page-level updates
Build a custom UI element (e.g., a tab strip or dropdown) on a single product page. Selecting a variation dynamically sets the Bookly widget's service parameter without a page reload.
Pros:
- Single page per service; cleaner information architecture
- Better UX — customers stay in context while choosing a variation
- Scales better as the catalog grows
Cons:
- Requires custom development work beyond Bookly's standard configuration
- More complex to build and test
- Dependency on developer availability
The team aligned on a hybrid of Option B: building new product page layouts that include tabbed or rotating variation selectors. Each tab would correspond to a variation and trigger the appropriate Bookly service filter.
"When they land on just a product page, then yeah, they've got the different things that rotate through."
— Melissa Cusumano
Key dependency: new page layouts must be completed before Bookly can be launched. The client (Roxana) confirmed this explicitly:
"I don't think we can launch Bookly without the page layouts, because of the way the variations work."
Melissa committed to scheduling a call with the development team to scope and timeline the layout work, with an update expected within the week.
The developer had already implemented a hard-coded approach to pass product filter variables to the Bookly widget. While functional for top-level services, scaling this to variations introduces compounding complexity:
This reinforces the preference for the custom selector approach — it centralizes the logic rather than distributing it across dozens of hard-coded pages.
The variation handling issue is one of two blockers (alongside the [1]) preventing Bookly from going live. The end-of-October target was acknowledged as tight, and the team agreed that quality implementation takes priority over hitting the deadline.
"I'd rather have this done properly rather than roll it out with some potential hiccups."
— Chris Østergaard
As a stopgap, the team agreed to redirect the site-wide "Book Now" button to the full Square booking page, giving clients uninterrupted access to all services while the Bookly integration is completed. See [2] for full context.
Bookly's service filter works at the product level, not the variation level. Any project using Bookly with WooCommerce variable products will hit this ceiling. Plan for custom development time upfront.
Hard-coded filter variables don't scale. For catalogs with more than ~10–15 services, a dynamic selector approach is worth the additional build time.
Page layout dependencies can gate integration launches. Identify UI/UX prerequisites early — in this case, the page layout work was a hidden dependency that wasn't scoped until mid-integration.
Temporary redirects are a valid stopgap. When a booking flow is broken or incomplete, redirecting to the provider's native booking page (Square, Acuity, etc.) preserves conversion while the custom integration is finished.