Skip to content
Tolinku
Tolinku
Sign In Start Free
Deep Linking · · 4 min read

Deep Linking for Travel and Hospitality Apps

By Tolinku Staff
|
Tolinku deferred deep linking dashboard screenshot for deep linking blog posts

Travel apps have complex deep linking requirements: a hotel booking confirmation needs to link to the specific reservation, a flight status notification needs to open the right trip, and a shared destination recommendation needs to show prices for the recipient's travel dates. Context matters more in travel than almost any other app category.

This guide covers the deep linking implementation patterns for travel apps. For search indexing of travel content, see app indexing for travel apps. For product page deep links, see product page deep links.

Traveler using smartphone on airplane for booking and itinerary Photo by Javier Canada on Unsplash

URL Structure

Travel Content Types

/hotels/{city}/{hotel-slug}                      → hotel detail
/hotels/{city}/{hotel-slug}/rooms/{room-type}    → specific room type
/flights/{origin}-to-{destination}               → flight search results
/flights/{flight-id}                             → specific flight
/bookings/{booking-id}                           → booking confirmation
/trips/{trip-id}                                 → trip itinerary
/destinations/{destination-slug}                 → destination guide
/activities/{city}/{activity-slug}               → activity or tour
/search?type=hotel&city={city}&checkin={date}&checkout={date}&guests={n}

Travel searches are always date-dependent. Include dates in deep links to preserve search context:

https://yourapp.com/hotels/barcelona?checkin=2026-07-15&checkout=2026-07-20&guests=2&rooms=1
func handleHotelSearchDeepLink(_ url: URL) {
    let params = url.queryParameters

    let searchCriteria = HotelSearch(
        city: url.pathComponents.last ?? "",
        checkin: DateFormatter.iso8601.date(from: params["checkin"] ?? ""),
        checkout: DateFormatter.iso8601.date(from: params["checkout"] ?? ""),
        guests: Int(params["guests"] ?? "2") ?? 2,
        rooms: Int(params["rooms"] ?? "1") ?? 1
    )

    if searchCriteria.checkin != nil && searchCriteria.checkout != nil {
        navigateToSearchResults(searchCriteria)
    } else {
        // Dates missing or expired, show search form pre-filled with city
        navigateToSearchForm(city: searchCriteria.city)
    }
}

After a booking, send the confirmation deep link via email and push notification:

// Server: send booking confirmation
async function sendBookingConfirmation(booking) {
  const deepLink = `https://yourapp.com/bookings/${booking.id}`;

  // Email
  await sendEmail(booking.userEmail, {
    subject: `Booking Confirmed: ${booking.hotelName}`,
    body: `Your booking at ${booking.hotelName} is confirmed.
           Check-in: ${booking.checkinDate}
           View details: ${deepLink}`
  });

  // Push notification
  await pushService.send(booking.userId, {
    title: "Booking Confirmed",
    body: `${booking.hotelName}, ${booking.checkinDate}`,
    data: { deepLink }
  });
}

Send helpful deep links before the trip:

Day 7 before: "Your trip to Barcelona is in 7 days. View your itinerary."
  → /trips/{id}

Day 1 before: "Check-in at Grand Hotel Barcelona opens at 3 PM tomorrow."
  → /bookings/{id}/checkin

Day of: "Your flight departs at 2:30 PM. View boarding pass."
  → /bookings/{id}/boarding-pass

Sharing Travel Content

Hotel Sharing

When a user shares a hotel with friends:

func shareHotel(_ hotel: Hotel, dates: SearchDates?) {
    var urlString = "https://yourapp.com/hotels/\(hotel.city.slug)/\(hotel.slug)"

    if let dates = dates {
        urlString += "?checkin=\(dates.checkin.iso8601)&checkout=\(dates.checkout.iso8601)"
    }

    let message = "\(hotel.name) in \(hotel.city.name) - \(hotel.rating) stars, from $\(hotel.pricePerNight)/night"
    let url = URL(string: urlString)!

    let activityVC = UIActivityViewController(
        activityItems: [message, url],
        applicationActivities: nil
    )
    present(activityVC, animated: true)
}

The recipient's app (or web page) shows the hotel with the shared dates pre-filled, so they see the same prices and availability.

Trip Sharing

Collaborative trip planning via shared itinerary links:

https://yourapp.com/trips/TRIP-ABC123?invite=true

The invite link lets the recipient view (and optionally edit) the trip itinerary. Deferred deep linking ensures that even if the recipient installs the app from the shared link, they land on the trip directly.

Flight Status Updates

const flightNotifications = [
  {
    trigger: 'gate_change',
    title: "Gate Change",
    body: "Your flight to Barcelona has moved to Gate B12",
    deepLink: "/flights/{flight-id}/status"
  },
  {
    trigger: 'delay',
    title: "Flight Delayed",
    body: "Your flight is delayed by 45 minutes. New departure: 3:15 PM",
    deepLink: "/flights/{flight-id}/status"
  },
  {
    trigger: 'boarding',
    title: "Now Boarding",
    body: "Boarding has started for your flight to Barcelona",
    deepLink: "/bookings/{booking-id}/boarding-pass"
  }
];

Users set price alerts for routes or hotels:

Push: "Price drop! Hotels in Barcelona from $89/night (was $120)"
Deep link: /hotels/barcelona?checkin=2026-07-15&checkout=2026-07-20&sort=price&maxPrice=100

Travelers often have limited connectivity. Handle deep links that arrive when the device is offline:

class TripActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val uri = intent.data ?: return
        val bookingId = uri.lastPathSegment ?: return

        // Try cached data first
        val cachedBooking = bookingCache.get(bookingId)
        if (cachedBooking != null) {
            displayBooking(cachedBooking)
            // Refresh in background if online
            if (isOnline()) refreshBooking(bookingId)
        } else if (isOnline()) {
            fetchAndDisplayBooking(bookingId)
        } else {
            showOfflineMessage("Connect to the internet to view this booking")
        }
    }
}

Structured Data for Travel

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Hotel",
  "name": "Grand Hotel Barcelona",
  "starRating": {"@type": "Rating", "ratingValue": "4"},
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Barcelona",
    "addressCountry": "ES"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "1234"
  },
  "priceRange": "$$",
  "potentialAction": {
    "@type": "ReserveAction",
    "target": "https://yourapp.com/hotels/barcelona/grand-hotel-barcelona"
  }
}
</script>

Tolinku for Travel Apps

Tolinku handles deep link routing for travel content. Configure parameterized routes like /hotels/:city/:slug and /bookings/:id in the Tolinku dashboard. Deferred deep linking preserves search context (dates, guests, rooms) through the install flow, so a user who installs from a shared hotel link lands on the hotel page with the right dates.

For search indexing of travel content, see app indexing for travel apps. For the broader industry trends, see the future of mobile deep linking.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.