🍔 Design Food Delivery (Swiggy) — System Design Interview Guide

Hard · Real-Time & Logistics

Design a food delivery platform like Swiggy or DoorDash where users browse restaurants, place orders, and track delivery in real-time, while managing restaurant menus, availability, and dynamic delivery pricing.

Open the interactive Food Delivery (Swiggy) design on PrepGrind → Drag load balancers, caches, databases, and queues onto a canvas, run a live traffic simulation to watch latency and bottlenecks under load, and follow the full interview walkthrough below — free, in your browser.

Functional requirements

Non-functional requirements & scale

Capacity estimation

Similar to Ride-Sharing but more complex: multiple parties (user, restaurant, delivery partner). Order state machine: PLACED → CONFIRMED → PREPARING → OUT_FOR_DELIVERY → DELIVERED. Each party needs real-time updates. Restaurant availability is dynamic (can mark closed anytime).

Core entities

API design

High-level design

Order placed → Restaurant notified → Restaurant confirms → Matching assigns nearest available partner → Partner picks up → Live tracking via WebSocket. All state changes via Kafka; WebSocket pushes to users.

Deep dives

🗺️ Dynamic ETA Calculation

ETA = restaurant prep time + delivery time. Delivery time: distance / avg_speed + traffic factor. Use Google Maps Distance Matrix API or internal routing with live traffic. Cache ETA per restaurant-to-zone pair (update every 5 min). Delivery partner assignment: minimize max(ETA). Re-estimate ETA every 2 min during delivery based on actual partner location vs planned route.

🔄 Order State Machine

PLACED → CONFIRMED (restaurant accepts) → PREPARING → READY → PARTNER_ASSIGNED → PICKED_UP → OUT_FOR_DELIVERY → DELIVERED or CANCELLED. Each transition is a Kafka event. Timeouts: restaurant must confirm within 2 min else auto-cancel + notify user. Partner must pick up within 5 min of assignment else reassign. Store state in DB with version lock.

🍕 Restaurant Availability

Restaurant marks open/close at any time. On close: all active orders complete, no new orders. Mark in Redis (TTL-based) for fast lookup. Search API filters by isOpen. Problem: menu item goes out of stock mid-order. Solution: restaurant portal sends item-unavailable event → Kafka → Order Service checks items on order placement. Optimistic: allow order, notify restaurant if any item unavailable post-placement.

💳 COD Reconciliation

Cash on delivery: partner collects cash. Needs reconciliation: partner reports amount collected → matches order total. Discrepancy handling: shortage → deduct from partner wallet; excess → flag for review. Daily settlement: sum all COD orders per partner → expected amount. Digital receipt generation for each COD order. Fraud detection: pattern analysis on partner collection history.

Scaling considerations

What interviewers expect by level

Practice more system design case studies

PrepGrind runs entirely in your browser, free, no installation required. Loading the interactive playground…