--- 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
Secure Flight Information (Required by TSA)
``` > **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
San Francisco (SFO)
San Jose (SJC)
Adults (18+) 2
Children (2-17) 1
Infants (under 2) 0

Recent Searches

Featured Deals

SFO → Tokyo From $599
``` ```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 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

Adult 1 (Primary Contact)

Travel Documents (International Flights)

TSA Information (Optional)

``` ```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
1

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

Add Bags & Extras

Checked Bags

Adult 1

Carry-on ✓ Included
1st Checked Bag
2nd Checked Bag

Travel Extras

Travel Insurance

Trip cancellation, medical coverage, baggage protection

$49 per traveler

Priority Boarding

Board early and secure overhead bin space

$15 per traveler

WiFi Bundle

Stay connected on all your flights

$25

Extras Added

Checked Bags (2) $70
Travel Insurance (3) $147

Extras Total: $217

``` ```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

Complete Your Booking

Payment Method

Billing Address

``` ```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.*