Mobile App Development for Food Delivery Customer
Food delivery client app is the most competitive segment in mobile development. Users compare it not with previous version but with Yandex.Eats and Delivery Club. Retention depends on opening speed, menu scroll smoothness, and courier tracking accuracy. Any technical failure here — app deletion.
Performance as Architectural Priority
Restaurant menu is a list with images. Seems elementary. In practice: 80–100 items with photos, categories with horizontal scroll, add-to-cart animation — and on Snapdragon 660 it stutters on quick scroll.
Solution: cache images via cached_network_image with disk cache, serve WebP versions from backend (Sharp on Node.js or Imageflow), lazy load via ListView.builder, preload next 5 items via precacheImage. Add-to-cart animation — Hero animation with thumbnail, no full-screen overlays.
Time to interactivity on cold start is critical. Store last menu state locally (Hive): show cached menu instantly on open, update in background from server. User sees content, not spinner.
Cart and Checkout
Cart is state that must survive: app minimization, phone restart, Wi-Fi to mobile switch. Bloc + HydratedBloc (auto-persist to SharedPreferences) solves this in evening.
Checkout is funnel where each extra step kills conversion. Optimal flow: cart → address (from saved or new) → delivery time → payment method → confirm. Max 4 screens. Saved addresses via Google Places API Autocomplete or Dadata — auto-fill on input.
Payment: YooKassa with Apple Pay / Google Pay is not optional — it's requirement. Users used to one-tap payment won't type 16-digit card number. Integrate Google Pay via google_pay Flutter plugin, Apple Pay via apple_pay. YooKassa supports both.
Order Tracking — Most Anticipated Screen
After payment, user wants to know: where's my food. Tracking screen: status (accepted → cooking → handed to courier → in transit → delivered) + map with live courier marker.
Courier coordinates update via WebSocket (Laravel Broadcasting). Client-side — flutter_map (OpenStreetMap/Yandex) with marker movement animation via Tween. Smooth marker animation between coordinates — via LinearAnimation by lat/lng, not jump.
Estimated delivery time updates from backend based on real courier position and traffic (Yandex Routes API or Google Distance Matrix API). Not static "30 minutes" but live countdown.
Push Notifications and Marketing
Transactional push: "Your order accepted", "Courier left", "Order delivered" — FCM High Priority, no delay.
Marketing push: "New on menu", "Promo for next order" — FCM Normal Priority, enable A/B testing via Firebase Remote Config.
Deep links for promo push via Firebase Dynamic Links (or App Links / Universal Links): tap "-15% on pizza" push opens app straight to that menu category.
Loyalty Program
Bonus points per order — basic level. Implement via transaction table in PostgreSQL. Apply points at checkout — partial amount deduction. Gamification via tiers (Silver/Gold/Platinum) with different cashback % — increases order frequency without discounts per check.
Referral: unique user promo code, bonus on referral's first order.
Stack
Flutter 3.x + Bloc (HydratedBloc for cart), Laravel 10 + WebSocket, PostgreSQL, FCM, Redis (menu cache and sessions), CDN for media.
| Complexity | Includes | Timeline |
|---|---|---|
| MVP | Menu, cart, order, tracking, payment | 14–18 weeks |
| Medium | + loyalty, push marketing, order history | 20–24 weeks |
| Full | + multi-restaurant, split orders, analytics, A/B tests | 28–36 weeks |
Pricing is calculated individually after requirements analysis.







