The Problem
The client was a funded Saudi logistics startup entering a crowded same-day delivery market. Their competitive advantage was hyper-local: a network of vetted drivers in three Riyadh districts who could guarantee 90-minute delivery windows. What they lacked was the technology to coordinate it.
Their initial plan was to build separate native apps — one iOS team, one Android team. After the first quote came in at twice their mobile budget and 28 weeks, they came to us looking for a different approach.
What We Built
Three connected Flutter applications sharing a single Laravel backend: a customer app for placing and tracking orders, a driver app for accepting and navigating deliveries, and an admin web panel for dispatch and operations oversight. All three sync in real time over WebSockets — when a driver moves, the customer's tracking screen updates. When a customer places an order, the nearest available driver gets an immediate push notification.
The Arabic RTL layout was designed first. The majority of the client's users are Arabic-speaking Saudis, and every screen was mocked up in Arabic before the English version was derived from it — not the other way around.
Core Features
Real-time driver location updates every 4 seconds. Customer sees driver position on a map from order acceptance to doorstep. Google Maps SDK with custom Arabic map styling.
Nearest-available driver matching with acceptance timeout and automatic fallback. Push notification via Firebase Cloud Messaging to driver app within 800ms of order placement.
Orders placed while offline are queued locally and submitted automatically when connectivity is restored. Critical for drivers in areas with intermittent coverage.
Face ID and fingerprint authentication on both customer and driver apps. Reduces login friction for repeat users — the driver app in particular opens dozens of times per shift.
Full right-to-left layout, Arabic number formatting, and Hijri/Gregorian date support. Not a layout mirror — designed RTL from the first wireframe.
Stripe for international cards, Mada for Saudi debit cards. Wallet balance, order-time payment, and cash-on-delivery — all three flows in one checkout.
Why Flutter Over Native
The decision to use Flutter rather than native iOS and Android was not primarily about budget — it was about timeline and maintenance. With a single codebase, every feature ships to both platforms simultaneously. There's no version divergence, no separate bug fix cycles, no iOS-only edge cases that don't appear on Android until a week later.
Flutter's rendering engine also gives us more consistent UI across devices. Saudi users span a wider range of hardware than European markets — a single Flutter build looks and behaves the same on a high-end iPhone 16 Pro and a mid-range Samsung A25 running Android 13.
The one trade-off we accepted was app size. Flutter apps are larger than equivalent native apps. For this client, a 22MB download size was an acceptable trade-off against the development and maintenance advantages.
The Result
The app was submitted to both the App Store and Google Play in week 12. Both were approved on the first submission — a result of thorough pre-submission review and compliance with App Store guidelines that we apply as a standard process, not as an afterthought before submission.
10,000 downloads in the first month exceeded the client's internal forecast by a factor of three. The 4.8-star App Store rating after 200+ reviews reflects both the product quality and the care taken with the Arabic-first UX — the most common positive mention in Arabic reviews was the smoothness of the RTL experience.