AppVion Studio logo AppVion Studio Case study

Logistics & delivery platform

D. Delivery: a Kotlin Multiplatform logistics platform built around verifiable proof of delivery.

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.

Kotlin Multiplatform Jetpack Compose Supabase Realtime dispatch Proof of delivery
3 apps, 1 shared codebase 2 mandatory video proofs per delivery Release candidate
D. Delivery rider app recording the mandatory pickup proof video of a parcel

The problem

Courier disputes are won by whoever has evidence — and nobody had any.

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

One Kotlin Multiplatform codebase, three products, one source of truth.

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.

01

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.

02

Rider app

Job broadcast, GPS foreground tracking, guided delivery steps, dual video capture, recipient e-signature, wallet and earnings ledger, offline-first sync.

03

Admin control tower

Manual dispatch, rider approval and document review, pricing configuration, dispute flags, and end-of-day cash settlement against the platform ledger.

04

Shared backend

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 product design system the apps were built against.

The customer booking flow, IMEI capture, live tracking, and the rider's proof-of-delivery sequence.

D. Delivery IMEI barcode scanner with a manual entry fallback
IMEI CaptureCustomer · Scan or enter manually
D. Delivery order confirmation screen preparing live tracking
Order PlacedCustomer · Booking confirmed
D. Delivery live order tracking with rider position, ETA and pickup proof video
Live TrackingCustomer · ETA and pickup proof
D. Delivery delivery receipt showing IMEI, distance and full fare breakdown
Delivery ReceiptCustomer · IMEI and fare breakdown
D. Delivery rider job broadcast alert and admin-assigned job acknowledgement
Job AlertRider · Broadcast and dispatch
D. Delivery rider app recording a mandatory proof of delivery video
Video ProofRider · Pickup and drop-off
D. Delivery recipient e-signature pad for confirming receipt
E-SignatureRider · Recipient confirms receipt
D. Delivery customer rating screen after a completed delivery
Rate DeliveryCustomer · Post-delivery feedback

Engineering highlights

The parts that were harder than they look.

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

What the build actually covers.

03 Connected products delivered from one shared Kotlin Multiplatform codebase.
02 Mandatory video proofs per delivery, plus a recipient e-signature at drop-off.
13 Database tables placed under row-level security with per-role access policies.
100km Operational service radius, enforced on the client and again as a database constraint.

Technology

The stack behind D. Delivery.

Kotlin Multiplatform Jetpack Compose Coroutines & Flow Supabase Postgres Supabase Realtime Supabase Storage Row-Level Security Ktor Client SQLDelight SQLCipher Koin WorkManager CameraX ML Kit Firebase Cloud Messaging Firebase Crashlytics Google Maps & Places Google Routes API Edge Functions

Where it stands

Feature-complete and security-hardened, in pre-launch.

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

Other operational systems we have built.

Fleet dispatch platform

SnowGrid

Three-role snow removal management platform with live dispatch mapping, map-based area measurement, photo verification, and Stripe escrow payments.

Read the Case Study
Email automation platform

GMassPulse

Mobile-first outreach platform with Google OAuth, Drive lead import, automated follow-ups, and real-time open tracking.

Read the Case Study
All work

Full portfolio

Every case study and product demo in one place, across logistics, field service, education, events, and SaaS.

Browse all case studies

Start the conversation

Have an operations problem that needs a real mobile system?

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.

WhatsApp Start Project