Skip to main content

Overview

The client form page (Booking Step 2) captures detailed information about the selected rooms, extras, and pricing. This step provides crucial data for understanding booking composition and revenue optimization.

Event: init

The init event fires when users reach the client information form after selecting their rooms.

Trigger Condition

  • User accesses the client form/checkout page

Data Layer Structure

The client form event provides comprehensive booking details including:
  • Basic Information
  • Booking Details
  • Pricing Information
  • Occupancy
ParameterTypeDescription
stepStringAlways "CLIENTFORM"
homeStringHost domain name
hotelIdNumberHotel identifier
chainIdNumberChain identifier
hotelNameStringHotel display name
deviceString"DESKTOP_TABLET" or "MOBILE"
languageStringBrowse language (ISO 639-1)

Products Object Structure

The products object contains detailed breakdowns of rooms and extras:

Rooms Array

Each room in the booking includes:
{
  "roomName": "Double Room",
  "rateName": "Standard Rate Room Only",
  "rateId": "23434-34654-34535-545",
  "boardName": "Room Only",
  "priceWithoutTaxes": 435.25,
  "priceWithTaxes": 465.23,
  "unitaryPriceWithoutTaxes": 87.05,  // Per night average
  "numRooms": 1,
  "occupation": {
    "numAdults": 2,
    "numChildren": 0,
    "numBabies": 0
  }
}

Extras Array

Each extra/add-on includes:
{
  "extraId": 83733,
  "extraName": "Welcome Package",
  "amount": 2,                         // Quantity
  "nightsToApply": 1,                  // Nights applicable
  "totalPriceWithTaxes": 13.20,
  "totalPriceWithoutTaxes": 12.10,
  "unitaryPriceWithTaxes": 6.60,       // Per unit price
  "unitaryPriceWithoutTaxes": 6.05
}

Complete Data Layer Example

{
  "step": "CLIENTFORM",
  "home": "www.hotelname.com",
  "hotelId": 10030559,
  "chainId": null,
  "hotelName": "Hotel Name",
  "device": "DESKTOP_TABLET",
  "language": "en",
  "checkin": "10/03/2024",
  "checkout": "15/03/2024",
  "nights": 5,
  "country": "US",
  "coupon": "",
  "currency": "EUR",
  "userCurrency": "EUR",
  "totalPriceWithTaxesWithExtras": 494.93,
  "totalPriceWithTaxesWithoutExtras": 465.23,
  "totalPriceWithoutTaxesWithExtras": 462.35,
  "totalPriceWithoutTaxesWithoutExtras": 435.25,
  "totalExtrasWithTaxes": 29.70,
  "totalExtrasWithoutTaxes": 27.10,
  "totalExtrasTaxes": 2.60,
  "totalTaxes": 32.58,
  "numRooms": 1,
  "numAdults": 2,
  "numChildren": 0,
  "numBabies": 0,
  "products": {
    "rooms": [{
      "roomName": "Single Room",
      "rateName": "Single Room 2 persons Room Only",
      "rateId": "23434-34654-34535-545",
      "boardName": "Room Only",
      "priceWithoutTaxes": 435.25,
      "priceWithTaxes": 465.23,
      "unitaryPriceWithoutTaxes": 87.05,
      "numRooms": 1,
      "occupation": {
        "numAdults": 2,
        "numChildren": 0,
        "numBabies": 0
      }
    }],
    "extras": [{
      "extraId": 83733,
      "extraName": "Wine Package",
      "amount": 2,
      "nightsToApply": 1,
      "totalPriceWithTaxes": 13.20,
      "totalPriceWithoutTaxes": 12.10,
      "unitaryPriceWithTaxes": 6.60,
      "unitaryPriceWithoutTaxes": 6.05
    }]
  }
}

GTM Implementation

Map the client form data to GA4 E-commerce checkout event:
dataLayer.push({
  'event': 'begin_checkout',
  'ecommerce': {
    'value': totalPriceWithTaxesWithExtras,
    'currency': userCurrency,  // Use transaction currency
    'items': products.rooms.map(room => ({
      'item_name': room.roomName,
      'item_category': room.boardName,
      'price': room.unitaryPriceWithoutTaxes,
      'quantity': room.numRooms
    }))
  }
});
Set up remarketing tags to capture users who don’t complete booking:
  • Create audience based on CLIENTFORM step visitors
  • Exclude users who reach CONFIRMATION step
  • Include product details for dynamic remarketing
Create calculated variables in GTM:
  • Average Daily Rate: totalPriceWithoutTaxesWithoutExtras / nights / numRooms
  • Extras Attachment Rate: totalExtrasWithTaxes / totalPriceWithTaxesWithExtras
  • Tax Rate: totalTaxes / totalPriceWithoutTaxesWithExtras

Analytics Insights

Extras Performance

Track which add-ons are most popular and their contribution to revenue

Price Sensitivity

Analyze the impact of taxes and extras on conversion

Occupancy Patterns

Understand booking composition (adults, children, rooms)

Board Basis Preference

Monitor which meal plans guests prefer

Best Practices

Data Privacy: The client form event doesn’t include personal information (name, email) at this stage. This data is only available in the confirmation step.
Currency Handling: Always use the userCurrency field for conversion tracking to ensure accurate revenue reporting in multi-currency setups. The currency field represents the hotel’s base currency, while userCurrency is the actual transaction currency used by the guest.
I