BEX data layer: overview and events

Overview, setup checklist, and implementation guidance for the Booking Experts data layer.

What goes away

For new implementations, use the supported event name with ecommerce.* payloads where documented. Do not use top-level ecommerce keys such as items, currency, or value unless the event section explicitly marks them as supported.

  • Legacy payload variants:Same event names with old payload structures will go away. Use the supported schema for:view_item_list,view_item,add_to_cart,remove_from_cart,select_promotion,search,purchase.

  • Legacy-only event names:Events still listed in the deprecated reference will go away:productImpression,productDetail,promotionClick,propertyDetail,formSubmit,failed_payment,view_price_information,visit_checkout_step,select_amenity,deselect_amenity,ga4option,ga4optionConfirm,checkout,addToCart,option.

  • Legacy remarketing objects:hrental_*objects andreturn_from_paymentwill go away.

  • Legacy compatibility fields:Compatibility fields insidepurchasewill go away. Use the standardecommerce.*purchase payload and the top-levelbookingobject for booking metadata.

  • Schema enforcement:Ecommerce payloads must useecommerce.*(ecommerce.items,ecommerce.currency,ecommerce.value, etc.). Top-level legacy ecommerce keys will go away.

  • Migration required:Update GTM triggers and variables to the supported event payload structure and replacement events listed in each deprecated section.

Website types and flows

  • Sales sites: listings + property detail + inquiry forms; no cart or checkout portal.

  • Booking sites: availability search + booking cart + checkout portal (with online payment return).

Sales site flow (example)

view_item_listview_itemform_submit

Booking site flow (example)

search_results_loadedview_item_listview_item

add_to_cart

begin_checkout(checkout portal stay step)

checkout_progress(stay step + guest group/license plates updates)

add_to_cart/remove_from_cart(upgrades)

checkout_progress(details step) →checkout_progress(confirm step)

add_payment_info(payment portal) →purchase(after successful payment return)

Site search flow (example)

searchsearch_results_loaded

Quick start checklist

  • Install the GA4 base tag on all pages.

  • Enable “Send ecommerce data” in the GA4 tag.

  • Create data layer variables for required custom fields.

  • Configure cross-domain measurement if multiple domains are involved.

  • Configure Consent Mode v2 if using Ads/remarketing.

  • Add a Conversion Linker tag if using Google Ads tags.

  • Trigger purchase and verify in DebugView.

  • Validate tags with GTM Preview + Tag Assistant.

  • Confirm reporting variables are mapped to GA4 custom definitions.

Objects vs GA4 parameters

  • GA4 has strict naming/length limits for event/parameter names and values.

  • BEX emits rich objects like booking for GTM variable extraction.

  • Do not send entire objects to GA4 as a parameter; extract only the scalar fields you need for reporting.

Event availability

Event

Status

Legacy payload

Sales site

Booking site

Checkout portal

add_to_cart

Active

Yes

No

Yes

Yes

remove_from_cart

Active

Yes

No

Yes

Yes

begin_checkout

Active

No

No

No

Yes

add_payment_info

Planned

No

No

No

Yes

purchase

Active

Yes

No

No

Yes

view_item_list

Upcoming

Yes

Yes

Yes

No

view_item

Upcoming

Yes

Yes

Yes

No

select_promotion

Planned

Yes

No

Yes

Yes

search

Upcoming

Yes

Yes

Yes

No

search_results_loaded

Planned

No

No

Yes

No

checkout_progress

Planned

No

No

No

Yes

form_submit

Planned

No

Yes

Yes

No

productImpression

Deprecated

No

No

Yes

No

productDetail

Deprecated

No

No

Yes

No

promotionClick

Deprecated

No

Yes

Yes

No

propertyDetail

Deprecated

No

Yes

No

No

formSubmit

Deprecated

No

Yes

No

No

view_price_information

Deprecated

No

No

Yes

Yes

visit_checkout_step

Deprecated

No

No

Yes

Yes

select_amenity

Deprecated

No

No

Yes

Yes

deselect_amenity

Deprecated

No

No

Yes

Yes

ga4option

Deprecated

No

No

Yes

Yes

ga4optionConfirm

Deprecated

No

No

Yes

Yes

checkout

Deprecated

No

No

Yes

Yes

addToCart

Deprecated

No

No

Yes

Yes

option

Deprecated

No

No

Yes

Yes

failed_payment

Deprecated

No

No

Yes

No

hrental_home

Deprecated

No

No

Yes

No

hrental_home_subsite

Deprecated

No

No

Yes

No

hrental_searchresults

Deprecated

No

No

Yes

No

hrental_offerdetail

Deprecated

No

No

Yes

No

hrental_conversion

Deprecated

No

No

Yes

No

return_from_payment

Deprecated

No

No

Yes

No

Parameter types:ga4fields are standard GA4 parameters.customfields need data layer variables in GTM and custom definitions in GA4 to be reportable.

