01

The order is the shared object

A restaurant product is not only a menu and checkout. The same order moves through customer decisions, branch acceptance, kitchen preparation, cashier handling, rider assignment, delivery, and support. Each participant sees a different interface, but they must agree on one operational truth.

Designing those surfaces independently creates contradictions quickly: customers see unavailable items, staff receive incomplete delivery details, or riders are assigned before an order is ready.

02

Make transitions explicit

Order status should behave like a state machine. Each role can perform a limited set of transitions, invalid jumps are rejected, and history explains how the current state was reached. The client may suggest the next action, but the trusted server boundary decides whether it is valid.

Explicit transitions also improve notifications and tracking because events are attached to meaningful state changes rather than inferred from whichever screen was open.

03

Delivery and pickup diverge early

Delivery versus pickup affects location, fees, timing, branch eligibility, contact details, and fulfilment ownership. Treating the choice as a final checkout toggle creates hidden branches throughout the system.

Keeping the service preference visible from menu selection onward makes pricing and operational expectations easier to understand for both customers and staff.

04

Location needs a purpose boundary

Rider location is operationally useful only while a delivery is assigned and active. Publishing continuously would collect more data than the workflow needs. A purpose-bound rule limits location updates to the smallest useful window and makes the privacy expectation easier to explain.

05

Ship one coherent platform

The strongest architecture is not the one with the most dashboards. It is the one in which menu availability, checkout, staff actions, tracking, and release clients share the same operational language. That coherence is what allows the product to grow without every new role becoming another disconnected system.