Mobile App Development for Food Delivery Driver
Courier app is not a simplified client version. It's a tool used all day, on poor internet, one-handed while holding a thermal bag. Any extra tap or screen lag — irritation that compounds across 50 deliveries per shift.
What Determines Courier UX
Minimum Critical Path Actions. Accept order → confirm arrival at restaurant → pick up order → navigation → confirm delivery. Five actions. Each one big button, no nested menus.
"Current delivery" screen — always first on app open, no navigation needed. Implement via AutoRoute (Flutter) preserving state: app remembers courier mid-delivery even if swiped away for 20 minutes.
Offline Mode. In basements, elevators, weak signal zones — connection drops. Delivery statuses cache locally (Hive or Drift) and sync on reconnection. If courier taps "Order Delivered" with no network — action doesn't get lost.
Geolocation and Dispatching
Courier coordinates sent to server every 10–15 seconds during active delivery. On server (Laravel + PostGIS) this enables: showing real courier position on client's map, building load heatmaps, calculating actual time-in-transit for ML predictions.
On Android — foreground service with persistent "Delivery Active" notification. Without this on MIUI, One UI and custom ROMs, app gets killed by system after 10–15 minutes. This isn't device-specific — it's architectural requirement for courier apps.
Routing: Yandex Navigator SDK or Google Maps SDK integration for turn-by-turn in-app navigation — without switching to external navigator.
Order Assignment
Two approaches:
Push-model: dispatcher or algorithm assigns order to specific courier → app gets push → courier accepts or declines. Simple, works for small courier fleet.
Broadcast-model: order "auctioned" among available couriers in radius — first to accept delivers it. Needs WebSocket with "bidding" state, timeout, fallback to next courier. Implement via Laravel Broadcasting + Redis Pub/Sub.
For restaurant with 5–10 couriers, push-model suffices. For aggregator with hundreds — broadcast with priority algorithm by distance (PostGIS ST_Distance) and rating.
Courier Financial Module
Shift earnings, payment history, status — in app. Cash handling: courier records cash receipt, system reflects restaurant debt. Payouts via bank transfer on schedule or SBP payouts (Tinkoff Business API).
Stack
Flutter 3.x + Bloc, Laravel 10 + WebSocket (Laravel Echo), PostgreSQL + PostGIS, FCM, Redis, Yandex MapKit or Google Maps SDK.
Common Development Mistakes
Don't develop courier app separately from client app — they're tightly event-linked but have fundamentally different UX requirements. Share packages in one Flutter repo — sensible; unified UI — bad idea.
Don't test only on high-end Android. Xiaomi Redmi 9 with MIUI 12, poor LTE downtown — this is where it breaks.
Timeline
MVP courier app with geolocation, delivery statuses, routing — 12 to 18 weeks. Combined with client app and restaurant panel — 24+ weeks.
Pricing is calculated individually after requirements analysis.