Copy/paste safety:do not quote numeric values forvalue,price,quantity, orindex.

GA4 enhanced measurement (avoid duplicates)

If you rely on BEX events, disable overlapping GA4 Enhanced Measurement features in the data stream settings to avoid double counting.

  • Form interactions:disable if you useform_submitfrom BEX.

  • Site search:disable if you usesearchfrom BEX.

GA4 reporting

Recommended GA4 reporting dimensions for BEX

GA4 parameter names may contain only letters, numbers, and underscores, and must start with a letter. Keep dotted data layer paths in GTM, but map them to underscore parameter names in GA4.

Register custom definitions with the correct scope. Item fields live insideecommerce.items[]and require item-scoped custom dimensions.

BEX providesuser.user_idin the data layer. If you want GA4 User-ID, map that value to the GA4 tag User-ID field (built-inuser_id, not a user property or custom definition).

If you prefer user properties, use GA4-safe names likebex_user_idandbex_returning_customerTreat these identifiers as pseudonymous and only set them when your privacy policy and consent allow it.

Data layer pathGA4 parameter nameScopeGTM mapping

ecommerce.customer_type

customer_type

EVENT

GA4 Event tag -> Event Parameters

search.special_period_id

search_special_period_id

EVENT

GA4 Event tag -> Event Parameters

search.special_period_name

search_special_period_name

EVENT

GA4 Event tag -> Event Parameters

search.amenities_count

search_amenities_count

EVENT

GA4 Event tag -> Event Parameters

search.nights

search_nights

EVENT

GA4 Event tag -> Event Parameters

booking.status

booking_status

EVENT

GA4 Event tag -> Event Parameters

ecommerce.items[].administration_id

administration_id

ITEM

Items array (item-scoped custom dimension)

ecommerce.items[].administration_name

administration_name

ITEM

Items array (item-scoped custom dimension)

ecommerce.items[].item_country

item_country

ITEM

Items array (item-scoped custom dimension)

ecommerce.items[].item_region

item_region

ITEM

Items array (item-scoped custom dimension)

ecommerce.items[].item_city

item_city

ITEM

Items array (item-scoped custom dimension)

ecommerce.items[].item_variant

item_variant

ITEM

Items array (built-in GA4 item parameter; no custom definition)

user.user_id

user_id(built-in)

USER-ID

GA4 tag User-ID field

user.user_id

bex_user_id

USER

GA4 Event tag -> User Properties

user.returning_customer

bex_returning_customer

USER

GA4 Event tag -> User Properties

Google Ads conversions

BEX emits GA4-recommended ecommerce events (e.g.purchase,begin_checkout,add_to_cart). In Google Ads you typically choose between:

  • Option A — Import GA4 key events into Google Ads:simpler setup if GA4 is your source of truth.

  • Option B — Implement Google Ads tags via GTM (recommended):Google Ads-native conversion measurement and advanced features (Enhanced Conversions, remarketing).

Minimum Google Ads tag set in GTM (Option B)

1) Conversion Linker (required)

Create a Conversion Linker tag and trigger it on All Pages.

If your flow spans multiple domains:

  • Enable Link across domains.

  • Fill Auto Link Domains with all involved domains.

  • Optional: enable Decorate Forms if form submits navigate across domains.

2) Google Ads Conversion Tracking (purchase)

  • Trigger: Custom Event = purchase

  • Conversion ID + Conversion Label from Google Ads

  • Conversion Value: {{DLV - ecommerce.value}}

  • Currency Code: {{DLV - ecommerce.currency}}

  • Transaction ID: {{DLV - ecommerce.transaction_id}} (recommended)

BEX mapping:ecommerce.transaction_id→ Order ID,ecommerce.value→ conversion value,ecommerce.currency→ currency.

Dynamic remarketing (optional, recommended if you use feeds)

If you run dynamic remarketing, maintain a matching feed and send event data withitems[]so Google Ads can matchitems[].idto the feed Property ID.

For BEX, map:

  • items[].id = ecommerce.items[].item_id

  • items[].google_business_vertical = hotel_rental

  • items[].start_date = ecommerce.items[].start_date

  • items[].end_date = ecommerce.items[].end_date

Recommended event names:view_item,view_item_list,add_to_cart,purchase.

Meta Ads (Pixel / Conversions API)

Event mapping (BEX → Meta)

BEX eventMeta event

view_item

ViewContent

view_item_list

trackCustom(ViewItemList)

search

Search

add_to_cart

AddToCart

begin_checkout

InitiateCheckout

add_payment_info

AddPaymentInfo

purchase

Purchase

Map ViewContent only for view_item (product detail views). Do not map list or click events to ViewContent.

Fire Meta Search only once per user search. Use search as the canonical event and do not also map search_results_loaded to avoid double counting.

