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.