LLD Hub
lldobserverfactorystrategy

How to Design a Food Delivery System (Swiggy/Zomato) | LLD Guide

Design Swiggy or Zomato's core system — restaurant browse, order placement, delivery partner assignment, and real-time tracking. Frequently asked at Swiggy interviews.

7 April 2025·9 min read

Practice this problem

Food Delivery System (Swiggy/Zomato) — get AI-scored feedback on your solution

Solve it →

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

Ready to practice?

Submit your solution and get AI-scored feedback on OOP, SOLID principles, design patterns, and code quality.

Solve Food Delivery System (Swiggy/Zomato)