Travel & Hospitality

The booking started 3 weeks ago. Your cookies expired 2 weeks ago.

Travel purchases have the longest research-to-booking windows in e-commerce. Guests browse for weeks across multiple devices and domains before committing. Safari's 7-day cookie limit ensures you lose attribution long before the booking happens. Datafly Signal's server-set cookies persist for 400 days.

Why travel attribution is broken

The travel booking funnel is uniquely hostile to client-side tracking. Long windows, multiple domains, and high ad spend make every lost attribution point expensive.

Long research windows

Travellers spend 2-4 weeks researching before booking. They visit your site 8-12 times across that window. With client-side cookies capped at 7 days, the first visit that started the journey is erased before the booking that ends it.

Cross-domain booking flows

Main site for research, separate search engine, third-party booking engine, confirmation on yet another domain. Each domain boundary breaks the cookie chain and fractures the user journey into disconnected fragments.

High ad spend, poor attribution

Travel brands spend heavily on Google, Meta, and TikTok ads. When cookies expire before conversion, the booking cannot be attributed to the campaign that drove it. You over-invest in channels that look like they convert and under-invest in ones that actually do.

Cross-Domain Identity

One guest across every domain

The Identity Hub links a traveller's sessions across your main site, search engine, booking engine, and confirmation pages into a single unified profile — even in Safari, even across separate domains.

Main Site

yourhotel.com

Research

Search Engine

search.yourhotel.com

Compare

Booking Engine

book.yourhotel.com

Book

Confirmation

confirm.yourhotel.com

Confirm

Identity Hub

AES-256-GCM encrypted tokens / 60s TTL / single-use nonces

  • Encrypted identity tokens passed between domains via URL parameter
  • Server-side resolution — works in Safari, no client-side storage dependency
  • 60-second TTL with single-use nonces prevent replay attacks
  • Consent-gated — identity linking requires explicit user consent
Attribution

Full attribution through the entire booking window

Client-side cookies expire after 7 days. Server-set cookies from your own subdomain persist for 400 days. Here is what that means for a typical travel booking journey.

Day 1Google ad click

Traveller clicks a Google Ads campaign for "Barcelona hotels" and browses your site.

Client-side: TrackedServer-side: Tracked
Day 3Meta retarget impression

Retargeting ad on Instagram. Traveller returns and compares room types.

Client-side: TrackedServer-side: Tracked
Day 7Client-side cookies expire

Safari ITP wipes all client-set cookies. The traveller is now a "new visitor" to client-side analytics.

Client-side: LostServer-side: Tracked
Day 14Traveller returns to compare

Returns via organic search to compare final options. Client-side: new session, no history. Server-side: recognised, full journey intact.

Client-side: LostServer-side: Tracked
Day 16Booking completed

Traveller books a 5-night stay. Client-side: conversion attributed to organic (wrong). Server-side: attributed to original Google Ads click (correct).

Client-side: LostServer-side: Tracked

Result: Client-side attributes the booking to organic search (wrong channel, wrong ROAS). Server-side attributes it to the Google Ads campaign on Day 1 (correct channel, accurate ROAS).

Pipeline as Code

Travel-specific event mapping

A single Booking Completed event carries your travel-specific fields — destination, dates, room type, booking value, number of travellers — and is simultaneously transformed for each vendor API.

GA4 receives a properly formatted purchase event with item arrays. Meta CAPI receives a Purchase event with content parameters and custom data. Each vendor gets exactly the payload they expect from a single source event.

  • Travel-specific fields: destination, check-in/out, room type, travellers
  • GA4 purchase event with structured item arrays
  • Meta CAPI Purchase with custom travel data
  • PII hashed or stripped before vendor delivery
  • Passport numbers stripped at Org Data Layer
pipeline/booking-completed.ymlYAML
# Booking Completed Pipeline
# Travel-specific fields → multiple vendor deliveries

event: Booking Completed
source: web

org_data_layer:
  schema: travel/booking-v2
  pii:
    email: sha256
    phone: sha256
    ip_address: mask
    passport_number: strip
  consent:
    required: [analytics, marketing]

pipelines:
  - vendor: google_analytics_4
    event_name: purchase
    mapping:
      transaction_id: properties.booking_id
      value: properties.booking_value
      currency: properties.currency
      items:
        - item_id: properties.destination
          item_name: properties.destination_name
          item_category: properties.room_type
          price: properties.booking_value
          quantity: properties.travelers

  - vendor: meta_conversions_api
    event_name: Purchase
    mapping:
      event_id: properties.booking_id
      value: properties.booking_value
      currency: properties.currency
      content_ids:
        - properties.destination
      content_type: hotel
      content_name: properties.destination_name
      custom_data:
        check_in: properties.check_in_date
        check_out: properties.check_out_date
        travelers: properties.travelers
        room_type: properties.room_type

Attribute every booking to the right channel

See how Datafly Signal recovers the attribution data that expires before your guests book — and links their journey across every domain they touch.