Groceries and household essentials delivered across cities — five connected products sharing one catalog, one order and one backend.
Project
Product design & build
Year
2026
Our focus
E-commerceMobile appsReal-time systems
How do you deliver groceries across several cities from one catalog and one backend?
Make the delivery city part of the order rather than a filter laid over it. Each city carries its own zones and fees, so what delivery costs and when it can arrive are both resolved from the customer's address before checkout. Five apps then read one catalog and one order.
Platform architecture · MATO
01 /Why does the delivery city belong in the order itself?
Because delivering two streets away and delivering to the next city are not the same job, and a platform that treats them as one will price at least one of them wrong. Each city in MATO carries its own zones and its own fees, so the cost is derived from the address rather than guessed at and corrected later.
Keeping that on the order, not in a lookup the checkout consults at the last moment, means the figure the customer agreed to is the figure the operations team and the rider see. A delivery fee recalculated after the fact is a refund conversation, and refund conversations are the expensive kind.
02 /What do scheduled delivery slots actually solve?
They turn demand into something the shop can staff. Groceries are not dispatched the instant they are ordered: somebody walks the aisles and fills a basket, and there is a limit to how many baskets an afternoon holds. A slot is a promise the business can keep.
That only works if capacity is held when the slot is taken, not counted afterwards. The failure is a plain race condition: two customers reaching for the last place in a window at the same moment, both told yes. A popular window then oversells, and every order in it is late, which costs more trust than showing the window as full ever would.
03 /Why do pickers and riders need their own app?
Because their work is not shopping. A picker needs a guided run through an order — pick, review, pack — that is hard to get wrong while moving. A rider needs the next address, navigation to the exact coordinates, and a way to say they have arrived. Neither needs a catalog or a cart.
Putting them inside the customer app would mean one interface pretending to be two. A separate operations app with role-based picker and rider accounts keeps each person's screen about the task in front of them, while both still write to the same order.
04 /How does a customer watch an order move?
Through one timeline that the people doing the work advance — a state machine, with each step set by the picker or the rider as it actually happens, so the status is a record rather than an estimate. Picking, packed, on the way, delivered, and finally rated.
Once a rider is carrying it, their GPS position and an ETA go on a map, and customer and rider can message in-app — which is what resolves the gate code, the wrong flat number, the dog. After delivery the customer rates the order, which closes the loop the same way it opened.
05 /Why five products instead of one?
Because four audiences genuinely want different things: a customer shopping on a phone, a customer shopping on a desktop, a staff member fulfilling, and an administrator running the catalog and the cities. What they must not have is four versions of the truth.
So the split is at the surface, not underneath. One REST API, one MongoDB catalog, one order model, with JWT and OTP authentication across all of them and role-based access control (RBAC) separating a picker from a rider from an administrator. The mobile apps share a React Native and Expo codebase, the web surfaces share React and Vite, and product media sits on CDN-backed object storage so every client loads the same images and video.
06 /What we delivered
Customer apps for iOS and Android, and a storefront website on the same catalog
Operations app for pickers and riders, with navigation and live location sharing
Admin dashboard for catalog, inventory, promotions, delivery cities and staff
Per-city delivery zones and fees, with scheduled slots held against capacity
Live order tracking: rider GPS with ETA, and customer-to-rider chat
07 /The outcome
A grocery and household delivery platform live in production at mato.com.pk, carrying an order from a customer's tap through picking, packing and a tracked delivery without ever leaving the system.
08 /Build at a glance
Client
Retailer in Sahiwal, Pakistan
Coverage
Intra-city and inter-city delivery
Surfaces
Customer app, storefront, operations app, admin dashboard, API
By making the city a part of the order rather than a filter over it. Each delivery city carries its own zones and fees, so the charge is derived from the customer's address before checkout. Working it out afterwards means either absorbing the difference or asking the customer for more money, and the second one costs a customer.
What is a scheduled delivery slot in a grocery app?
A delivery window the customer picks at checkout, with a limit on how many orders it holds. Groceries need somebody to walk the aisles and fill a basket, so slots turn demand into something the shop can staff. Capacity has to be held when the slot is taken, or a popular window oversells and every order in it runs late.
Do grocery delivery platforms need a separate app for staff?
They work much better with one. A picker needs a guided pick, review and pack flow; a rider needs the next address and navigation to exact coordinates. Neither needs a catalog or a cart, and building all of it into the customer app makes one interface pretend to be two. A separate operations app with role-based accounts keeps each screen about the job at hand.
How does live order tracking work in a delivery app?
The people doing the work advance a single timeline — picking, packed, on the way, delivered — so the status is a record of what happened rather than an estimate. Once a rider is carrying the order, their GPS position and an ETA appear on a map, and in-app chat handles what the address field could not.
Can one backend serve a mobile app, a website and an admin dashboard?
Yes, and it should. MATO runs a customer app, a storefront, an operations app and an admin dashboard against one REST API, one MongoDB catalog and one order model. Splitting at the surface keeps each audience's interface appropriate; splitting underneath would give four audiences four versions of the truth.