ResytechResytech Docs

Inline Booking Embed

Embed the full Resytech booking UI inline on your page using the booking embed web component.

The <resytech-booking-embed> component embeds the Resytech booking UI directly on your page as an inline iframe. Unlike the modal widget which overlays the entire viewport, this component sits within your page layout — perfect for dedicated booking pages.

Basic Usage

<resytech-booking-embed
  base-url="https://yourlocation.bookingui.com"
  location-id="your-location-id">
</resytech-booking-embed>

This renders the full booking flow inline: activity selection → equipment → duration → calendar → time slot → checkout.

Deep-Linking to an Activity

Skip the activity listing and open a specific activity's equipment selection:

<resytech-booking-embed
  base-url="https://yourlocation.bookingui.com"
  location-id="your-location-id"
  activity-id="activity-uuid">
</resytech-booking-embed>

Skip to Checkout

Pre-fill every step and land directly on the checkout page:

<resytech-booking-embed
  base-url="https://yourlocation.bookingui.com"
  location-id="your-location-id"
  activity-id="activity-uuid"
  equipment-id="equipment-uuid"
  date="2025-07-15"
  duration-mins="120"
  time-start="2025-07-15T10:00:00"
  time-end="2025-07-15T12:00:00"
  price="89.99">
</resytech-booking-embed>

Attributes

AttributeTypeDefaultDescription
base-urlstringRequired. Your bookingui.com URL (e.g. https://yourlocation.bookingui.com)
location-idstringRequired. Your Resytech location UUID
activity-idstringActivity UUID to pre-select
equipment-idstringEquipment UUID to pre-select
datestringDate to pre-select (YYYY-MM-DD)
duration-minsnumberDuration in minutes
time-startstringTime slot start (ISO 8601)
time-endstringTime slot end (ISO 8601)
pricenumberTime slot price
heightnumber700Initial iframe height in pixels (auto-resizes once loaded)
nav-modestringSchedulingOnlyNavigation mode passed to the booking UI
show-closebooleanfalseShow the close (X) button in the booking UI header

Auto Height

The embedded booking UI reports its content height to the parent. The component automatically resizes to match — no fixed height needed after the initial load. The height attribute only controls the container size before the first height message arrives.

Events

Listen for checkout lifecycle events on the component or any ancestor:

const embed = document.querySelector('resytech-booking-embed');

embed.addEventListener('checkout-ready', () => {
  console.log('Booking UI is loaded and ready');
});

embed.addEventListener('checkout-complete', (e) => {
  console.log('Booking confirmed!', e.detail.confirmationCode);
  console.log('Total paid:', e.detail.price);
});

embed.addEventListener('checkout-close', () => {
  console.log('User closed the booking UI');
});
EventDetailDescription
checkout-ready{}Booking UI has loaded
checkout-complete{ confirmationCode, price }Customer completed a booking
checkout-close{}Customer clicked close (if show-close is enabled)
gift-card-purchase-complete{ giftCardCode, amount }Gift card purchased

Hybrid Approach

Use custom web components for browsing and the embed for checkout. This gives you full control over the discovery experience while leveraging the hosted checkout for payments:

<!-- Custom activity browsing -->
<resytech-activity-list></resytech-activity-list>

<!-- Inline booking embed (hidden initially) -->
<div id="booking-section" style="display: none;">
  <resytech-booking-embed id="embed"
    base-url="https://yourlocation.bookingui.com"
    location-id="your-location-id">
  </resytech-booking-embed>
</div>

<script>
  document.addEventListener('activity-select', (e) => {
    const embed = document.getElementById('embed');
    embed.setAttribute('activity-id', e.detail.activity.uuid);
    embed.reload();
    document.getElementById('booking-section').style.display = 'block';
  });
</script>

Embed vs Modal Widget

Embed (<resytech-booking-embed>)Modal (ResytechClient)
PlacementInline in page flowFull-viewport overlay
Use caseDedicated booking pages"Book Now" buttons site-wide
TriggerAlways visible (or toggled)Opens on click / showUI()
Close buttonHidden by defaultAlways shown
ScrollPage scrolls naturallyModal has its own scroll

Reloading

Call .reload() to refresh the iframe with current attributes:

const embed = document.querySelector('resytech-booking-embed');
embed.setAttribute('activity-id', 'new-activity-uuid');
embed.reload();

On this page