Booking Experts data layer events

Full reference of GA4 and custom events, parameters, and sample payloads.

Pre-release notice: These docs reflect the schema that becomes active on 2 Mar 2026. Events marked active are part of that upcoming schema. Events marked deprecated are legacy payloads still emitted today and will stop after 2 Mar 2026.

Looking for setup guidance? See Booking Experts data layer overview.

Deprecated events: See Deprecated data layer events for legacy payloads and removals.

GA4 events

add_to_cart

A user adds items to the cart.

Statusactive
Typeevent
Available onBooking site
PortalsCheckout portal
FlowBooking site cart + checkout portal upgrades add

Triggered when a user adds one or more items to the cart on a booking site or adds extras/upgrades in the checkout portal.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#add_to_cart

If the add-to-cart action comes from availability search, a search snapshot is included (same shape as search_results_loaded.search).

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.
search{...} (see below)if availableobjectAvailability search snapshot for the add_to_cart action. Source: Website availability search state (dates, guests, amenities) when adding to cart.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the event. Source: Total order/booking value or sum of item prices.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaif availablega4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationif availablega4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcartif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCartif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
start_date2026-02-20if availablecustomThe date of arrival for availability. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date of departure for availability. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

search

Availability search snapshot for the add_to_cart action. Source: Website availability search state (dates, guests, amenities) when adding to cart.

Fields below apply only when search is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
start_date2026-02-20if availablecustomArrival date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search arrival date.
end_date2026-02-22if availablecustomDeparture date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search departure date.
nights2if availablecustomLength of stay in nights (null when dates are missing). Source: Derived from search dates or nights selector.
rentable_typehouseif availablecustomAccommodation semantic segment (house, pitch, room, berth, apartment, other). Source: Search rentable type segment.
price_range_min100if availablecustomMinimum total price. Source: Search price range minimum.
price_range_max500if availablecustomMaximum total price. Source: Search price range maximum.
sorting_idprice_ascif availablecustomSorting option id. Source: Search sorting choice.
amenities{...}if availablecustomAmenity facet id mapped to arrays of value ids. Source: Search amenity selections.
amenities_count2if availablecustomCount of active amenity selections (includes price range). Source: Number of active amenity selections plus price range.
has_resultstrueif availablecustomTrue when results_count > 0. Source: Derived from availability search results.
results_count42if availablecustomTotal result count (null when unknown). Source: Availability search total results.
special_period_id123if availablecustomSpecial period id when the search dates match a defined special period (selected or inferred). Source: Special period id.
special_period_nameSummer Holidayif availablecustomLocalized special period name when the search dates match a defined special period (selected or inferred). Source: Special period name.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Guest group from search form.
search.guest_group

Guest counts by group (see guest_group fields). Source: Guest group from search form.

Fields below apply only when search.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

Sample data layer snippet