Required parameters

  • valueecommerce.value

  • currencyecommerce.currency

  • content_ids → derived from ecommerce.items[].item_id

  • content_typeproduct

Search events:set Meta search_string from the BEX/GA4 search_term value from search.

Event deduplication (Pixel + CAPI)

  • Pixel uses eventID and CAPI uses event_id; the values must match for deduplication.

  • Recommended defaults:event_id = ecommerce.transaction_idfor purchases. Use the same value for Pixel eventID.

Advanced matching

When marketing consent is granted:

  • Pass user_data.sha256_email_address

  • Pass user_data.sha256_phone_number

Notes: only send with marketing consent; never send raw email or phone values; do not reuse these fields for GA4 reporting.

TradeTracker

TradeTracker conversion tracking should fire only on the final conversion event: purchase. Do not fire on pageviews or intermediate checkout steps.

Required TradeTracker configuration (GTM template)

  • Campaign ID(static; provided by TradeTracker)

  • ProductGroup ID(static; provided by TradeTracker)

  • Transaction ID(dynamic; from BEX)

  • Transaction Amount(dynamic; from BEX)

  • Optional fields depending on program configuration (e.g. voucher)

BEX mapping (Sales tag)

  • Transaction ID → ecommerce.transaction_id

  • Transaction Amount → booking.base_rent_total (ensure this matches your TradeTracker commission agreement)

  • Currency → ecommerce.currency

  • Voucher code → ecommerce.coupon (if used)

Rule:TradeTracker amount must match the affiliate agreement definition (base rent vs gross booking value). Default:booking.base_rent_total.

Implementation diagram

  1. BEX emits purchase.

  2. dataLayer.push({ event: "purchase", ecommerce: { transaction_id, value, currency, ... }, booking: { base_rent_total } })

  3. GTM Trigger: Custom Event purchase.

  4. TradeTracker Sales Tag fires with Campaign ID, ProductGroup ID, and transaction variables.

  5. TradeTracker conversion is recorded.

How to configure in GTM (short)

  1. Import the TradeTracker template.

  2. Create constants: TT - Campaign ID, TT - ProductGroup ID.

  3. Create data layer variables: DLV - ecommerce.transaction_id, DLV - booking.base_rent_total, DLV - ecommerce.currency.

  4. Create the Sales tag with the above variables and trigger on purchase.

  5. Test in GTM Preview and validate the conversion once per transaction_id.

Cross-domain tracking & Consent

BEX flows often span multiple domains. Configure both GA4 cross-domain measurement and Conversion Linker cross-domain linking.

Cross-domain measurement (GA4)

  • Use one GA4 property + one Web data stream.

  • Use the same tag ID across all domains.

  • Admin → Data Streams → select your Web stream → Configure tag settings → Configure your domains.

  • Add all involved domains and verify the _gl linker parameter on navigation.

  • If redirects drop query parameters, cross-domain will fail; preserve _gl.

  • Reference:GA4 cross-domain measurement

Google Ads cross-domain (Conversion Linker)

  • Add a Conversion Linker (All Pages).

  • Enable link across domains and set Auto Link Domains.

  • Optional: Decorate Forms if you submit forms across domains.

Consent Mode v2 (Google tags)

  • Consent types: analytics_storage, ad_storage, ad_user_data, ad_personalization.

  • When analytics_storage = denied, GA4 can send cookieless pings in Advanced Consent Mode; Basic mode blocks tags until consent.

  • When ad_user_data = denied, user-provided-data use cases (Enhanced Conversions) are disabled.

Recommended consent enforcement model

Definitions:Marketing consent means analytics + ads consent (grantanalytics_storage,ad_storage,ad_user_data,ad_personalization). Analytics only means grantanalytics_storagewhile ads consent stays denied.

Recommended mode:Advanced Consent Mode v2. In GTM, set default consent to denied in a Consent Initialization tag, enable consent checks on GA4/Ads tags, and update consent when the user makes a choice. Use Basic mode only if you must block all tags until consent.

User choiceGA4 (analytics)Google Ads conversion tagsuser_data

Marketing consent

Allowed

Allowed

Allowed

Analytics only

Allowed

Blocked

Blocked

No consent

Cookieless (Advanced) / Blocked (Basic)

Cookieless/limited (Advanced) / Blocked (Basic)

Blocked

Implementation diagram

Domain A (site)Domain B (checkout/payment)

Page load

Navigation to domain B

Consent defaults set early

GA4 cross-domain preserves IDs via _gl

GTM tags evaluate consent

Conversion Linker preserves click IDs

GA4 / Ads tags fire with consent signals

purchase event attributed correctly

How to configure in GTM (short)

  1. Consent defaults: trigger Consent Initialization on All Pages.

  2. Consent update: run consent update before marketing tags fire.

  3. Cross-domain: configure GA4 domains list + Conversion Linker link across domains.