Book a Tour (Visit Us)
A distillery-tour booking feature, found on Herradura’s live site at
/en-us/visit-us/. Casa Herradura, the actual distillery in Amatitán, Jalisco,
offers paid guided tours. Not something we’d found evidence of on jackdaniels.com;
this appears Herradura-specific (or at least not something every brand needs).
What we confirmed
The page lists multiple bookable experiences, each with real structured data:
| Experience | Price | Duration | Booking |
|---|---|---|---|
| The Casa Experience | 950 MXN / person | 2.5 hrs | Online, via Xola |
| Double Barrel Ritual | 2,200 MXN / person | 3 hrs | Online, via Xola |
| Curated Experiences | Available upon request | Email only (infocasaherradura@b-f.com); no online booking |
The booking vendor is Xola (xola.com), confirmed directly from the rendered
markup:
<div class="bfwpf-xola-button xola-checkout ..." data-button-id="6a4568bf659b1babd7034f1d">
Book Now
<a href="https://x2-checkout.xola.app/flows/mvp?button=6a4568bf659b1babd7034f1d&openExternal=true"
target="_blank" rel="nofollow noopener noreferrer" class="bfwpf-xola-fallback-link">
</div>- Each experience has its own Xola button ID: a per-experience identifier, same pattern as OneTrust’s per-brand domain-script ID and Dotter’s per-brand app ID elsewhere in this section.
- The primary UX is presumably a JS-driven embed/modal (Xola offers this); the visible
<a target="_blank">is a progressive-enhancement fallback: it works even if Xola’s embed script fails to load, opening Xola’s own hosted checkout in a new tab. - Another
bfwpf-class (bfwpf-xola-button): the same Brown-Forman shared WordPress plugin family documented in Web Forms. Age gate, forms, and tour booking are all part of one existing internal plugin suite on the WordPress side. - “Curated Experiences” has no online booking at all. It’s an email CTA only. Worth preserving as a deliberate tier, not an oversight to “fix” by forcing it through Xola too.
Guests must be 18+ for the tour (stated directly on the page): Mexico’s legal
drinking age, not the US’s 21. This is a concrete, real-world case for the
Age Gate’s minimumAgeByCountry config actually mattering,
not just a theoretical one.
Approach
Published as @brown-forman/p1-xola-booking: small, matching the pattern of
everything else in this section:
import { XolaBookButton } from "@brown-forman/p1-xola-booking";
<XolaBookButton buttonId="6a4568bf659b1babd7034f1d">
Book Now
</XolaBookButton>Renders Xola’s embed when their script loads successfully; falls back to a plain
target="_blank" link to Xola’s hosted checkout otherwise, the same resilience pattern
already proven on the live site, not a new invention.
This would live inside a Tour/Experience Puck component (or its own small Template, if tours end up editor-managed rather than developer-authored) with fields for name, description, price, duration, and either a Xola button ID or a plain email CTA, matching the “Curated Experiences” no-booking tier.
Config shape
interface XolaBookingConfig {
buttonId?: string; // set for online-bookable experiences
fallbackEmail?: string; // set instead, for request-only experiences (e.g. Curated)
}Open questions for this page now live on Outstanding Questions, tracked centrally across all pages rather than repeated per page.