dataLayer.push({"event":"add_to_cart","ecommerce":{"currency":"EUR","value":350.0,"items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"cart","item_list_name":"Cart","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]},"search":{"start_date":"2026-02-20","end_date":"2026-02-22","nights":2,"rentable_type":"house","guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"price_range_min":100,"price_range_max":500,"sorting_id":"price_asc","amenities":{"facility":["pool"]},"amenities_count":2,"has_results":true,"results_count":42,"special_period_id":123,"special_period_name":"Summer Holiday"}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

remove_from_cart

A user removes items from the cart.

Statusactive
Typeevent
Available onBooking site
PortalsCheckout portal
FlowBooking site cart + checkout portal upgrades remove

Triggered when a user removes one or more items from the cart on a booking site or removes extras/upgrades in the checkout portal.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#remove_from_cart

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the event. Source: Total order/booking value or sum of item prices.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaif availablega4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationif availablega4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcartif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCartif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
start_date2026-02-20if availablecustomThe date of arrival for availability. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date of departure for availability. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"remove_from_cart","ecommerce":{"currency":"EUR","value":350.0,"items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"cart","item_list_name":"Cart","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

view_cart

A user views their cart.

Statusactive
Typeevent
Available onBooking site
PortalsCheckout portal
FlowBooking site cart + checkout portal upgrades view

Triggered when a user views their cart on a booking site or reaches the upgrades step in the checkout portal.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#view_cart

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the cart. Source: Total order/booking value or sum of item prices.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcartif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCartif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
start_date2026-02-20if availablecustomThe date when the booking starts. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date when the booking ends. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"view_cart","ecommerce":{"currency":"EUR","value":350.0,"items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"cart","item_list_name":"Cart","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

begin_checkout

A user begins checkout.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal entry (stay step)

Triggered when a user begins checkout.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#begin_checkout

Source: checkout portal flow (PMS). This is emitted when the Stay step is shown.

If a CMS search snapshot cookie is present, a top-level search object is included.

Checkout portal emits a booking snapshot with totals and guest group counts (status = concept).

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.
search{...} (see below)if availableobjectAvailability search snapshot for the checkout action. Source: Availability search snapshot when checkout starts (shared from CMS via cookie).
booking{...} (see below)if availableobjectBooking snapshot with status concept and checkout totals. Source: Checkout portal booking summary.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the checkout. Source: Total order/booking value or sum of item prices.
couponSUMMER10if availablega4Coupon code applied to the checkout. Source: Applied coupon codes for the booking/reservation, comma-separated when multiple.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcheckoutif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCheckoutif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
start_date2026-02-20if availablecustomThe date when the booking starts. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date when the booking ends. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

search

Availability search snapshot for the checkout action. Source: Availability search snapshot when checkout starts (shared from CMS via cookie).

Fields below apply only when search is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
start_date2026-02-20if availablecustomArrival date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search arrival date.
end_date2026-02-22if availablecustomDeparture date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search departure date.
nights2if availablecustomLength of stay in nights (null when dates are missing). Source: Derived from search dates or nights selector.
rentable_typehouseif availablecustomAccommodation semantic segment (house, pitch, room, berth, apartment, other). Source: Search rentable type segment.
price_range_min100if availablecustomMinimum total price. Source: Search price range minimum.
price_range_max500if availablecustomMaximum total price. Source: Search price range maximum.
sorting_idprice_ascif availablecustomSorting option id. Source: Search sorting choice.
amenities{...}if availablecustomAmenity facet id mapped to arrays of value ids. Source: Search amenity selections.
amenities_count2if availablecustomCount of active amenity selections (includes price range). Source: Number of active amenity selections plus price range.
has_resultstrueif availablecustomTrue when results_count > 0. Source: Derived from availability search results.
results_count42if availablecustomTotal result count (null when unknown). Source: Availability search total results.
special_period_id123if availablecustomSpecial period id when the search dates match a defined special period (selected or inferred). Source: Special period id.
special_period_nameSummer Holidayif availablecustomLocalized special period name when the search dates match a defined special period (selected or inferred). Source: Special period name.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Guest group from search form.
search.guest_group

Guest counts by group (see guest_group fields). Source: Guest group from search form.

Fields below apply only when search.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

booking

Booking snapshot with status concept and checkout totals. Source: Checkout portal booking summary.

Fields below apply only when booking is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
statusbookedif availablecustomBooking lifecycle status (concept/option/booked/cancelled). Source: Checkout portal status override or booking state from PMS.
finaltrueif availablecustomTrue when the booking is confirmed or imported. Source: Confirmed/imported flag from PMS.
currencyEURif availablega4Booking currency (ISO 4217). Source: Booking currency.
total350if availablecustomSum of all guest order items. Source: Total of guest debtor items.
base_rent_total350if availablecustomBase rent (accommodation rent) order items. Source: Base rent total.
upgrade_total0if availablecustomUpgrade order items (bundles/extras), excluding deposits. Source: Upgrade extras total.
preference_total0if availablecustomPreference order items (amenities/preferences). Source: Preference items total.
deposit_total0if availablecustomReservation deposit order items (non-deferred). Source: Deposit total.
deferred_deposit_total0if availablecustomReservation deposit order items marked deferred. Source: Deferred deposit total.
security_deposit_total0if availablecustomSecurity deposits (borg), from security deposit policies. Source: Security deposit total.
tourist_taxes_total0if availablecustomTourist tax order items. Source: Tourist taxes total.
vat_total50if availablecustomVAT total for guest debtor items. Source: VAT total.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.
booking.guest_group

Guest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.

Fields below apply only when booking.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

Sample data layer snippet

dataLayer.push({"event":"begin_checkout","ecommerce":{"currency":"EUR","value":350.0,"coupon":"SUMMER10","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"checkout","item_list_name":"Checkout","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]},"search":{"start_date":"2026-02-20","end_date":"2026-02-22","nights":2,"rentable_type":"house","guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"price_range_min":100,"price_range_max":500,"sorting_id":"price_asc","amenities":{"facility":["pool"]},"amenities_count":2,"has_results":true,"results_count":42,"special_period_id":123,"special_period_name":"Summer Holiday"},"booking":{"status":"concept","final":false,"guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"currency":"EUR","total":350,"base_rent_total":350,"upgrade_total":0,"preference_total":0,"deposit_total":0,"deferred_deposit_total":0,"security_deposit_total":0,"tourist_taxes_total":0,"vat_total":50}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

We do not auto-clear booking. If you map booking outside booking events, clear it manually with dataLayer.push({ booking: null }).

add_shipping_info

A user submits guest details during checkout.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal guest details step

Triggered after a user successfully submits the details step during checkout.

Emitted when the confirmation step is loaded directly after the details form submit.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#add_shipping_info

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the checkout. Source: Total order/booking value or sum of item prices.
couponSUMMER10if availablega4Coupon code applied to the checkout. Source: Applied coupon codes for the booking/reservation, comma-separated when multiple.
shipping_tierStandardif availablega4Shipping tier selected by the user. Source: Not used in our PMS flows.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcheckoutif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCheckoutif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
start_date2026-02-20if availablecustomThe date when the booking starts. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date when the booking ends. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"add_shipping_info","ecommerce":{"currency":"EUR","value":350.0,"coupon":"SUMMER10","shipping_tier":"Standard","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"checkout","item_list_name":"Checkout","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

add_payment_info

A user selects a payment method during checkout.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal confirm step (payment selection)

Triggered when a user selects a payment method during checkout.

Emitted when the user selects a payment method in the payment portal.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#add_payment_info

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the checkout. Source: Total order/booking value or sum of item prices.
couponSUMMER10if availablega4Coupon code applied to the checkout. Source: Applied coupon codes for the booking/reservation, comma-separated when multiple.
payment_typeidealalwaysga4

Payment method selected by the user.

  • creditcard
  • ideal
  • paypal
  • applepay
  • bancontact
  • banktransfer
  • sofort

Source: Payment method kind from the payment portal.

items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcheckoutif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCheckoutif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
start_date2026-02-20if availablecustomThe date when the booking starts. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date when the booking ends. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"add_payment_info","ecommerce":{"currency":"EUR","value":350.0,"coupon":"SUMMER10","payment_type":"ideal","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"checkout","item_list_name":"Checkout","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

purchase

A user completes a purchase.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal after payment success

Triggered when a user completes a purchase.

Emitted on the checkout portal after returning from the payment portal with a success status.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#purchase

  • transaction_id uses the booking number in PMS (non-PII).
  • customer_type is derived from prior bookings in the last 540 days when a contact is known.

Additional booking metadata can be included at the top level under booking (booking.status reflects the booking state).

Checkout portal includes portal_settings to analyze required fields impact on conversion.

Affiliate payouts should generally use booking.base_rent_total to exclude upgrades and deposits.

If marketing consent is granted, include user_data with hashed identifiers.

No address fields are sent.

If a CMS search snapshot cookie is present, a top-level search object is included.

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.
search{...} (see below)if availableobjectAvailability search snapshot for the purchase. Source: Availability search snapshot shared from CMS via cookie.
booking{...} (see below)if availableobjectBooking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.
portal_settings{...} (see below)if availableobjectCheckout portal settings snapshot (enabled/required fields and contact toggles). Source: Organization checkout portal settings.
user_data{...} (see below)if availableobjectHashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
transaction_idORDER-123alwaysga4Unique transaction ID. Source: Booking reference/number.
affiliationAdministration Nameif availablecustomAffiliation or brand for the purchase. Source: Administration/site name used for reporting.
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Total value of the purchase. Source: Total order/booking value or sum of item prices.
customer_typenewif availablecustomWhether the customer is new or returning ("new" or "returning"). PMS uses a 540-day lookback window. Source: New vs returning based on booking history within 540 days.
payment_typeidealif availablega4Payment method used for the booking. Source: Payment method kind from the payment portal.
tax20.0if availablega4Total tax amount. Source: Not sent separately; tax is included in totals.
shipping0.0if availablega4Shipping amount. Source: Not used in our PMS flows.
couponSUMMER10if availablega4Coupon code applied to the purchase. Source: Applied coupon codes for the booking/reservation, comma-separated when multiple.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_list_idcheckoutif availablega4ID of the list where the item is shown. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameCheckoutif availablega4Name of the list where the item is shown. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.
item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
start_date2026-02-20if availablecustomThe date when the booking starts. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date when the booking ends. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

search

Availability search snapshot for the purchase. Source: Availability search snapshot shared from CMS via cookie.

Fields below apply only when search is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
start_date2026-02-20if availablecustomArrival date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search arrival date.
end_date2026-02-22if availablecustomDeparture date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search departure date.
nights2if availablecustomLength of stay in nights (null when dates are missing). Source: Derived from search dates or nights selector.
rentable_typehouseif availablecustomAccommodation semantic segment (house, pitch, room, berth, apartment, other). Source: Search rentable type segment.
price_range_min100if availablecustomMinimum total price. Source: Search price range minimum.
price_range_max500if availablecustomMaximum total price. Source: Search price range maximum.
sorting_idprice_ascif availablecustomSorting option id. Source: Search sorting choice.
amenities{...}if availablecustomAmenity facet id mapped to arrays of value ids. Source: Search amenity selections.
amenities_count2if availablecustomCount of active amenity selections (includes price range). Source: Number of active amenity selections plus price range.
has_resultstrueif availablecustomTrue when results_count > 0. Source: Derived from availability search results.
results_count42if availablecustomTotal result count (null when unknown). Source: Availability search total results.
special_period_id123if availablecustomSpecial period id when the search dates match a defined special period (selected or inferred). Source: Special period id.
special_period_nameSummer Holidayif availablecustomLocalized special period name when the search dates match a defined special period (selected or inferred). Source: Special period name.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Guest group from search form.
search.guest_group

Guest counts by group (see guest_group fields). Source: Guest group from search form.

Fields below apply only when search.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

booking

Booking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.

Fields below apply only when booking is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
statusbookedif availablecustomBooking lifecycle status (concept/option/booked/cancelled). Source: Checkout portal status override or booking state from PMS.
finaltrueif availablecustomTrue when the booking is confirmed or imported. Source: Confirmed/imported flag from PMS.
currencyEURif availablega4Booking currency (ISO 4217). Source: Booking currency.
total350if availablecustomSum of all guest order items. Source: Total of guest debtor items.
base_rent_total350if availablecustomBase rent (accommodation rent) order items. Source: Base rent total.
upgrade_total0if availablecustomUpgrade order items (bundles/extras), excluding deposits. Source: Upgrade extras total.
preference_total0if availablecustomPreference order items (amenities/preferences). Source: Preference items total.
deposit_total0if availablecustomReservation deposit order items (non-deferred). Source: Deposit total.
deferred_deposit_total0if availablecustomReservation deposit order items marked deferred. Source: Deferred deposit total.
security_deposit_total0if availablecustomSecurity deposits (borg), from security deposit policies. Source: Security deposit total.
tourist_taxes_total0if availablecustomTourist tax order items. Source: Tourist taxes total.
vat_total50if availablecustomVAT total for guest debtor items. Source: VAT total.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.
booking.guest_group

Guest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.

Fields below apply only when booking.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

portal_settings

Checkout portal settings snapshot (enabled/required fields and contact toggles). Source: Organization checkout portal settings.

Fields below apply only when portal_settings is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
fields[...]if availablecustomEnabled checkout portal fields. Source: Organization checkout portal field configuration.
required_fields[...]if availablecustomRequired checkout portal fields. Source: Organization required checkout portal fields.
optional_fields[...]if availablecustomOptional checkout portal fields. Source: Organization optional checkout portal fields.
fields_count5if availablecustomCount of enabled fields. Source: Derived from portal settings fields list.
required_fields_count3if availablecustomCount of required fields. Source: Derived from portal settings required fields list.
optional_fields_count2if availablecustomCount of optional fields. Source: Derived from portal settings optional fields list.
override_default_fieldstrueif availablecustomTrue when checkout portal field defaults are overridden. Source: Organization override flag.
license_plates_enabledtrueif availablecustomTrue when the checkout portal license plates step is enabled. Source: Organization + park settings.
phone_enabledtrueif availablecustomTrue when phone contact method is enabled. Source: Organization checkout portal settings.
email_enabledtrueif availablecustomTrue when email contact method is enabled. Source: Organization checkout portal settings.
whatsapp_enabledfalseif availablecustomTrue when WhatsApp contact method is enabled. Source: Organization checkout portal settings.

user_data

Hashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

Fields below apply only when user_data is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
sha256_email_address...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed email (marketing consent required).
sha256_phone_number...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed phone number (marketing consent required).

Sample data layer snippet

dataLayer.push({"event":"purchase","ecommerce":{"transaction_id":"ORDER-123","affiliation":"Administration Name","currency":"EUR","value":350.0,"customer_type":"new","payment_type":"ideal","tax":20.0,"shipping":0.0,"coupon":"SUMMER10","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_list_id":"checkout","item_list_name":"Checkout","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","price":350.0,"quantity":1,"discount":25.0,"coupon":"SUMMER10","index":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental"}]},"search":{"start_date":"2026-02-20","end_date":"2026-02-22","nights":2,"rentable_type":"house","guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"price_range_min":100,"price_range_max":500,"sorting_id":"price_asc","amenities":{"facility":["pool"]},"amenities_count":2,"has_results":true,"results_count":42,"special_period_id":123,"special_period_name":"Summer Holiday"},"booking":{"status":"booked","final":true,"guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"currency":"EUR","total":350,"base_rent_total":350,"upgrade_total":0,"preference_total":0,"deposit_total":0,"deferred_deposit_total":0,"security_deposit_total":0,"tourist_taxes_total":0,"vat_total":50},"portal_settings":{"fields":["first_name","last_name","email","phone","note"],"required_fields":["first_name","last_name","email"],"optional_fields":["phone","note"],"fields_count":5,"required_fields_count":3,"optional_fields_count":2,"override_default_fields":true,"license_plates_enabled":true,"phone_enabled":true,"email_enabled":true,"whatsapp_enabled":false},"user_data":{"sha256_email_address":"...","sha256_phone_number":"..."}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

We do not auto-clear booking. If you map booking outside booking events, clear it manually with dataLayer.push({ booking: null }).

generate_lead

A lead is generated.

Statusactive
Typeevent
Available onSales site
PortalsCheckout portal
FlowSales inquiry or checkout portal booking option

Triggered when a lead is generated (for example, a booking option or a sales form with a priced property).

Checkout portal booking options emit this after the option is created.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#generate_lead

Additional booking metadata can be included under booking (booking.status = option).

CMS sales forms: we only emit generate_lead when a property price and site currency are available, so value and currency are always present.

If marketing consent is granted, include user_data with hashed identifiers.

No address fields are sent.

Top-level parameters

ParameterSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the lead value, in 3-letter ISO 4217 format. Source: Checkout portal: booking currency. CMS sales forms: site default currency.
value350.0alwaysga4Monetary value of the lead. Source: Checkout portal: total order/booking value. CMS sales forms: selected property price.
lead_sourceWebsiteif availablecustomSource of the lead. Source: Checkout portal: booking traffic source name. CMS sales forms: form name.
lead_idlead-123if availablecustomStable lead identifier for deduplication and marketing event_id. Source: Checkout portal booking number or CMS lead identifier.
booking{...} (see below)if availableobjectBooking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.
user_data{...} (see below)if availableobjectHashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

booking

Booking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.

Fields below apply only when booking is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
statusbookedif availablecustomBooking lifecycle status (concept/option/booked/cancelled). Source: Checkout portal status override or booking state from PMS.
finaltrueif availablecustomTrue when the booking is confirmed or imported. Source: Confirmed/imported flag from PMS.
currencyEURif availablega4Booking currency (ISO 4217). Source: Booking currency.
total350if availablecustomSum of all guest order items. Source: Total of guest debtor items.
base_rent_total350if availablecustomBase rent (accommodation rent) order items. Source: Base rent total.
upgrade_total0if availablecustomUpgrade order items (bundles/extras), excluding deposits. Source: Upgrade extras total.
preference_total0if availablecustomPreference order items (amenities/preferences). Source: Preference items total.
deposit_total0if availablecustomReservation deposit order items (non-deferred). Source: Deposit total.
deferred_deposit_total0if availablecustomReservation deposit order items marked deferred. Source: Deferred deposit total.
security_deposit_total0if availablecustomSecurity deposits (borg), from security deposit policies. Source: Security deposit total.
tourist_taxes_total0if availablecustomTourist tax order items. Source: Tourist taxes total.
vat_total50if availablecustomVAT total for guest debtor items. Source: VAT total.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.
booking.guest_group

Guest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.

Fields below apply only when booking.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

user_data

Hashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

Fields below apply only when user_data is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
sha256_email_address...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed email (marketing consent required).
sha256_phone_number...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed phone number (marketing consent required).

Sample data layer snippet

dataLayer.push({"event":"generate_lead","currency":"EUR","value":350.0,"lead_source":"Website","lead_id":"lead-123","booking":{"status":"option","final":false,"guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"currency":"EUR","total":350,"base_rent_total":350,"upgrade_total":0,"preference_total":0,"deposit_total":0,"deferred_deposit_total":0,"security_deposit_total":0,"tourist_taxes_total":0,"vat_total":50},"user_data":{"sha256_email_address":"...","sha256_phone_number":"..."}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

We do not auto-clear booking. If you map booking outside booking events, clear it manually with dataLayer.push({ booking: null }).

close_convert_lead

A lead is converted and closed.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal option confirmation

Triggered when a lead is converted and closed (for example, an option confirmation).

Checkout portal option confirmations emit this after the option is finalized.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#close_convert_lead

Additional booking metadata can be included under booking (booking.status reflects the booking state).

If marketing consent is granted, include user_data with hashed identifiers.

No address fields are sent.

Top-level parameters

ParameterSamplePresenceTypeDescription
currencyEURalwaysga4Currency of the lead value, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwaysga4Monetary value of the lead conversion. Source: Total order/booking value or sum of item prices.
lead_idlead-123if availablecustomStable lead identifier for deduplication and marketing event_id. Source: Checkout portal booking number or CMS lead identifier.
booking{...} (see below)if availableobjectBooking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.
user_data{...} (see below)if availableobjectHashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

booking

Booking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.

Fields below apply only when booking is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
statusbookedif availablecustomBooking lifecycle status (concept/option/booked/cancelled). Source: Checkout portal status override or booking state from PMS.
finaltrueif availablecustomTrue when the booking is confirmed or imported. Source: Confirmed/imported flag from PMS.
currencyEURif availablega4Booking currency (ISO 4217). Source: Booking currency.
total350if availablecustomSum of all guest order items. Source: Total of guest debtor items.
base_rent_total350if availablecustomBase rent (accommodation rent) order items. Source: Base rent total.
upgrade_total0if availablecustomUpgrade order items (bundles/extras), excluding deposits. Source: Upgrade extras total.
preference_total0if availablecustomPreference order items (amenities/preferences). Source: Preference items total.
deposit_total0if availablecustomReservation deposit order items (non-deferred). Source: Deposit total.
deferred_deposit_total0if availablecustomReservation deposit order items marked deferred. Source: Deferred deposit total.
security_deposit_total0if availablecustomSecurity deposits (borg), from security deposit policies. Source: Security deposit total.
tourist_taxes_total0if availablecustomTourist tax order items. Source: Tourist taxes total.
vat_total50if availablecustomVAT total for guest debtor items. Source: VAT total.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.
booking.guest_group

Guest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.

Fields below apply only when booking.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

user_data

Hashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

Fields below apply only when user_data is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
sha256_email_address...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed email (marketing consent required).
sha256_phone_number...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed phone number (marketing consent required).

Sample data layer snippet

dataLayer.push({"event":"close_convert_lead","currency":"EUR","value":350.0,"lead_id":"lead-123","booking":{"status":"booked","final":true,"guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"currency":"EUR","total":350,"base_rent_total":350,"upgrade_total":0,"preference_total":0,"deposit_total":0,"deferred_deposit_total":0,"security_deposit_total":0,"tourist_taxes_total":0,"vat_total":50},"user_data":{"sha256_email_address":"...","sha256_phone_number":"..."}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

We do not auto-clear booking. If you map booking outside booking events, clear it manually with dataLayer.push({ booking: null }).

view_item_list

A user is presented with a list of items.

Statusactive
Typeevent
Available onSales site, Booking site
FlowListings or availability results

We measure rentable types (items) being presented to the user for certain dates and a certain price (availability) by sending a view_item_list event with the relevant rentable types in an items array. This event is triggered when a website visitor searches for availabilities by entering information like arrival date, departure date guest group, required amenities, etc.

The same event can be used for sales module listings (properties) by supplying the property items as the list items.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#view_item_list

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_list_idavailability_searchalwaysga4The list ID for the results. Source: Website search list id (availability_search or property_search).
item_list_nameAvailability Searchalwaysga4The list name for the results. Source: Website search list name (Availability search or Property search).
currencyEURalwaysga4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
start_date2026-02-20if availablecustomThe date of arrival for availability. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date of departure for availability. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.
index1if availablega4The position of the item in the list. Source: Position in the result list (website search only).

Sample data layer snippet

dataLayer.push({"event":"view_item_list","ecommerce":{"item_list_id":"availability_search","item_list_name":"Availability Search","currency":"EUR","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental","index":1}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

select_item

A user selects an item from a list.

Statusactive
Typeevent
Available onSales site, Booking site
FlowListing click to detail

Triggered when a user selects an item from a list (for example, clicking an accommodation card on the listing page).

This is the list click; the detail page view is tracked with view_item.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#select_item

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_list_idavailability_searchalwaysga4The list ID for the results. Source: Website search list id (availability_search or property_search).
item_list_nameAvailability Searchalwaysga4The list name for the results. Source: Website search list name (Availability search or Property search).
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
start_date2026-02-20if availablecustomThe date of arrival for availability. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date of departure for availability. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.
index1if availablega4The position of the item in the list. Source: Position in the result list (website search only).
item_list_idavailability_searchalwaysga4The list ID for the item. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameAvailability Searchalwaysga4The list name for the item. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.

Sample data layer snippet

dataLayer.push({"event":"select_item","ecommerce":{"item_list_id":"availability_search","item_list_name":"Availability Search","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental","index":1,"item_list_id":"availability_search","item_list_name":"Availability Search"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

view_item

A user views an item detail.

Statusactive
Typeevent
Available onSales site, Booking site
FlowProperty/rentable detail page

Triggered when a user views an item detail page.

Used for rentable detail pages and sales module property detail pages.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#view_item

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
currencyEURif availablega4Currency of the items associated with the event, in 3-letter ISO 4217 format. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0if availablega4Total value of the event. Source: Total order/booking value or sum of item prices.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123alwaysga4The ID of the rentable type. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaalwaysga4The name of the rentable type. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
item_brandAdministration Nameif availablega4The localized name of the site. Source: Checkout portal: administration name. Website search: site/brand name shown on the website (can differ from the administration name).
item_categoryAccommodationalwaysga4

Top-level item type.

  • Accommodation
  • Upgrade
  • Preference
  • Package

Source: Checkout portal: Accommodation for rentable types, Upgrade for extras, Preference for amenities/preferences, Package for bundles. Website search: Accommodation.

item_category2houseif availablega4

Semantic segment for accommodations or sub-bucket for extras.

Accommodation: house pitch room berth apartment other
Extras: Amenity Upgrade Package

Source: Checkout portal: accommodation semantic segment or extras bucket. Website search: accommodation semantic segment.

item_category3if availablega4

PMS extra type for extras only.

  • tourist_taxes
  • cleaning
  • parking

Source: Checkout portal extras only: cost extra_type. Not set for accommodations, packages, or website search.

item_variantsingle_nightif availablega4

Stay duration category for the accommodation.

  • single_night - 1 night
  • weekend - 2-3 nights incl weekend
  • midweek - 2-4 nights without weekend
  • week - 6-8 nights or 5 nights incl weekend
  • extended_stay - 9-13 nights
  • long_stay - 14+ nights

Source: Checkout portal accommodations and CMS availability items; derived from arrival/departure.

item_countryNetherlandsif availablecustomThe country where the administration is located. Source: Administration country from BEX (shared across checkout portal and website search).
item_regionTwenteif availablecustomThe region where the administration is located. Source: Administration region from BEX (shared across checkout portal and website search).
item_cityEnschedeif availablecustomThe city where the administration is located. Source: Administration city from BEX (shared across checkout portal and website search).
administration_id321321if availablecustomThe ID of the administration in BEX PMS. Source: Checkout portal: BEX administration id. Website search: the same BEX administration id (Booking Experts administration mapping).
administration_nameAdministration Nameif availablecustomThe name of the administration in BEX PMS. Source: Checkout portal: BEX administration name. Website search: the same BEX administration name (Booking Experts administration mapping).
couponSUMMER10if availablega4Coupon applied to the item. Source: Coupon code applied to the reservation or order item (first code, if any).
discount25.0if availablega4Discount applied to the item. Source: Discount amount for the order item.
price350.0if availablega4

Price for the item line (stay total for accommodation).

Source: Website search: availability/property price for the stay. Checkout portal: order item unit price; accommodation uses stay total derived from booking total minus upgrades.

quantity1if availablega4Quantity of the item. Source: Order item quantity; otherwise 1.
index1if availablega4Position of the item in the list. Source: Position in the result list (website search only).
start_date2026-02-20if availablecustomThe date of arrival for availability. Source: Stay arrival date or availability start date.
end_date2026-02-22if availablecustomThe date of departure for availability. Source: Stay departure date or availability end date.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.
item_list_idavailability_searchif availablega4The list ID for the item. Source: Website search list id (availability_search/property_search). Cart/checkout events may supply list id like Cart or Checkout.
item_list_nameAvailability Searchif availablega4The list name for the item. Source: Website search list name (Availability search/Property search). Cart/checkout events may supply list name like Cart or Checkout.

Sample data layer snippet

dataLayer.push({"event":"view_item","ecommerce":{"currency":"EUR","value":350.0,"items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","item_brand":"Administration Name","item_category":"Accommodation","item_category2":"house","item_variant":"single_night","item_country":"Netherlands","item_region":"Twente","item_city":"Enschede","administration_id":"321321","administration_name":"Administration Name","coupon":"SUMMER10","discount":25.0,"price":350.0,"quantity":1,"index":1,"start_date":"2026-02-20","end_date":"2026-02-22","google_business_vertical":"hotel_rental","item_list_id":"availability_search","item_list_name":"Availability Search"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

view_promotion

A user views a promotion.

Statusactive
Typeevent
Available onBooking site
PortalsCheckout portal
FlowCheckout portal promotion impression

Triggered when a promotion is viewed or impressed.

Emitted in the checkout portal for discount card impressions.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#view_promotion

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
promotion_idpromo_123alwaysga4Promotion ID. Source: Promotion id (discount, package, or discount card).
promotion_nameSummer Salealwaysga4Promotion name. Source: Promotion name (discount, package, or discount card).
creative_nameHero Bannerif availablega4Creative name for the promotion. Source: Promotion creative name (banner/asset name) when provided.
creative_slothomepage_heroif availablega4Creative slot or placement. Source: Promotion placement/slot identifier when provided.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123if availablega4The ID of the promoted item. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaif availablega4The name of the promoted item. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"view_promotion","ecommerce":{"promotion_id":"promo_123","promotion_name":"Summer Sale","creative_name":"Hero Banner","creative_slot":"homepage_hero","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

select_promotion

A user selects a promotion.

Statusactive
Typeevent
Available onBooking site
PortalsCheckout portal
FlowBooking site promotions (availability or checkout portal)

Triggered when a promotion is selected (clicked).

Emitted for availability-search promotions and checkout portal discounts.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#select_promotion

Top-level objects

ParameterSamplePresenceTypeDescription
ecommerce{...} (see below)alwaysobjectEcommerce payload wrapper for GA4 events.

ecommerce

Ecommerce payload wrapper for GA4 events.

Fields below apply only when ecommerce is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
promotion_idpromo_123alwaysga4Promotion ID. Source: Promotion id (discount, package, or discount card).
promotion_nameSummer Salealwaysga4Promotion name. Source: Promotion name (discount, package, or discount card).
creative_nameHero Bannerif availablega4Creative name for the promotion. Source: Promotion creative name (banner/asset name) when provided.
creative_slothomepage_heroif availablega4Creative slot or placement. Source: Promotion placement/slot identifier when provided.
items[][...] (see below)alwaysobject[]Items array for the ecommerce payload.
ecommerce.items[]

Items array for the ecommerce payload.

Fields below apply only when ecommerce.items[] is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
item_id123123if availablega4The ID of the promoted item. Source: Checkout portal: accommodation type id, extra cost id, bundle id, or amenity id. Website search: category id or property id. Promotions: discount/package id (different entities).
item_name4-Person Luxury Villaif availablega4The name of the promoted item. Source: Checkout portal: accommodation type name, extra name, bundle name, or amenity name. Website search: localized category/property name. Promotions: promotion name.
google_business_verticalhotel_rentalif availablecustomGoogle Ads business vertical for dynamic remarketing (examples: "hotel_rental", "retail"). Source: Remarketing business vertical configured globally; not from booking data.

Sample data layer snippet

dataLayer.push({"event":"select_promotion","ecommerce":{"promotion_id":"promo_123","promotion_name":"Summer Sale","creative_name":"Hero Banner","creative_slot":"homepage_hero","items":[{"item_id":"123123","item_name":"4-Person Luxury Villa","google_business_vertical":"hotel_rental"}]}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

Clear ecommerce before every ecommerce event to avoid reusing items: dataLayer.push({ ecommerce: null });

view_search_results

A user views search results.

Statusactive
Typeevent
Available onSales site, Booking site
FlowSite search results

Triggered when a user views search results.

Emitted by the CMS site search page after a query is submitted.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#view_search_results

Top-level parameters

ParameterSamplePresenceTypeDescription
search_termsummer holidayalwaysga4The search term entered by the user. Source: Search query entered by the guest.

Sample data layer snippet

dataLayer.push({"event":"view_search_results","search_term":"summer holiday"});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

search

A user performs a search.

Statusactive
Typeevent
Available onSales site, Booking site
FlowSite search query

Triggered when a user performs a search.

Emitted by the CMS site search page when a query is present.

GA4 docs: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag#search

Current search event payload

window.dataLayer = window.dataLayer || [];window.dataLayer.push({  "event": "search",  "search_term": "summer holiday"});

Legacy search payload (deprecated)

window.dataLayer = window.dataLayer || [];window.dataLayer.push({  "event": "search",  "search_term": "summer holiday",  "result_count": 42});

Top-level parameters

ParameterSamplePresenceTypeStatusDescription
search_termsummer holidayalwaysga4The term that was searched for. Source: Search query entered by the guest.
result_count42if availablecustomdeprecated (removal 2 Mar 2026)Legacy search result count. Source: CMS search result size.

Custom events

search_results_loaded

Availability search results are rendered.

Statusactive
Typeevent
Available onBooking site
FlowAvailability search results loaded

Custom event for the availability Search + Booking flow.

Emitted by CMS availability search results on booking sites.

Emitted when results are rendered or an availability API response is accepted for the current search.

All events include a full search snapshot including the results summary (has_results/results_count). Unknown values are null.

Dates are YYYY-MM-DD; currency is ISO 4217; numeric values are numbers.

This is the primary availability search tracking event; it captures both the search inputs and whether results were found.

We emit it on initial availability search loads and on subsequent amenity updates (search intent tracking).

Use it together with cart/checkout events in GA4 to understand which searches led to bookings (session/user attribution).

Only fire when results match the current search (use a request id if multiple calls are in-flight).

Payload: event + search.

Top-level objects

ParameterSamplePresenceTypeDescription
search{...} (see below)alwaysobjectFull search snapshot including results summary. Source: Website search snapshot (dates, guests, amenities, sorting, price range, results).

search

Full search snapshot including results summary. Source: Website search snapshot (dates, guests, amenities, sorting, price range, results).

Fields below apply only when search is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
start_date2026-02-20if availablecustomArrival date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search arrival date.
end_date2026-02-22if availablecustomDeparture date for the availability search (YYYY-MM-DD, null when missing). Source: Website availability search departure date.
nights2if availablecustomLength of stay in nights (null when dates are missing). Source: Derived from search dates or nights selector.
rentable_typehouseif availablecustomAccommodation semantic segment (house, pitch, room, berth, apartment, other). Source: Search rentable type segment.
price_range_min100if availablecustomMinimum total price. Source: Search price range minimum.
price_range_max500if availablecustomMaximum total price. Source: Search price range maximum.
sorting_idprice_ascif availablecustomSorting option id. Source: Search sorting choice.
amenities{...}if availablecustomAmenity facet id mapped to arrays of value ids. Source: Search amenity selections.
amenities_count2if availablecustomCount of active amenity selections (includes price range). Source: Number of active amenity selections plus price range.
has_resultstrueif availablecustomTrue when results_count > 0. Source: Derived from availability search results.
results_count42if availablecustomTotal result count (null when unknown). Source: Availability search total results.
special_period_id123if availablecustomSpecial period id when the search dates match a defined special period (selected or inferred). Source: Special period id.
special_period_nameSummer Holidayif availablecustomLocalized special period name when the search dates match a defined special period (selected or inferred). Source: Special period name.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Guest group from search form.
search.guest_group

Guest counts by group (see guest_group fields). Source: Guest group from search form.

Fields below apply only when search.guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

Sample data layer snippet

dataLayer.push({"event":"search_results_loaded","search":{"start_date":"2026-02-20","end_date":"2026-02-22","nights":2,"rentable_type":"house","guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"price_range_min":100,"price_range_max":500,"sorting_id":"price_asc","amenities":{"facility":["pool"]},"amenities_count":2,"has_results":true,"results_count":42,"special_period_id":123,"special_period_name":"Summer Holiday"}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

checkout_progress

Checkout portal progress update.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal progress updates (step load + guest group/license plates)

Custom checkout portal event emitted on each checkout step and when guests update checkout details.

Emitted when the guest group or license plate details change, and when a step is loaded.

Payload: event + step + step_number + guest_group + license plate summary + portal_settings.

Top-level parameters

ParameterSamplePresenceTypeDescription
stepstayalwayscustomNormalized checkout step (stay/upgrades/details/confirm). Source: Checkout portal step context.
step_number1alwayscustomCheckout step number (1=stay, 2=upgrades, 3=details, 4=confirm). Source: Checkout portal step context.
license_plates_count1if availablecustomNumber of non-empty license plates entered. Source: Checkout portal reservation license plates.
available_parking_spots2if availablecustomNumber of parking spots available for the reservation. Source: Rentable type parking spots.
guest_group{...} (see below)if availableobjectGuest counts by group (see guest_group fields). Source: Checkout portal reservation guest group.
portal_settings{...} (see below)if availableobjectCheckout portal settings snapshot (fields and contact toggles). Source: Organization checkout portal settings.

guest_group

Guest counts by group (see guest_group fields). Source: Checkout portal reservation guest group.

Fields below apply only when guest_group is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
seniors0alwayscustomNumber of seniors. Source: Guest group seniors count.
adults2alwayscustomNumber of adults. Source: Guest group adults count.
adolescents0alwayscustomNumber of adolescents. Source: Guest group adolescents count.
children1alwayscustomNumber of children. Source: Guest group children count.
babies0alwayscustomNumber of babies. Source: Guest group babies count.
pets0alwayscustomNumber of pets. Source: Guest group pets count.
total3alwayscustomTotal guests (sum of guest group counts). Source: Guest group total.

portal_settings

Checkout portal settings snapshot (fields and contact toggles). Source: Organization checkout portal settings.

Fields below apply only when portal_settings is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
fields[...]if availablecustomEnabled checkout portal fields. Source: Organization checkout portal field configuration.
required_fields[...]if availablecustomRequired checkout portal fields. Source: Organization required checkout portal fields.
optional_fields[...]if availablecustomOptional checkout portal fields. Source: Organization optional checkout portal fields.
fields_count5if availablecustomCount of enabled fields. Source: Derived from portal settings fields list.
required_fields_count3if availablecustomCount of required fields. Source: Derived from portal settings required fields list.
optional_fields_count2if availablecustomCount of optional fields. Source: Derived from portal settings optional fields list.
override_default_fieldstrueif availablecustomTrue when checkout portal field defaults are overridden. Source: Organization override flag.
license_plates_enabledtrueif availablecustomTrue when the checkout portal license plates step is enabled. Source: Organization + park settings.
phone_enabledtrueif availablecustomTrue when phone contact method is enabled. Source: Organization checkout portal settings.
email_enabledtrueif availablecustomTrue when email contact method is enabled. Source: Organization checkout portal settings.
whatsapp_enabledfalseif availablecustomTrue when WhatsApp contact method is enabled. Source: Organization checkout portal settings.

Sample data layer snippet

dataLayer.push({"event":"checkout_progress","step":"stay","step_number":1,"license_plates_count":1,"available_parking_spots":2,"guest_group":{"seniors":0,"adults":2,"adolescents":0,"children":1,"babies":0,"pets":0,"total":3},"portal_settings":{"fields":["first_name","last_name","email","phone","note"],"required_fields":["first_name","last_name","email"],"optional_fields":["phone","note"],"fields_count":5,"required_fields_count":3,"optional_fields_count":2,"override_default_fields":true,"license_plates_enabled":true,"phone_enabled":true,"email_enabled":true,"whatsapp_enabled":false}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

form_start

A user starts interacting with a form.

Statusactive
Typeevent
Available onSales site, Booking site
FlowSite form start (sales or booking)

Triggered the first time a user interacts with a form in a session.

Emitted by CMS forms on the website (sales or booking sites).

GA4 docs: https://support.google.com/analytics/answer/9216061

Note: To use form parameters in GA4 reports, configure custom dimensions.

Top-level parameters

ParameterSamplePresenceTypeDescription
form_id42alwayscustomCMS form id. Source: Website form model id.
form_nameContact FormalwayscustomHTML name attribute of the <form> element. Source: Website form name.
form_destination/forms/responsesalwayscustomURL the form submits to. Source: Website form submit URL.

Sample data layer snippet

dataLayer.push({"event":"form_start","form_id":"42","form_name":"Contact Form","form_destination":"/forms/responses"});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

form_submit

A user submits a form.

Statusactive
Typeevent
Available onSales site, Booking site
FlowSite form submit (sales or booking)

Triggered when a user submits a form.

Emitted by CMS forms on the website (sales or booking sites).

GA4 docs: https://support.google.com/analytics/answer/9216061

Note: To use form parameters in GA4 reports, configure custom dimensions.

If marketing consent is granted and the form includes email or phone fields, include user_data with hashed identifiers.

GA4 Tag Manager user-provided data guidance: https://support.google.com/analytics/answer/14171268

CMS sales forms with a selected property price also emit generate_lead (with value and currency).

No address fields are sent.

Top-level parameters

ParameterSamplePresenceTypeDescription
form_id42if availablecustomCMS form id. Source: Website form model id.
form_nameContact FormalwayscustomHTML name attribute of the <form> element. Source: Website form name.
form_destination/forms/responsesalwayscustomURL the form submits to. Source: Website form submit URL.
form_submit_textSend messageif availablecustomText of the submit button, if present. Source: Website submit button label.
form_response_id12345alwayscustomInternal form response id (custom parameter). Source: Website saved form response id.
user_data{...} (see below)if availableobjectHashed user-provided data for Google tags. Source: Hashed email/phone from form response, sent only with marketing consent.

user_data

Hashed user-provided data for Google tags. Source: Hashed email/phone from form response, sent only with marketing consent.

Fields below apply only when user_data is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
sha256_email_address...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed email (marketing consent required).
sha256_phone_number...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed phone number (marketing consent required).

Sample data layer snippet

dataLayer.push({"event":"form_submit","form_id":"42","form_name":"Contact Form","form_destination":"/forms/responses","form_submit_text":"Send message","form_response_id":"12345","user_data":{"sha256_email_address":"...","sha256_phone_number":"..."}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

failed_payment

A payment attempt fails during checkout.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal after payment failure

Triggered when a payment attempt fails.

Emitted on the checkout portal after returning from the payment portal with a failure status.

If marketing consent is granted, include user_data with hashed identifiers.

No address fields are sent.

Top-level parameters

ParameterSamplePresenceTypeDescription
transaction_idORDER-123alwayscustomUnique transaction ID. Source: Booking reference/number.
currencyEURalwayscustomCurrency of the payment. Source: Currency used for totals/items (booking/order/reservation currency; website search uses the active site currency).
value350.0alwayscustomAmount associated with the failed payment. Source: Total order/booking value or sum of item prices.
reason_failedfailurealwayscustomFailure reason reported by the payment provider. Source: Payment provider failure reason.
user_data{...} (see below)if availableobjectHashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

user_data

Hashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.

Fields below apply only when user_data is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
sha256_email_address...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed email (marketing consent required).
sha256_phone_number...if availablecustomHex-encoded SHA-256 after normalization. Source: Hashed phone number (marketing consent required).

Sample data layer snippet

dataLayer.push({"event":"failed_payment","transaction_id":"ORDER-123","currency":"EUR","value":350.0,"reason_failed":"failure","user_data":{"sha256_email_address":"...","sha256_phone_number":"..."}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];

user_identity_update

Associates a pseudonymous user id with the current session.

Statusactive
Typeevent
PortalsCheckout portal
FlowCheckout portal identity capture

Triggered when a pseudonymous user id becomes available for analytics.

Emitted in the checkout portal when a booking contact is known and consent allows analytics.

No PII should be included in this event.

Top-level objects

ParameterSamplePresenceTypeDescription
user{...} (see below)alwaysobjectPseudonymous user identifier and optional returning customer flag. Source: Pseudonymous user id and returning_customer flag derived from booking contact.

user

Pseudonymous user identifier and optional returning customer flag. Source: Pseudonymous user id and returning_customer flag derived from booking contact.

Fields below apply only when user is present in the payload. Presence values are scoped to this group.

FieldSamplePresenceTypeDescription
user_idu_hmac_...alwayscustomHMAC-SHA256 of the contact id using the configured secret key. Source: Pseudonymous user id derived from booking contact.
returning_customertrueif availablecustomTrue when the contact has a booking within the last 540 days. Source: Returning customer flag from booking history.

Sample data layer snippet

dataLayer.push({"event":"user_identity_update","user":{"user_id":"u_hmac_...","returning_customer":true}});

Initialize the data layer once on every page: window.dataLayer = window.dataLayer || [];