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

Today's route: stops on a map with what each customer ordered 
A stop with the prepaid balance applied, so nothing is left to collect 
A subscription basket that changes by weekday, with a weekly total 
Skipping a stop: reason, proof photo and a new delivery date 
Collecting the day's planned stock at the hub 
Home screen after the day is closed and handed over
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.