Waseela Sales Partner

A delivery rider's whole day in one Android app: collect stock, deliver door to door, take payment, close the day.

Role
Set up the module, led the October release
Where
Waseela
Year
2026
Stack
Flutter, Riverpod, Frappe, Python
Status
Internal

What it is

Waseela delivers milk, yogurt and butter to homes in Lahore every morning. Riders, called Sales Partners, run their day in this app, in English and Urdu. Customers can also order through a WhatsApp chatbot. Both talk to the same Frappe and ERPNext backend, and a confirmed delivery creates the invoice and payment entry for finance.

I set up the backend module in July 2026. A teammate built the first version of the app. In October I took over both and led the release that made a full rider day work end to end.

What I did

  • A home screen with one button that tells the rider what's next, from collecting stock at the hub to reconciling stock and cash at the end.
  • Prepaid balances applied at the door, with a delivery photo required for prepaid orders.
  • Subscriptions with a different basket for each weekday, and a nightly job that books tomorrow's orders.
  • Skips that need a reason and a proof photo, and reschedule the delivery automatically.
  • Spot sales that don't end the day, and a day close-out that records the stock and cash handover.
  • Shift GPS tracking, plus a desk dashboard where operations review each rider's kilometres and tracking health.
  • Deployed the backend to Frappe Cloud.

Hard parts

Paying riders per kilometre from phone GPS

The app uploads raw GPS points between stock pickup and return. The phone never sends a distance. A pure-Python engine drops fixes that are inaccurate, come from mock-location apps or move impossibly fast. After several jumps in a row it moves its anchor instead of rejecting points forever. It fills short gaps and checks the track against the stop path before it locks the payable figure. Thresholds live in settings, and the engine has unit tests.

Skips that don't lose orders

A skipped stop doesn't disappear. The rider picks a reason, takes a proof photo and chooses a day, and a new order is booked. Skipped stops don't count against the day's deliveries, so close-out still adds up.

Subscriptions that change by the day

Customers can take the same basket every day or a different one per weekday. The app builds each day's basket with a running weekly total, and the nightly job turns active subscriptions and rescheduled stops into tomorrow's route.

Screens show seeded demo data.