purchase
A user completes a purchase.
Status: Active
Triggered when a user confirms a booking.
transaction_iduses the booking number in PMS (non-PII).customer_typeis 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).
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.
Fields marked as Deprecated are kept for compatibility with the existing legacy payment event. They will be removed in a future incremental cleanup.
Sample data layer snippet
dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.
dataLayer.push({
"event": "purchase",
"ecommerce": {
"transaction_id": "ORDER-123",
"currency": "EUR",
"value": 350.0,
"customer_type": "new",
"coupon": "SUMMER10",
"rent_amount": 350.0,
"rent_amount_ex_vat": 35.0,
"booking_window": 7,
"first_start_date": "2026-02-20",
"last_end_date": "2026-02-22",
"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"
}
]
},
"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": "..."
}
});We do not auto-clear booking. If you map booking outside booking events, clear it manually with dataLayer.push({ booking: null }).
Top-level objects
ecommerce
Ecommerce payload wrapper for GA4 events.
ecommerce.items[]
Items array for the ecommerce payload.
booking
Booking object. Source: Booking object. booking.status/final/guest_group plus booking totals fields are populated for checkout portal purchase/lead events.
booking.guest_group
Guest counts by group (see guest_group fields). Source: Aggregated guest group from reservations.
user_data
Hashed user-provided data for Google tags. Source: Hashed email/phone from booking contact, sent only with marketing consent.
Still need help? Share an idea