Travel & Hospitality Event Spec
This page defines all standard events for travel and hospitality products on Datafly Signal — covering destination discovery, flight, hotel and car search, the booking funnel, and post-booking experiences such as check-in, loyalty, and reviews. Implement these events to enable accurate server-side delivery to advertising and analytics platforms.
Events that overlap with the general e-commerce funnel reuse GA4’s recommended event names (view_item, add_to_cart, begin_checkout, purchase, search, sign_up, login, generate_lead). If you’re migrating from Google Tag Manager, those event names work as-is. Travel-specific events use snake_case names.
All events are sent via datafly.track(). Properties are passed as a flat object in the second argument. Dates should be sent as ISO 8601 strings (e.g. '2026-08-14'). Airport codes should use IATA three-letter codes (e.g. 'LHR', 'JFK'). Monetary amounts should be numbers with a separate currency property using ISO 4217 codes.
Never put raw PII (email, phone, name, passport number, free-text review content) in track() properties. Signal hashes and attaches identity server-side. Pass identifiers (booking_id, flight_id, hotel_id) rather than personal data.
Search Events
Events tracking what travellers are searching for.
search
Fired when a user submits a generic site search. Use the travel-specific search events below for structured flight, hotel, or car queries.
datafly.track('search', {
search_term: 'cheap flights to lisbon'
})| Property | Type | Required | Description |
|---|---|---|---|
search_term | string | Required | The search term entered by the user |
destination_searched
Fired when a user searches for a destination (city, country, or region). Used by blueprints to map structured destination intent to platform search events.
datafly.track('destination_searched', {
query: 'Lisbon',
product_id: 'dest_lisbon',
category: 'city',
value: 0,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
query | string | Required | The destination search term entered by the user |
product_id | string | Optional | Identifier of the matched destination, if resolved |
category | string | Optional | Destination classification (e.g. city, country, region) |
value | number | Optional | Indicative value of the search (e.g. cheapest fare), if known |
currency | string | Optional | ISO 4217 currency code for value |
flight_searched
Fired when a user performs a flight search.
datafly.track('flight_searched', {
origin: 'LHR',
destination: 'JFK',
depart_date: '2026-08-14',
return_date: '2026-08-21',
passengers: 2,
cabin_class: 'economy',
trip_type: 'return',
results_count: 84
})| Property | Type | Required | Description |
|---|---|---|---|
origin | string | Optional | Origin airport IATA code (e.g. LHR) |
destination | string | Optional | Destination airport IATA code (e.g. JFK) |
depart_date | string | Optional | Departure date in ISO 8601 format |
return_date | string | Optional | Return date in ISO 8601 format. Omit or set null for one-way |
passengers | number | Optional | Number of passengers |
cabin_class | string | Optional | Cabin class: economy, premium_economy, business, first |
trip_type | string | Optional | Trip type: one_way, return, multi_city |
results_count | number | Optional | Number of results returned |
hotel_searched
Fired when a user performs a hotel search.
datafly.track('hotel_searched', {
destination: 'New York',
check_in: '2026-08-14',
check_out: '2026-08-21',
guests: 2,
rooms: 1,
results_count: 120
})| Property | Type | Required | Description |
|---|---|---|---|
destination | string | Optional | City, region, or property name searched |
check_in | string | Optional | Check-in date in ISO 8601 format |
check_out | string | Optional | Check-out date in ISO 8601 format |
guests | number | Optional | Total number of guests |
rooms | number | Optional | Number of rooms requested |
results_count | number | Optional | Number of results returned |
car_searched
Fired when a user searches for a hire car.
datafly.track('car_searched', {
location: 'JFK',
pick_up_date: '2026-08-14',
drop_off_date: '2026-08-21',
car_type: 'suv',
results_count: 18
})| Property | Type | Required | Description |
|---|---|---|---|
location | string | Optional | Pick-up location (city or airport code) |
pick_up_date | string | Optional | Pick-up date in ISO 8601 format |
drop_off_date | string | Optional | Drop-off date in ISO 8601 format |
car_type | string | Optional | Category of car searched (e.g. economy, suv, luxury) |
results_count | number | Optional | Number of results returned |
Browsing Events
Events tracking destination, listing, and product views.
view_item_list
Fired when a user views a results grid of flights, hotels, or cars.
datafly.track('view_item_list', {
item_list_id: 'hotels-new-york',
item_list_name: 'Hotels — New York',
items: [
{ item_id: 'htl_ace_nyc', item_name: 'Ace Hotel New York', price: 229.00, index: 0, item_category: 'Hotels', currency: 'USD' },
{ item_id: 'htl_std_nyc', item_name: 'The Standard High Line', price: 319.00, index: 1, item_category: 'Hotels', currency: 'USD' }
]
})| Property | Type | Required | Description |
|---|---|---|---|
item_list_id | string | Optional | Machine-readable identifier for the results list |
item_list_name | string | Optional | Human-readable name of the list being browsed |
items | array | Optional | Array of item objects displayed in the list (see Items Array Schema) |
destination_viewed
Fired when a user views a destination page.
datafly.track('destination_viewed', {
destination: 'Lisbon',
destination_type: 'city'
})| Property | Type | Required | Description |
|---|---|---|---|
destination | string | Optional | Name of the destination |
destination_type | string | Optional | Destination classification: city, country, region |
listing_viewed
Fired when a user views a specific travel listing (a hotel, flight, package, or experience). The canonical detail-view event for travel inventory; mapped to platform ViewContent.
datafly.track('listing_viewed', {
product_id: 'htl_ace_nyc',
product_name: 'Ace Hotel New York',
category: 'hotel',
value: 229.00,
currency: 'USD'
})| Property | Type | Required | Description |
|---|---|---|---|
product_id | string | Optional | Identifier of the listing being viewed |
product_name | string | Optional | Display name of the listing |
category | string | Optional | Listing type (e.g. hotel, flight, package, experience) |
value | number | Optional | Displayed price of the listing |
currency | string | Optional | ISO 4217 currency code for value |
view_item
Fired when a user views a structured product detail page (flight fare, hotel room, or car). Reuses the GA4 e-commerce event so travel inventory delivers alongside standard catalogue products. Also accepted as view_content.
datafly.track('view_item', {
currency: 'GBP',
value: 649.00,
items: [
{
item_id: 'flt_ba_lhr_jfk_0814',
item_name: 'LHR → JFK · British Airways',
item_category: 'Flights',
item_brand: 'British Airways',
item_variant: 'Economy',
price: 649.00,
currency: 'GBP',
quantity: 1
}
]
})| Property | Type | Required | Description |
|---|---|---|---|
currency | string | Optional | ISO 4217 currency code |
value | number | Optional | Monetary value of the event |
items | array | Optional | Array containing the viewed item (see Items Array Schema) |
flight_viewed
Fired when a user views the details of a specific flight option.
datafly.track('flight_viewed', {
flight_id: 'flt_ba_lhr_jfk_0814',
origin: 'LHR',
destination: 'JFK',
depart_date: '2026-08-14',
airline: 'British Airways',
price: 649.00,
currency: 'GBP',
cabin_class: 'economy'
})| Property | Type | Required | Description |
|---|---|---|---|
flight_id | string | Optional | Identifier for the flight or fare |
origin | string | Optional | Origin airport IATA code |
destination | string | Optional | Destination airport IATA code |
depart_date | string | Optional | Departure date in ISO 8601 format |
airline | string | Optional | Operating airline name (e.g. British Airways) |
price | number | Optional | Displayed price |
currency | string | Optional | ISO 4217 currency code |
cabin_class | string | Optional | Cabin class of the viewed fare |
hotel_viewed
Fired when a user views the details of a specific hotel.
datafly.track('hotel_viewed', {
hotel_id: 'htl_ace_nyc',
hotel_name: 'Ace Hotel New York',
destination: 'New York',
check_in: '2026-08-14',
check_out: '2026-08-21',
price_per_night: 229.00,
currency: 'USD',
stars: 4,
rating: 8.4
})| Property | Type | Required | Description |
|---|---|---|---|
hotel_id | string | Optional | Unique identifier for the hotel |
hotel_name | string | Optional | Hotel display name |
destination | string | Optional | City or region |
check_in | string | Optional | Check-in date in ISO 8601 format |
check_out | string | Optional | Check-out date in ISO 8601 format |
price_per_night | number | Optional | Displayed price per night |
currency | string | Optional | ISO 4217 currency code |
stars | number | Optional | Star rating (e.g. 4) |
rating | number | Optional | Guest review score (e.g. 8.6) |
listing_saved
Fired when a user saves or favourites a travel listing for later. Mapped to platform AddToWishlist.
datafly.track('listing_saved', {
product_id: 'htl_ace_nyc',
product_name: 'Ace Hotel New York',
value: 229.00,
currency: 'USD'
})| Property | Type | Required | Description |
|---|---|---|---|
product_id | string | Optional | Identifier of the saved listing |
product_name | string | Optional | Display name of the saved listing |
value | number | Optional | Displayed price of the saved listing |
currency | string | Optional | ISO 4217 currency code for value |
Booking Events
Events tracking the booking funnel from initiation to confirmation and post-booking changes.
add_to_cart
Fired when a user adds a fare, room, or ancillary (seat, bag, insurance) to their basket. Reuses the GA4 e-commerce event.
datafly.track('add_to_cart', {
currency: 'GBP',
value: 1298.00,
items: [
{
item_id: 'flt_ba_lhr_jfk_0814',
item_name: 'LHR → JFK · British Airways',
item_category: 'Flights',
item_brand: 'British Airways',
item_variant: 'Economy',
price: 649.00,
currency: 'GBP',
quantity: 2
}
]
})| Property | Type | Required | Description |
|---|---|---|---|
currency | string | Optional | ISO 4217 currency code |
value | number | Optional | Monetary value of the items added |
items | array | Optional | Array of items added to the basket (see Items Array Schema) |
booking_started
Fired when a user begins the checkout or booking flow. Equivalent to GA4 begin_checkout; either name is accepted.
datafly.track('booking_started', {
booking_type: 'flight',
item_id: 'flt_ba_lhr_jfk_0814',
value: 1298.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
booking_type | string | Optional | Product being booked: flight, hotel, car, package |
item_id | string | Optional | Identifier of the item being booked |
value | number | Optional | Total price shown at booking start |
currency | string | Optional | ISO 4217 currency code |
add_payment_info
Fired when a user submits their payment details during booking. Reuses the GA4 e-commerce event.
datafly.track('add_payment_info', {
currency: 'GBP',
value: 1298.00,
payment_type: 'credit_card',
booking_type: 'flight'
})| Property | Type | Required | Description |
|---|---|---|---|
currency | string | Optional | ISO 4217 currency code |
value | number | Optional | Total value of the booking |
payment_type | string | Optional | Payment method type (e.g. credit_card, paypal, apple_pay, points) |
booking_type | string | Optional | Product being booked: flight, hotel, car, package |
purchase
Fired on the confirmation page after a booking is confirmed and payment taken. This is the most important conversion event — ensure it fires reliably. Equivalent to booking_completed; either name is accepted.
datafly.track('purchase', {
transaction_id: 'BK-20264821',
value: 1298.00,
currency: 'GBP',
booking_type: 'flight',
check_in: '2026-08-14',
check_out: '2026-08-21',
guests: 2,
payment_type: 'credit_card',
items: [
{
item_id: 'flt_ba_lhr_jfk_0814',
item_name: 'LHR → JFK · British Airways',
item_category: 'Flights',
item_brand: 'British Airways',
item_variant: 'Economy',
price: 649.00,
quantity: 2,
currency: 'GBP'
}
]
})| Property | Type | Required | Description |
|---|---|---|---|
transaction_id | string | Required | Unique booking reference — used for deduplication |
value | number | Optional | Total revenue amount |
currency | string | Optional | ISO 4217 currency code |
booking_type | string | Optional | Product booked: flight, hotel, car, package |
check_in | string | Optional | Check-in or departure date in ISO 8601 format |
check_out | string | Optional | Check-out or return date in ISO 8601 format |
guests | number | Optional | Number of guests or passengers |
payment_type | string | Optional | Payment method used (e.g. credit_card, paypal, points) |
items | array | Optional | Items booked (see Items Array Schema) |
Always send transaction_id (your booking reference) on purchase events for deduplication. Platforms like Meta CAPI and GA4 use it to prevent double-counting alongside browser-side events.
refund
Fired when a booking is cancelled and a refund issued. Equivalent to booking_cancelled; either name is accepted.
datafly.track('refund', {
transaction_id: 'BK-20264821',
value: 974.00,
currency: 'GBP',
reason: 'change_of_plans'
})| Property | Type | Required | Description |
|---|---|---|---|
transaction_id | string | Required | Identifier of the booking being refunded |
value | number | Optional | Amount refunded |
currency | string | Optional | ISO 4217 currency code |
reason | string | Optional | Cancellation reason (e.g. change_of_plans, price_issue) |
booking_modified
Fired when a confirmed booking is amended (e.g. date change, seat upgrade, name correction).
datafly.track('booking_modified', {
booking_id: 'BK-20264821',
modification_type: 'date_change',
price_difference: 45.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
booking_id | string | Yes | Booking reference |
modification_type | string | Optional | Type of change (e.g. date_change, seat_upgrade, name_correction) |
price_difference | number | Optional | Price change resulting from the modification (negative for refunds) |
currency | string | Optional | ISO 4217 currency code |
booking_completed
The travel-domain name for a confirmed booking — the primary conversion event. Identical to purchase; send whichever name your stack uses. Always include transaction_id for deduplication.
datafly.track('booking_completed', {
transaction_id: 'BK-20264821',
booking_type: 'flight',
value: 1298.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
transaction_id | string | Required | Booking reference — used for deduplication |
booking_type | string | Optional | flight, hotel, car, package |
value | number | Optional | Total booking value |
currency | string | Optional | ISO 4217 currency code |
booking_cancelled
Fired when a booking is cancelled or refunded. Identical to refund; send whichever name your stack uses.
datafly.track('booking_cancelled', {
transaction_id: 'BK-20264821',
value: 1298.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
transaction_id | string | Required | Booking reference being cancelled |
value | number | Optional | Amount refunded |
currency | string | Optional | ISO 4217 currency code |
Lead Events
Events tracking enquiries and lead capture, common for tour operators, travel agents, and high-value packages.
generate_lead
Fired when a user submits an enquiry, callback request, or quote request. Reuses the GA4 e-commerce event.
datafly.track('generate_lead', {
lead_type: 'quote_request',
booking_type: 'package',
destination: 'Maldives',
value: 4500.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
lead_type | string | Optional | Nature of the lead (e.g. quote_request, callback, brochure) |
booking_type | string | Optional | Product enquired about: flight, hotel, car, package |
destination | string | Optional | Destination the enquiry relates to |
value | number | Optional | Indicative value of the enquiry, if known |
currency | string | Optional | ISO 4217 currency code for value |
Post-Booking Events
Events covering check-in, check-out, loyalty, and reviews.
check_in_completed
Fired when a traveller completes online or self-service check-in.
datafly.track('check_in_completed', {
booking_id: 'BK-20264821',
check_in_method: 'mobile',
seat_selected: '14A'
})| Property | Type | Required | Description |
|---|---|---|---|
booking_id | string | Yes | Booking reference |
check_in_method | string | Optional | Method used: web, mobile, kiosk |
seat_selected | string | Optional | Seat number selected during check-in (e.g. 14A) |
check_out_completed
Fired when a guest or traveller completes check-out.
datafly.track('check_out_completed', {
booking_id: 'BK-20264821'
})| Property | Type | Required | Description |
|---|---|---|---|
booking_id | string | Yes | Booking reference |
loyalty_points_earned
Fired when points are credited to a customer’s loyalty account.
datafly.track('loyalty_points_earned', {
programme_id: 'ba_avios',
points: 1500,
booking_id: 'BK-20264821'
})| Property | Type | Required | Description |
|---|---|---|---|
programme_id | string | Optional | Loyalty programme identifier (e.g. ba_avios, ihg_one) |
points | number | Optional | Number of points earned |
booking_id | string | Optional | Booking that triggered the earn |
loyalty_points_redeemed
Fired when points are redeemed from a customer’s loyalty account.
datafly.track('loyalty_points_redeemed', {
programme_id: 'ba_avios',
points: 10000,
redemption_type: 'flight_discount'
})| Property | Type | Required | Description |
|---|---|---|---|
programme_id | string | Optional | Loyalty programme identifier |
points | number | Optional | Number of points redeemed |
redemption_type | string | Optional | What the points were used for (e.g. flight_discount, hotel_upgrade, ancillary) |
review_submitted
Fired when a customer submits a rating or review for a travel product.
Do not include free-text review content as an event property. Review text may contain PII and is better stored directly in your application database.
datafly.track('review_submitted', {
booking_id: 'BK-20264821',
subject_type: 'hotel',
subject_id: 'htl_ace_nyc',
rating: 9
})| Property | Type | Required | Description |
|---|---|---|---|
booking_id | string | Optional | Booking the review relates to |
subject_type | string | Optional | Item being reviewed: hotel, flight, car |
subject_id | string | Optional | Identifier of the reviewed item |
rating | number | Optional | Rating given, on a scale of 1–10 |
Account Events
sign_up
Fired when a user completes account registration.
datafly.track('sign_up', {
method: 'email'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | Optional | Registration method (e.g. email, google, facebook) |
login
Fired when a user signs in to their account.
datafly.track('login', {
method: 'email'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | Optional | Login method (e.g. email, google, facebook) |
Items Array Schema
Several events accept an items array. Each object in the array can include the following properties. The items[] array uses GA4-style field names. Signal’s server-side blueprints automatically transform these to vendor-specific formats (e.g., Meta’s contents[] with id/title fields).
| Property | Type | Description |
|---|---|---|
item_id | string | Your internal product, fare, or property ID |
item_name | string | Display name of the flight, hotel, or car |
item_category | string | Product category (e.g. Flights, Hotels, Cars, Packages) |
item_brand | string | Brand (e.g. operating airline, hotel chain, car supplier) |
item_variant | string | Selected variant (e.g. Economy, Deluxe King, SUV) |
price | number | Unit price |
quantity | number | Number of units (e.g. passengers, rooms, nights) |
index | number | Position in list (0-indexed, relevant in list/search contexts) |
currency | string | ISO 4217 currency code |
coupon | string | Item-level coupon or promo code if applicable |
discount | number | Monetary discount applied to this item |
item_list_id | string | Identifier of the list the item was shown in |
item_list_name | string | Name of the list the item was shown in |
Vendor Mapping
The table below shows how Datafly Signal maps travel events to the native event names expected by each vendor’s server-side API. Signal uses the GA4-style event names as its canonical format, and blueprints handle the transformation to vendor-specific payloads.
| Signal Event | GA4 | Meta CAPI | TikTok Events API |
|---|---|---|---|
search | search | Search | Search |
destination_searched | search | Search | Search |
flight_searched | search | Search | Search |
hotel_searched | search | Search | Search |
car_searched | search | Search | Search |
view_item_list | view_item_list | ViewContent | ViewContent |
destination_viewed | view_item | ViewContent | ViewContent |
listing_viewed | view_item | ViewContent | ViewContent |
view_item | view_item | ViewContent | ViewContent |
flight_viewed | view_item | ViewContent | ViewContent |
hotel_viewed | view_item | ViewContent | ViewContent |
listing_saved | add_to_wishlist | AddToWishlist | AddToWishlist |
add_to_cart | add_to_cart | AddToCart | AddToCart |
booking_started | begin_checkout | InitiateCheckout | InitiateCheckout |
add_payment_info | add_payment_info | AddPaymentInfo | AddPaymentInfo |
purchase | purchase | Purchase | CompletePayment |
refund | refund | (custom) | (custom) |
booking_modified | (custom) | (custom) | (custom) |
generate_lead | generate_lead | Lead | SubmitForm |
check_in_completed | (custom) | (custom) | (custom) |
check_out_completed | (custom) | (custom) | (custom) |
loyalty_points_earned | (custom) | (custom) | (custom) |
loyalty_points_redeemed | (custom) | (custom) | (custom) |
review_submitted | (custom) | (custom) | (custom) |
sign_up | sign_up | CompleteRegistration | CompleteRegistration |
login | login | (custom) | (custom) |