Customer app
Category-aware booking, address search with a manual fallback, insurance based on declared value, live order tracking with a traffic-aware ETA, invoice and rating.
Logistics & delivery platform
Three connected products — a customer booking app, a rider job app, and an admin control tower — engineered so that every parcel movement leaves behind evidence that holds up in a dispute, and every rupee of cash-on-delivery is reconciled against the platform's own ledger rather than a rider's word.

The problem
Context
The brief was a courier service for high-value goods in Pakistan — mobile phones, laptops, and electronics — where a single disputed parcel can cost more than a month of delivery revenue. The existing way of working was WhatsApp messages, phone calls, and a rider's memory.
What kept breaking
Nobody could prove what condition a device was in when it was collected. Cash collected on delivery was reconciled by hand and never quite matched. Riders were assigned by whoever answered first, not by who was actually closest. Customers called for status updates because there was nothing to look at.
The real requirement
Not "an app that books deliveries." A system where the evidence, the money, and the dispatch decision are all produced by the platform itself — so that the answer to "what happened to my parcel" is a record, not an argument.
The approach
Business logic, domain models, and data access live in a shared Kotlin module. The customer app and the rider app are native Jetpack Compose surfaces on top of it, and the admin control tower is a web panel against the same Postgres database. Shared logic means a pricing rule or an order-state rule is written once and cannot drift between apps.
Category-aware booking, address search with a manual fallback, insurance based on declared value, live order tracking with a traffic-aware ETA, invoice and rating.
Job broadcast, GPS foreground tracking, guided delivery steps, dual video capture, recipient e-signature, wallet and earnings ledger, offline-first sync.
Manual dispatch, rider approval and document review, pricing configuration, dispute flags, and end-of-day cash settlement against the platform ledger.
Postgres with row-level security, realtime channels, storage for delivery evidence, edge functions for push dispatch, and scheduled jobs for the dispatch loop.
Interface design
The customer booking flow, IMEI capture, live tracking, and the rider's proof-of-delivery sequence.








Engineering highlights
Expanding-radius dispatch
A new order starts searching for riders inside a small radius and widens in steps on a scheduled server loop until someone accepts or the radius caps out and an admin is alerted. All loop state lives in the order row and is re-evaluated from scratch on every tick, so a missed notification or a dropped tick can never leave an order stuck in a phantom state.
Evidence pipeline
Pickup video, drop-off video, and a recipient e-signature are captured on-device, compressed before upload rather than after, and written to object storage under a per-order path. Uploads are queued through a background worker so a rider on a weak signal is never blocked from finishing a job.
Money integrity
Fares are computed on the server at order creation, not trusted from the client. Rider earnings are credited by a database trigger with a uniqueness guarantee, so a retried delivery confirmation can never pay twice. Cash owed back to the platform is calculated server-side and always nets out the rider's own commission — so the rider's figure and the admin's figure cannot disagree.
Server-enforced order states
The delivery lifecycle is a state machine enforced in the database, not just in the UI. A modified client cannot skip from "accepted" straight to "delivered" and bypass video capture, and a completed or cancelled order cannot be reopened.
Offline-first rider sync
Every job-progress mutation goes through a local outbox backed by an encrypted on-device database and is drained by a sync engine. A rider in a basement or a dead-zone keeps working; the server catches up when signal returns, and state is reconciled on resume rather than assumed.
Realtime that admits when it is unsure
Live subscriptions are treated as a latency optimisation, never as the only path for anything safety- or money-relevant. Each live screen is paired with a coarser reconciliation fetch on resume and on reconnect, so a dropped socket shows a reconnecting state instead of confidently stale data.
Scope at a glance
Technology
Where it stands
The customer and rider apps are functionally complete across booking, dispatch, tracking, proof capture, payments, wallet, and settlement. The platform has been through a structured security pass covering access control, fare tampering, rate limiting, input validation, encrypted session and database storage, and crash reporting. Remaining work before public release is signing, store submission, and a final device-verification pass on the release build — deliberately not claimed as done until it is.
More case studies
Three-role snow removal management platform with live dispatch mapping, map-based area measurement, photo verification, and Stripe escrow payments.
Mobile-first outreach platform with Google OAuth, Drive lead import, automated follow-ups, and real-time open tracking.
Every case study and product demo in one place, across logistics, field service, education, events, and SaaS.
Start the conversation
Dispatch, proof of work, field teams, cash handling, approvals — if the workflow currently lives in WhatsApp and a spreadsheet, it is usually a strong candidate for the same treatment.