Designing a food delivery system like Swiggy or Zomato is one of the most frequently asked LLD problems at Swiggy, Zomato, Dunzo, and other food-tech companies. It involves multiple interacting domains: restaurant catalog, order management, delivery assignment, and real-time tracking.
Core Entities
- Customer — profile, saved addresses, payment methods
- Restaurant — name, location, menu, operating hours
- MenuItem — name, price, category, availability
- Cart — belongs to a customer, contains CartItems
- Order — created from Cart, has status lifecycle
- DeliveryPartner — location, status, active order
- Payment — method, status, transaction
Order State Machine
enum OrderStatus {
PLACED, ACCEPTED, PREPARING,
READY_FOR_PICKUP, OUT_FOR_DELIVERY,
DELIVERED, CANCELLED
}Observer for Real-time Tracking
class Order {
private observers: OrderObserver[] = [];
addObserver(o: OrderObserver) { this.observers.push(o); }
updateStatus(status: OrderStatus) {
this.status = status;
this.observers.forEach(o => o.onStatusChange(this, status));
}
}
class CustomerApp implements OrderObserver {
onStatusChange(order: Order, status: OrderStatus) {
this.showNotification(`Your order is ${status}`);
}
}Delivery Partner Assignment
class DeliveryAssignmentService {
assignPartner(order: Order): DeliveryPartner {
const available = this.partnerRepo.findAvailableNear(order.restaurant.location, 5);
if (!available.length) throw new Error("No partners available");
return available.sort((a, b) =>
distance(a.location, order.restaurant.location) -
distance(b.location, order.restaurant.location)
)[0];
}
}Payment Strategy
interface PaymentStrategy { pay(amount: number): PaymentResult; }
class UPIPayment implements PaymentStrategy { ... }
class CardPayment implements PaymentStrategy { ... }
class WalletPayment implements PaymentStrategy { ... }
class COD implements PaymentStrategy { ... }Common Questions
- "What if no delivery partner is available?" → Hold order, retry every 30s, or show estimated delay
- "How do you handle restaurant cancellation?" → Observer notifies customer, auto-refund triggered
- "How is distance calculated?" → Haversine formula for lat/lng; use external mapping API in production