Skip to content

Consumer / Marketplace

Food Delivery Ecosystem

Three connected applications — customer, delivery partner and restaurant/admin — sharing one order lifecycle and API.

My role
Mobile & Backend Developer
Project type
Mobile ecosystem + backend
Domain
Consumer / Marketplace

The problem

A food delivery product is not one application. A customer placing an order, a restaurant preparing it and a delivery partner collecting it are three different users with three different interfaces — all reading and writing the same order, at the same time, from different places.

The solution

Treat the order as the single shared entity and give each role its own client over a common API. The order moves through an explicit lifecycle; each role may trigger only the transitions that belong to it; every client reflects state changes rather than deciding state locally.

Technical architecture

A simplified, public-safe view of how the pieces fit together.

Clients

Customer App
Delivery Partner App
Restaurant / Admin

Three role-specific interfaces

API

REST API

Authentication, validation, role-specific endpoints

Domain

Order lifecycle
Assignment
Notifications

Placed → Accepted → Preparing → Picked up → Delivered

Data

MySQL

Orders, items, restaurants, partners, status history

Conceptual ecosystem view: three clients, one API, one order lifecycle.

My contribution

  • Built cross-platform screens and flows in Flutter across the customer and delivery partner applications.
  • Worked on order lifecycle handling so each role’s actions mapped to defined state transitions.
  • Integrated REST APIs, token-based authentication and push notifications in the mobile clients.
  • Handled the realities of mobile: intermittent connectivity, retries and duplicate submissions.

Engineering challenges

Three clients, one source of truth

When each app tracks status locally, the three disagree the moment a network call fails. Keeping status transitions server-side and having clients render what the server reports removed a whole class of "the restaurant says preparing, the customer says placed" bugs.

Unreliable mobile networks

Phones lose connectivity mid-request. Retries then risk creating a second order. Making submissions idempotent — the same request identifier producing the same result — makes a retry safe.

Keeping delivery state fresh

Three parties all want the current state at once. Push notifications for state changes plus a lightweight refresh on screen focus kept the apps current without constant polling.

Key features

  • Customer: browse restaurants and items, place orders, track status, manage profile
  • Delivery partner: receive assignments, accept or decline, update delivery status
  • Restaurant/admin: manage items and availability, handle incoming orders, monitor operations
  • Shared order lifecycle enforced on the server
  • Token-based authentication per role
  • Push notifications for state changes

Outcome

Each role worked in an interface built for it, while the order stayed consistent across all three.

Lessons learned

  • Multi-client products are state-synchronisation problems before they are UI problems.
  • On mobile, assume every request may be retried — design writes to tolerate it.

Keep reading

Other case studies

All projects
Clinical / Healthcare

Enterprise Clinical Platform

Workflow-driven clinical application with role-based access, dashboards and enterprise integrations.

Role
Full Stack Developer
Type
Enterprise web application
React TypeScript ASP.NET Core Web API SQL Server +4
CRM / Business Applications

CRM & Business Dashboard

Record management, multi-criteria filtering, reporting and role-scoped dashboards for internal business teams.

Role
Full Stack Developer
Type
Enterprise web application
Angular TypeScript ASP.NET MVC Web API SQL Server +3
↑ ↓ to navigate · ↵ to open · esc to close Full search