Food Delivery Courier Mobile App Development
A food delivery courier is a specific role: short routes (1-5 km), many orders per shift, often bicycle or scooter, strict time interest (hot food). The app must work fast, with minimum taps on key actions and accurately show path to restaurant and to customer.
Order Receiving and Confirmation
New order — push notification with timer. Courier has 30-45 seconds to accept or decline. If no response — order goes to next courier. On screen: restaurant address, customer address, distance, estimated time, order cost for weight understanding.
Timer on UI — circular progress bar, countdown. On iOS via CAShapeLayer with strokeEnd animation. On Android — custom View with Canvas.drawArc. Timer is client-side, synced with server by offer creation timestamp, not by push receipt moment (push can be delayed).
Critical error seen: timer counts from push receipt. FCM delayed push by 8 seconds — courier sees 22 seconds instead of 30, thinks they pressed "accept" at last moment, but server already distributed order. Solution: push payload contains offer_created_at, client calculates difference with Date.now().
Navigation Between Restaurant ↔ Customer
Two route stages: first to restaurant (pick up), then to customer (deliver). Each stage — turn-by-turn navigation. For bike and foot courier — pedestrian route, for car — car route. Mode detection: either courier selects manually on registration, or auto by movement speed (GPS speedometer: >15 km/h — car, otherwise foot/bike).
Mapbox Navigation SDK is good because it supports cycling and walking profiles out of box. Google Maps Navigation SDK (GA since 2023) also supports, but more expensive on high volumes.
Multiple Orders Simultaneously
Advanced feature (Yandex.Lavka, Delivery Club "batch"): courier takes 2-3 orders from one restaurant, delivers to different addresses. Route — sequence of points with optimal order. Waypoints in Directions API, on client — list of points with "completed" button for each.
Confirmation of Order Receipt at Restaurant
Courier arrives at restaurant, takes order. Confirmation: QR scan on receipt (most reliable) or "picked up" button click (simple, no verification). QR scanning via MLKit / Vision works in 0.5-1 second. QR on receipt contains order_id — server verifies.
Geofence detection of being at restaurant (50-100 meter radius) — auto "picked up" button appearance only when courier is actually at restaurant. Reduces erroneous "picked up" clicks from elsewhere.
Tips and Rating
After delivery — screen suggesting to leave a tip (optional). Stripe Payment Intents for post-payment tips. Customer rates courier — aggregates in profile.
Courier after shift sees total earnings, number of deliveries, average rating. SwiftCharts (iOS 16+) or MPAndroidChart for simple bar chart by shift hours.
Offline and Unstable Network
Bike courier in restaurant basement — no network. Critical data (customer address, phone number, door code) must be available offline, cached when order received. Rest — with graceful degradation.
Retry on status confirmation: if "delivered" didn't go — retry with exponential backoff until server confirmation. Courier shouldn't manually "send again".
Timeline: 6 to 10 weeks. Cost calculated individually.







