---
name: fullstory-travel
version: v2
description: Industry-specific guide for implementing Fullstory in travel and hospitality applications including airlines, hotels, OTAs, car rentals, and vacation packages. Covers booking funnel optimization, search and filtering UX, payment handling (PCI), loyalty programs, and multi-traveler booking flows. Includes detailed examples for search, booking, check-in, and post-trip experiences.
related_skills:
- fullstory-privacy-controls
- fullstory-privacy-strategy
- fullstory-analytics-events
- fullstory-page-properties
- fullstory-element-properties
---
# Fullstory for Travel & Hospitality
> ⚠️ **LEGAL DISCLAIMER**: This guidance is for educational purposes only and does not constitute legal, compliance, or regulatory advice. Travel applications are subject to various regulations (PCI DSS for payments, GDPR, airline-specific requirements, TSA/DHS regulations in the US). Always consult with your legal and compliance teams before implementing any data capture solution. Your organization is responsible for ensuring compliance with all applicable regulations.
## Industry Overview
Travel and hospitality have unique characteristics for session analytics:
- **High-value conversions**: Bookings often $500-$5,000+
- **Complex search**: Multi-leg trips, date ranges, passenger counts
- **Long consideration cycles**: Users often research across multiple sessions
- **Price sensitivity**: Fare changes, comparison shopping
- **Multi-traveler flows**: Booking for groups, families
- **Loyalty programs**: Points, tiers, member benefits
- **Regulatory requirements**: PCI for payments, some PII considerations
### Key Goals for Travel Implementations
1. **Optimize search-to-book conversion** funnel
2. **Understand abandonment** at each funnel stage
3. **Improve search and filtering** UX
4. **Reduce friction** in checkout and payment
5. **Enhance loyalty program** engagement
6. **Track ancillary upsells** (bags, seats, insurance)
---
## What Can Be Captured in Travel
| Data Type | Capture? | Privacy Level | Notes |
|-----------|----------|---------------|-------|
| Search criteria (dates, destinations) | ✅ Yes | Unmask | Core analytics |
| Flight/hotel options displayed | ✅ Yes | Unmask | Pricing analytics |
| Prices and fares | ✅ Yes | Unmask | Conversion analysis |
| Selected options | ✅ Yes | Unmask | Booking analytics |
| Ancillaries (bags, seats, meals) | ✅ Yes | Unmask | Upsell analytics |
| Traveler names | ⚠️ Mask | Mask | PII |
| Passport numbers | ❌ Never | Exclude | Government ID |
| Date of birth | ⚠️ Consider | Mask/Exclude | PII, may be needed for infant fares |
| Contact email/phone | ⚠️ Mask | Mask | PII |
| Payment card details | ❌ Never | Exclude | PCI |
| Loyalty numbers | ⚠️ Consider | Mask | Could be used for account takeover |
| TSA PreCheck / Known Traveler | ❌ Exclude | Exclude | Security sensitive |
### TSA Secure Flight Requirements (US Airlines)
For airlines operating in the US, TSA Secure Flight requirements mandate specific passenger data collection. **All Secure Flight data must be EXCLUDED**:
| Secure Flight Data | Why Exclude |
|--------------------|-------------|
| **Full legal name** | Required for TSA matching |
| **Date of birth** | Required for TSA matching |
| **Gender** | Required for TSA matching |
| **Redress Number** | DHS Traveler Redress Inquiry Program |
| **Known Traveler Number** | TSA PreCheck / Global Entry |
| **Passport information** | International travel verification |
```html
```
> **Important**: Track that the Secure Flight form was displayed and submitted (funnel step), but NEVER capture the actual data entered.
---
## Implementation Architecture
### Privacy Zones for Travel
```
┌─────────────────────────────────────────────────────────────────┐
│ TRAVEL APPLICATION │
├─────────────────────────────────────────────────────────────────┤
│ FULLY VISIBLE (fs-unmask) │
│ • Search form (destinations, dates, passengers) │
│ • Search results (flights, hotels, prices) │
│ • Flight/room details │
│ • Price breakdowns │
│ • Ancillary options (bags, seats, insurance) │
│ • Filters and sort options │
│ • Fare rules and policies │
│ • Loyalty tier benefits (general) │
├─────────────────────────────────────────────────────────────────┤
│ MASKED (fs-mask) │
│ • Traveler names │
│ • Email addresses │
│ • Phone numbers │
│ • Billing address │
│ • Loyalty member numbers │
├─────────────────────────────────────────────────────────────────┤
│ EXCLUDED (fs-exclude) │
│ • Passport numbers │
│ • Date of birth │
│ • Payment card details │
│ • TSA PreCheck / Known Traveler numbers │
│ • Redress numbers │
│ • Government ID uploads │
│ • Security questions │
└─────────────────────────────────────────────────────────────────┘
```
### User Identification Pattern
```javascript
// Travel: Use loyalty ID or internal customer ID
function onLogin(user) {
FS('setIdentity', {
uid: user.customerId, // e.g., "CUST-12345"
displayName: user.firstName // Just first name
});
FS('setProperties', {
type: 'user',
properties: {
// Loyalty program (valuable for segmentation)
loyalty_tier: user.loyaltyTier, // "blue", "silver", "gold", "platinum"
loyalty_points_band: getPointsBand(user.points), // "0-10k", "10k-50k", etc.
member_since_year: new Date(user.memberSince).getFullYear(),
// Booking behavior
bookings_ytd: user.bookingsYTD,
trips_completed: user.tripsCompleted,
preferred_cabin: user.preferredCabin, // "economy", "business", "first"
preferred_seat: user.seatPreference, // "window", "aisle"
// Account features
has_saved_travelers: user.savedTravelers > 0,
has_saved_payment: user.hasSavedPayment,
has_tsa_precheck: user.hasTsaPrecheck, // Boolean only, not the number
// Travel patterns
home_airport: user.homeAirport, // "SFO", "JFK"
most_visited_destination: user.topDestination,
// Marketing
email_subscribed: user.emailOptIn,
fare_alerts_enabled: user.fareAlerts
}
});
}
```
---
## Page-Specific Implementations
### Flight/Hotel Search
```html
Recent Searches
```
```javascript
// Search tracking
function onSearch(searchParams) {
FS('trackEvent', {
name: 'flight_search',
properties: {
// Route
origin: searchParams.origin,
destination: searchParams.destination,
origin_country: getCountry(searchParams.origin),
destination_country: getCountry(searchParams.destination),
// Trip details
trip_type: searchParams.tripType,
depart_date: searchParams.departDate,
return_date: searchParams.returnDate,
days_until_departure: getDaysUntil(searchParams.departDate),
trip_duration_days: getTripDuration(searchParams),
// Passengers
adults: searchParams.adults,
children: searchParams.children,
infants: searchParams.infants,
total_travelers: searchParams.totalTravelers,
// Preferences
cabin_class: searchParams.cabin,
flexible_dates: searchParams.flexibleDates,
nonstop_only: searchParams.nonstopOnly,
// Context
is_repeat_search: isRepeatSearch(searchParams),
search_source: 'homepage' // or "results_modify", "deal_click"
}
});
}
```
### Search Results
```html
SFO → JFK
Dec 20 - Dec 27 · 2 Adults, 1 Child · Economy
Sort by:
Showing 156 flights
United
7:00 AM
→
3:30 PM
SFO
5h 30m
JFK
Nonstop
```
```javascript
// Search results tracking
FS('setProperties', {
type: 'page',
properties: {
page_type: 'flight_results',
// Search parameters
origin: searchParams.origin,
destination: searchParams.destination,
trip_type: searchParams.tripType,
cabin_class: searchParams.cabin,
total_travelers: searchParams.totalTravelers,
// Results
total_results: results.length,
has_nonstop: results.some(r => r.stops === 0),
lowest_price: Math.min(...results.map(r => r.price)),
highest_price: Math.max(...results.map(r => r.price)),
airlines_available: [...new Set(results.map(r => r.airline))].length
}
});
// Filter usage tracking
function onFilterApply(filters) {
FS('trackEvent', {
name: 'search_filter_applied',
properties: {
filter_type: filters.type, // "stops", "airline", "time", "price"
filter_values: filters.values,
results_after_filter: filteredResults.length,
results_change: filteredResults.length - previousResults.length
}
});
}
// Flight selection
function onFlightSelect(flight, fare) {
FS('trackEvent', {
name: 'flight_selected',
properties: {
flight_id: flight.id,
airline: flight.airline,
origin: flight.origin,
destination: flight.destination,
departure_time: flight.departureTime,
duration_minutes: flight.duration,
stops: flight.stops,
fare_class: fare.class,
fare_price: fare.price,
position_in_results: flight.resultPosition,
is_cheapest: flight.isCheapest,
is_fastest: flight.isFastest
}
});
}
```
### Passenger Information
```html
Traveler Information
```
```javascript
// Passenger info tracking - generic only
FS('trackEvent', {
name: 'passenger_info_completed',
properties: {
total_travelers: travelers.length,
adults: travelers.filter(t => t.type === 'adult').length,
children: travelers.filter(t => t.type === 'child').length,
infants: travelers.filter(t => t.type === 'infant').length,
has_loyalty_numbers: travelers.some(t => t.loyaltyNumber),
has_tsa_info: travelers.some(t => t.knownTraveler),
is_international: trip.isInternational,
time_to_complete_seconds: getFormDuration()
// Never: names, DOB, passport numbers
}
});
```
### Seat Selection
```html
Choose Your Seats
Available
Selected
Extra Legroom ($45)
Occupied
Selected Seats
Adult 1
12A (Window)
Included
Adult 2
12B (Middle)
Included
Upgrade to Extra Legroom
More space for just $45 per seat
```
```javascript
// Seat selection tracking
function onSeatSelected(seat, traveler) {
FS('trackEvent', {
name: 'seat_selected',
properties: {
seat_type: seat.type, // "standard", "extra_legroom", "preferred"
seat_position: seat.position, // "window", "middle", "aisle"
seat_row_zone: getSeatZone(seat.row), // "front", "middle", "back", "exit_row"
seat_price: seat.price,
is_paid_seat: seat.price > 0,
traveler_number: traveler.index,
aircraft_type: flight.aircraft
}
});
}
// Seat selection summary
FS('trackEvent', {
name: 'seat_selection_completed',
properties: {
total_travelers: travelers.length,
seats_selected: selectedSeats.length,
seats_skipped: travelers.length - selectedSeats.length,
paid_seats: selectedSeats.filter(s => s.price > 0).length,
seat_revenue: selectedSeats.reduce((sum, s) => sum + s.price, 0),
upgrade_offered: upgradeWasOffered,
upgrade_accepted: upgradeAccepted
}
});
```
### Bags and Ancillaries
```html
```
```javascript
// Ancillary tracking - very valuable
function onBagAdded(bag, traveler) {
FS('trackEvent', {
name: 'ancillary_added',
properties: {
ancillary_type: 'checked_bag',
bag_number: bag.number, // 1st, 2nd
price: bag.price,
traveler_number: traveler.index,
flight_segment: bag.segment
}
});
}
function onExtraAdded(extra) {
FS('trackEvent', {
name: 'ancillary_added',
properties: {
ancillary_type: extra.type, // "insurance", "priority_boarding", "wifi"
price: extra.price,
quantity: extra.quantity
}
});
}
// Summary tracking
FS('trackEvent', {
name: 'ancillary_selection_completed',
properties: {
total_bags_added: bagsAdded,
bag_revenue: bagTotal,
has_insurance: hasInsurance,
insurance_revenue: insuranceTotal,
has_priority: hasPriority,
has_wifi: hasWifi,
total_ancillary_revenue: totalAncillaryRevenue,
ancillary_per_traveler: totalAncillaryRevenue / travelers.length,
extras_skipped: skippedAll
}
});
```
### Payment
```html
```
```javascript
// Payment tracking
function onPaymentMethodSelected(method) {
FS('trackEvent', {
name: 'payment_method_selected',
properties: {
method: method, // "card", "paypal", "points", "points_plus_card"
points_used: method === 'points' ? pointsUsed : 0,
remaining_balance: method === 'points' ? remainingBalance : totalAmount
}
});
}
function onBookingComplete(booking) {
FS('trackEvent', {
name: 'booking_completed',
properties: {
booking_id: booking.confirmationNumber,
// Trip details
origin: booking.origin,
destination: booking.destination,
trip_type: booking.tripType,
// Pricing
base_fare: booking.baseFare,
taxes_fees: booking.taxesFees,
ancillary_revenue: booking.ancillaryTotal,
total_price: booking.total,
// Travelers
total_travelers: booking.travelers,
// Payment
payment_method: booking.paymentMethod,
points_redeemed: booking.pointsUsed,
// Funnel metrics
time_to_book_minutes: getBookingDuration(),
sessions_to_book: getSessionCount(),
// Cabin
cabin_class: booking.cabin,
// Upsells accepted
has_paid_seats: booking.hasPaidSeats,
has_bags: booking.hasBags,
has_insurance: booking.hasInsurance
}
});
}
```
---
## Hotel-Specific Patterns
```javascript
// Hotel search tracking
FS('trackEvent', {
name: 'hotel_search',
properties: {
destination: search.destination,
check_in: search.checkIn,
check_out: search.checkOut,
nights: search.nights,
rooms: search.rooms,
guests: search.guests,
star_rating_filter: search.starRating
}
});
// Hotel selection
FS('trackEvent', {
name: 'hotel_selected',
properties: {
hotel_id: hotel.id,
hotel_name: hotel.name,
star_rating: hotel.stars,
price_per_night: hotel.price,
total_price: hotel.totalPrice,
room_type: room.type,
is_refundable: room.isRefundable,
includes_breakfast: room.hasBreakfast,
position_in_results: hotel.resultPosition
}
});
```
---
## Loyalty Program Tracking
```javascript
// Loyalty-specific tracking
FS('setProperties', {
type: 'user',
properties: {
loyalty_tier: user.tier,
points_balance_band: getPointsBand(user.points),
status_miles_ytd_band: getMilesBand(user.statusMiles),
miles_to_next_tier: user.milesToNextTier,
tier_expiry_days: user.tierExpiryDays
}
});
// Points earning
FS('trackEvent', {
name: 'points_earned',
properties: {
earning_type: 'flight', // "flight", "card_spend", "partner", "promo"
points_earned: points,
booking_id: booking.id
}
});
// Points redemption
FS('trackEvent', {
name: 'points_redeemed',
properties: {
redemption_type: 'flight', // "flight", "upgrade", "merchandise"
points_redeemed: points,
cash_equivalent: cashValue
}
});
```
---
## KEY TAKEAWAYS FOR AGENT
When helping travel clients with Fullstory:
1. **Search and pricing data is valuable**: Dates, destinations, prices can all be captured
2. **PCI compliance for payments**: Always exclude card details
3. **Government IDs are sensitive**: Passport numbers, TSA numbers must be excluded
4. **Ancillary tracking is crucial**: Bags, seats, insurance are major revenue
5. **Traveler names should be masked**: Not excluded, but masked
6. **Multi-session journeys**: Users often research across multiple sessions
### Questions to Ask Travel Clients
1. "Are you tracking the full search-to-book funnel?"
2. "How are you tracking ancillary upsells?"
3. "Is passport/government ID entry properly excluded?"
4. "How do you handle loyalty program member data?"
5. "Are you tracking abandonment at each step?"
### Key Metrics to Track
- Search-to-results conversion
- Results-to-selection conversion
- Passenger info completion rate
- Seat/bag/insurance attachment rates
- Payment success rate
- Booking value (base + ancillary)
---
## REFERENCE LINKS
- **PCI Compliance**: https://www.pcisecuritystandards.org/
- **Fullstory Privacy Controls**: ../core/fullstory-privacy-controls/SKILL.md
- **Analytics Events**: ../core/fullstory-analytics-events/SKILL.md
- **Element Properties**: ../core/fullstory-element-properties/SKILL.md
---
*This skill document is specific to travel and hospitality implementations. Adjust based on your specific business requirements.*