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

Deep Linking for Food Delivery Apps

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

Food delivery apps use deep links more frequently than most app categories. Every restaurant page, menu item, promotional offer, order confirmation, and delivery update is a potential deep link destination. Users receive push notifications ("Your order is on the way"), share restaurant recommendations with friends, and scan QR codes at restaurants. Each interaction needs a deep link that opens the right screen with the right context.

This guide covers deep linking patterns for food delivery and restaurant apps. For QR code strategies at restaurants, see QR codes for restaurants and food apps. For e-commerce deep linking patterns, see deep linking for e-commerce apps.

Person holding smartphone with food delivery app Photo by Erik Mclean on Pexels

URL Structure

Content Hierarchy

/restaurants/{slug}                          → restaurant page
/restaurants/{slug}/menu                     → full menu
/restaurants/{slug}/menu/{item-slug}         → specific menu item
/restaurants/{slug}/reviews                  → restaurant reviews
/orders/{order-id}                           → order details and tracking
/orders/{order-id}/track                     → live delivery tracking
/promo/{code}                                → promotional offer
/cuisine/{type}                              → cuisine category browse
/search?q={query}&near={location}            → search with location
/reorder/{order-id}                          → reorder previous order

Food delivery is inherently location-based. Deep links should carry location context:

https://yourapp.com/restaurants/pizza-palace?lat=40.7128&lng=-74.0060
https://yourapp.com/cuisine/thai?near=downtown-sf
https://yourapp.com/search?q=sushi&radius=5km
class RestaurantActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val uri = intent.data ?: return
        val restaurantSlug = uri.pathSegments.getOrNull(1) ?: return
        val lat = uri.getQueryParameter("lat")?.toDoubleOrNull()
        val lng = uri.getQueryParameter("lng")?.toDoubleOrNull()

        if (lat != null && lng != null) {
            // Use the provided location for delivery estimates
            viewModel.loadRestaurant(restaurantSlug, Location(lat, lng))
        } else {
            // Use the user's current location
            viewModel.loadRestaurant(restaurantSlug)
        }
    }
}

Promotional campaigns drive significant traffic for food delivery apps:

Email: "Get 20% off your first order from Pizza Palace"
Deep link: https://yourapp.com/promo/PIZZA20?restaurant=pizza-palace

Social ad: "Free delivery on orders over $25"
Deep link: https://yourapp.com/promo/FREEDEL25

The deep link handler applies the promotion automatically:

func handlePromoDeepLink(_ url: URL) {
    let promoCode = url.pathComponents.last ?? ""
    let restaurantSlug = url.queryParameters["restaurant"]

    PromoService.shared.validate(promoCode) { result in
        switch result {
        case .valid(let promo):
            CartManager.shared.applyPromo(promo)

            if let restaurant = restaurantSlug {
                navigateToRestaurant(restaurant)
            } else {
                navigateToHome(withBanner: "Promo \(promoCode) applied: \(promo.description)")
            }
        case .expired:
            showAlert("This promo has expired")
        case .invalid:
            showAlert("Invalid promo code")
        }
    }
}

Food delivery apps often have referral programs. The referral deep link carries the referrer's identity:

"Use my link and we both get $10 off: https://yourapp.com/invite/USER123"
fun handleReferralDeepLink(uri: Uri) {
    val referrerCode = uri.lastPathSegment ?: return

    // Store referral for post-install attribution
    sharedPrefs.edit().putString("referrer_code", referrerCode).apply()

    // If new user, show special onboarding with referral credit
    if (isNewUser()) {
        showReferralOnboarding(referrerCode)
    } else {
        showAlert("Referral codes are for new users only")
    }
}

Order Tracking

The most common push notification deep link in food delivery:

// Push notification: "Your order from Pizza Palace is being prepared"
{
  title: "Order Update",
  body: "Your order from Pizza Palace is being prepared",
  data: {
    deepLink: "https://yourapp.com/orders/ORD-12345/track",
    orderId: "ORD-12345",
    status: "preparing"
  }
}

One of the highest-converting deep links in food delivery: the reorder link.

Push: "Craving Pizza Palace again? Reorder your last meal in one tap."
Deep link: https://yourapp.com/reorder/ORD-12345
func handleReorderDeepLink(_ url: URL) {
    guard let orderId = url.pathComponents.last else { return }

    OrderService.shared.getOrder(orderId) { order in
        // Pre-fill the cart with the previous order items
        CartManager.shared.clear()
        for item in order.items {
            CartManager.shared.add(item)
        }

        // Check if the restaurant is currently open
        RestaurantService.shared.isOpen(order.restaurantId) { isOpen in
            if isOpen {
                navigateToCart(restaurant: order.restaurantSlug)
            } else {
                showAlert("\(order.restaurantName) is currently closed. We saved your cart for later.")
            }
        }
    }
}

Restaurant Sharing

When a user shares a restaurant, the deep link includes context:

func shareRestaurant(_ restaurant: Restaurant) {
    var components = URLComponents(string: "https://yourapp.com/restaurants/\(restaurant.slug)")!
    components.queryItems = [
        URLQueryItem(name: "ref", value: "share"),
        URLQueryItem(name: "utm_source", value: "app_share")
    ]

    let message = "Check out \(restaurant.name) on [YourApp]. \(restaurant.rating) stars, \(restaurant.cuisine) cuisine."
    let activityVC = UIActivityViewController(
        activityItems: [message, components.url!],
        applicationActivities: nil
    )
    present(activityVC, animated: true)
}

Share Menu Items

Individual dish sharing is a strong growth channel:

"Try the Truffle Mushroom Pizza from Pizza Palace: https://yourapp.com/restaurants/pizza-palace/menu/truffle-mushroom-pizza"

The web fallback shows the dish with photos, description, price, and an "Order in App" CTA.

QR Code Integration

In-Restaurant QR Codes

QR codes at restaurant tables link directly to the menu in the app:

QR at table → https://yourapp.com/restaurants/pizza-palace/menu?table=5&dine_in=true

The deep link handler detects dine-in mode and adjusts the experience:

fun handleMenuDeepLink(uri: Uri) {
    val restaurantSlug = uri.pathSegments.getOrNull(1) ?: return
    val table = uri.getQueryParameter("table")
    val isDineIn = uri.getQueryParameter("dine_in") == "true"

    if (isDineIn && table != null) {
        // Dine-in mode: order to table, no delivery needed
        sessionManager.setDineInMode(restaurantSlug, table)
        navigateToMenu(restaurantSlug, mode = DineInMode(table))
    } else {
        // Regular delivery/takeout mode
        navigateToMenu(restaurantSlug, mode = DeliveryMode())
    }
}

Structured Data for Food Content

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Pizza Palace",
  "servesCuisine": "Italian",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "San Francisco",
    "addressRegion": "CA"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "234"
  },
  "menu": "https://yourapp.com/restaurants/pizza-palace/menu",
  "potentialAction": {
    "@type": "OrderAction",
    "target": "https://yourapp.com/restaurants/pizza-palace"
  }
}
</script>

Tolinku for Food Delivery

Tolinku handles deep link routing for food delivery apps. Configure routes like /restaurants/:slug/menu/:item in the Tolinku dashboard, and Tolinku routes users to the app or web fallback with promotional and location context preserved through the install flow via deferred deep linking.

For QR code strategies at restaurants, see QR codes for restaurants and food apps.

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.