Grouped the way a delivery business actually works — planning the day, getting the data in, what happens on the road, what the outlet sees, and the numbers you read afterwards. If you’d rather have the story than the list, start with the walkthrough.
The engine underneath the product. Two ways to build a trip — one automatic, one by hand — and both end in the same dispatch flow.
Takes today’s ready orders and your available fleet and returns a complete set of trips. Runs in seconds, on a normal server, with no external optimisation service.
Balanced clustering across vehicles, so each trip stays in one part of the city and the vans come out evenly loaded rather than one full and three empty.
Within each trip, a nearest-neighbour route from the warehouse outward, then a 2-opt polish to remove crossings. The driver receives a sequence, not a set.
Trips are capped at your fill target of each vehicle’s rated weight — a deliberate margin for weighbridge surprises and last-minute additions. Not overridable from the screen.
An operational ceiling you set, so nobody ever gets handed a 60-stop route that was mathematically valid and humanly impossible.
Same-beat retailers get a cohesion bonus so they tend to travel together — but the planner will never force a cross-town assignment just to honour a beat.
Coloured routes on a map, per-trip cards, drag a retailer to a different trip, reorder within a trip. Save as drafts when you’re happy.
Anything that didn’t fit is listed with its reason and left in the ready pool. Nothing disappears silently.
Beat-grouped order pool on the left, trip cart on the right, live capacity bar. Tick, then Calculate & optimise for real driving distances and per-leg ETAs.
Everything the planner needs comes out of the file you already produce. The less parallel data entry a distributor has to do, the more likely the system survives contact with a real week.
Maps your sales order export directly — order number, date, customer code, SKU, quantities and value. Two file layouts supported out of the box; new ones are a mapping change, not a rebuild.
Rows whose order number already exists are skipped, not overwritten. Upload the same file twice by accident and nothing breaks.
Row counts, duplicates, unknown customer codes and unmatched SKUs are all shown before anything is written. Valid rows commit; problems queue for a fix.
New product codes and pack configurations are learned from each import. Manual corrections you make are preserved — future imports never overwrite a hand-fixed value.
A readiness banner shows total SKUs and how many are missing a weight or volume. Download just the gaps as a CSV, fill it in Excel, upload it back.
Editable in-app, importable in bulk. Filter retailers by missing GPS, by beat or by status — the list tells you what still needs attention.
The part that has to work on a five-year-old Android phone with two bars of signal.
Adds to the home screen with its own icon and splash screen. No Play Store listing, no update to push, nothing for a driver to reinstall when his phone is wiped.
The driver picks his language. Stored data stays in English throughout, so reports and audits are identical regardless of what the driver sees.
Every stop opens in Google Maps with the retailer’s coordinates preset. No typing an address at the wheel.
The retailer receives a code on WhatsApp; the driver enters it to close the stop. A master fallback code covers the phone-is-off case. GPS and timestamp captured on submit.
Shop closed, lunch break, refused, address mismatch, stock issue, other. Reasons are a fixed list so they aggregate into a report instead of a pile of free text.
Start reading when the trip begins, optional closing reading when it ends — captured back at the warehouse, where the real number is.
All active trips on one map, refreshed every 60 seconds. Per-stop ETA vs actual arrival, time at stop, and distance delta against plan.
A driver stationary at one stop past the threshold gets flagged automatically. You call because something is wrong, not to check in.
Drivers and field salesmen flag a wrong retailer location with a photo and GPS accuracy reading. It lands in a review queue — approve and the master updates, distance cache clears itself.
Close a trip and release its stuck orders, or pull a wrongly-delivered order back into the ready pool. Human error gets an undo button instead of a database ticket.
Two WhatsApp messages per delivery is the whole retailer experience. No app to install, no login, no training — which is exactly why it works.
Three headline measures on screen for the daily check, and one workbook when someone needs an answer they can forward.
Delivered weight against vehicle capacity.
Low here means you’re running trips half-empty — bundle differently, or use a smaller vehicle.
Planned duration against actual duration.
Low here means too long between stops — check traffic windows or the route order.
Actual stops against the target you set per distributor.
Normalises busy days against quiet ones, so distributors of different sizes compare fairly.
One file, six sheets. Managers live in the first, second and fourth; the rest are there when someone asks “how do you know that?”
A brand rolling this across a distributor network needs isolation, comparability and an audit trail. All three are structural, not bolted on.
Every record carries its distributor. Controllers assert the scope before any read or write, and file storage is segmented by distributor too.
A super-admin can act on a distributor’s behalf, always with an explicit banner and a full audit entry for every action.
Logins, master-data edits, imports, dispatches, deliveries and corrections — who, when, and what changed.
Super-admin, distributor operator, driver and field salesman. Small on purpose — every extra role is another thing to explain in training.
PHP and MySQL on a single instance. No Kubernetes, no message queue, no per-seat cloud dependency. Cheap to run at 3 distributors and at 50.
Road distances between fixed shops are cached permanently and reused — shops don’t move. After the first few weeks almost every leg is a cache hit.
Nothing reschedules, cancels or rolls over on its own. The system points at the problem; a person clicks the button.
Distributor three and distributor fifty run the same software. Rollout is an onboarding wave, not a fork.
Tell us where the pain is and we’ll shape the walkthrough around it, instead of showing you all forty screens.