SystemForgeStudio
Food & Beverage

Food Delivery Web App — Multi-Location Restaurant Chain

WALKTHROUGH · HYPOTHETICAL
24 STAFF USERS
QSR CHAIN · 8 OUTLETS · DELHI NCR + DARK KITCHEN
14 WEEKS BUILD TIME

KEY OUTCOME

Aggregator commission: ₹1.8L/month → ₹0 on direct orders. 4,200+ customer records owned in 90 days.

THE PROBLEM

What was happening before

The chain had grown to 8 outlets across Delhi NCR over six years. In that time, delivery had gone from a small sideline to roughly 60% of total revenue. Most of it flowed through Zomato and Swiggy. By the time the owner sat down with the numbers, the aggregators were taking between ₹1.6L and ₹2L every month in commissions — on top of the discounts they required the restaurant to fund to maintain visibility in the app's algorithm.

The owner had no customer database. Not a single name, not a single phone number from any of the thousands of delivery orders placed over the past three years. Every customer relationship sat inside the aggregator's app. The restaurant could not send a Diwali discount, could not reach out to someone who hadn't ordered in 30 days, could not build a loyalty programme — because it didn't know who its customers were. The aggregator did.

Menu management was a separate frustration. Every outlet listed on both platforms meant 16 restaurant listings to keep aligned. A price change — seasonal pricing, a new combo, removing an item — required raising a support ticket with both aggregators. The team routinely discovered that an item was showing the wrong price or was listed as available when it had run out, because the update hadn't propagated yet. During peak hours, this caused rejected orders and the customer complaints that followed.

The four smaller outlets also took phone orders and WhatsApp orders from regular customers and nearby offices. These were handled by the counter staff — whoever picked up the phone. Orders were written on paper, passed to the kitchen verbally, and occasionally lost entirely when the counter got busy. Across all 8 outlets, there were roughly 12 missed or wrong orders per week — not tracked, not reviewed, discovered only when a customer called back.

Riders were managed by outlet managers over WhatsApp groups. There was no central view of who was on duty, where they were, or which order they were carrying. When a customer called to ask where their food was, the outlet manager had to call the rider individually to find out. Delivery time was estimated, not tracked. The 48-minute average was the owner's best guess — the actual number was unknown.

The chain had one dark kitchen running two virtual brands from a central facility. Orders for both brands came through Zomato. Menu alignment between the brands was done manually every time there was a price or availability change. The dark kitchen had no independent ordering channel of its own — it was entirely dependent on aggregator visibility, which meant it was also entirely dependent on the aggregator's promotional algorithm to be shown to customers at all.

Every order through Zomato costs us ₹90–120 in commission. We have no idea who our customers are. The aggregator knows them. We know nothing — not their name, not their number, not what they ordered last time.

Owner · 8-outlet QSR chain, Delhi NCR

BEFORE

₹1.8L/mo

Paid to Zomato and Swiggy in commissions — on just ₹6L/month in delivery revenue

0

Customer records owned — every name, number, and order history lived inside the aggregator

12/week

Missed or wrong orders from phone and WhatsApp ordering across 8 outlets

48 hrs

Time to reflect a menu price change across all outlets via aggregator support ticket

PLATFORM WORKFLOW

How the platform works

Click any module to explore what was built

MODULE 01 OF 06

Customer Storefront

The customer opens the web app and their location is detected automatically. The platform maps their address to the nearest outlet that covers their delivery zone, shows live open/closed status, and loads that outlet's menu with real-time item availability — no dead checkout, no zone confusion.

  • Geolocation detects the customer's address and matches it to the correct outlet via PostGIS zone polygons
  • Live open/closed status based on outlet operating hours and holiday blackouts — visible before the customer starts browsing
  • Menu loaded per outlet with dietary tags (veg/non-veg/egg/Jain), item photos from GCS, and price variants
  • Item availability toggled by kitchen staff and reflected within seconds across all customer sessions
  • Multi-outlet overlap zones offer a branch selector; single-coverage areas go straight to the outlet
Progress
1 / 6

THE SYSTEM

What I built

I built a white-label food delivery web app scoped to the chain's exact structure: 8 physical outlets, one dark kitchen running two virtual brands, a shared rider pool, and a head office admin with full visibility across all of them.

**Customer storefront:** When a customer opens the web app, it detects their location and shows them the outlet that covers their delivery zone — or offers a list if they are in a multi-outlet overlap zone. The storefront shows the outlet's live open/closed status based on its configured operating hours and any manually set holiday blackouts. The menu loads with dietary tags (veg/non-veg/egg/Jain), item photos, price variants, and add-on groups. Item availability is managed at outlet level and reflects instantly — when the kitchen marks an item as unavailable, it disappears from the customer view within seconds, with no support ticket required.

**Cart, customisation, and payment:** Customers build their order with item-level customisation — portions, add-ons, special instructions. The cart shows itemised pricing, packaging charge, delivery fee (calculated by zone and distance slab), and the GST breakdown before payment. Razorpay handles payment — UPI, cards, net banking, and cash on delivery. On payment success, the order is created in the system and sent to the restaurant's live order board immediately. Every completed order generates a GST-compliant tax invoice — restaurant GSTIN, FSSAI licence number, HSN code 9963, CGST + SGST split — and delivers it to the customer by email.

**Restaurant order board and kitchen display:** Each outlet has a live order board that shows incoming orders with a sound alert, status controls (confirm → preparing → ready for pickup), and a preparation timer. Orders that are not confirmed within 3 minutes trigger an escalation alert to the outlet manager's phone. The board also shows the assigned rider and their live ETA to the restaurant. For the dark kitchen, each virtual brand has its own order queue on the same screen — the kitchen team sees both queues side by side, avoids double-counting the same item across two brand orders, and dispatches them under the correct brand packaging.

**Rider management and auto-dispatch:** Riders log into a mobile web interface, toggle duty on, and become visible to the dispatch engine. When an order is confirmed, BullMQ evaluates all on-duty riders in the outlet's zone, selects the nearest available one by straight-line distance to the restaurant, and fires an assignment push notification via Firebase FCM. The rider accepts, sees turn-by-turn directions to the restaurant, then to the customer. If no rider accepts within 90 seconds, the assignment cascades to the next nearest. Zone managers can override auto-assignment manually from the admin panel. Rider onboarding covers Aadhaar, PAN, and vehicle RC upload — documents stored in GCS — with approval controlled by the admin before the rider can go live.

**Real-time order tracking:** From the moment a rider picks up the order, the customer sees a live map. Rider location is broadcast via WebSocket every 5 seconds. The customer sees the rider move. The estimated delivery time updates dynamically. Status notifications fire at each stage — order confirmed, being prepared, picked up, arriving soon, delivered — via browser push notification and SMS.

**Multi-outlet and dark kitchen management:** Head office has a chain-wide admin panel. Every active order across all 8 outlets and the dark kitchen appears on a single live screen — outlet name, order ID, customer name, items, status, and assigned rider. Menu changes are made once and pushed to the selected outlet(s) instantly — no 48-hour support ticket. Operating hours, delivery zones, minimum order values, and delivery fees are configurable per outlet by zone managers without touching the codebase. The dark kitchen's two virtual brands each have independent menus, operating hours, and brand identities on the customer-facing app while sharing a single kitchen dispatch queue.

**Customer accounts and repeat ordering:** Customers create accounts with phone-verified OTP login. Order history is saved — a returning customer can reorder a previous basket in two taps. The system builds a first-party customer database with name, phone number, email, delivery address history, and order frequency. This database belongs to the restaurant. The owner can export it, segment it, and use it for WhatsApp or email campaigns — without any aggregator intermediary.

**Promotions engine:** The admin panel has a promotions module. The owner creates discount codes (percentage off, flat discount, free delivery, minimum order conditions, per-customer usage limits) and publishes them with a validity window. Codes are applied at cart and validated server-side before payment. A happy-hour pricing rule can be set to automatically drop delivery fees during specific hours. Combo deals can be configured as product bundles with a bundle price. None of this requires an aggregator — promotions run on the chain's own terms, targeting their own customer database.

**Analytics:** Restaurant owners see their own dashboard — hourly order volume, daily revenue trend, top 10 items by order count, average preparation time, and cancellation reasons. The platform admin sees across all outlets — revenue by outlet, rider utilisation by zone, delivery time distribution, peak-hour heatmaps, and refund rate. The bestseller ranking updates hourly, giving the kitchen team actionable data the same day rather than the next morning. All reports are filterable by date range and exportable.

Geolocation-based multi-outlet ordering

Customers enter their address and instantly see the outlet that covers their zone, its live open/closed status, and menu with real-time item availability — no outlet confusion, no dead checkout.

Auto-dispatch with live rider GPS

When an order is confirmed, the nearest on-duty rider in the zone is auto-assigned via BullMQ. The rider sees turn-by-turn directions. The customer sees the rider move on a live map in real time.

Chain operations dashboard

Head office sees every active order across all 8 outlets, per-outlet revenue and prep time, rider utilisation by zone, and a bestseller ranking that updates hourly — without calling a single outlet manager.

THE OUTCOME

What changed

The most direct impact was financial. Before the platform, every delivery order through Zomato or Swiggy cost 28–32% in commission. On ₹6L per month in delivery revenue, that was ₹1.68L–₹1.92L gone before any operating cost. On the direct channel, the only deduction is the Razorpay payment gateway fee — 1.8% per transaction. An order that previously earned the restaurant ₹700 net on a ₹1,000 order now earns ₹982.

The chain did not abandon the aggregators. The strategy was to shift repeat customers — people who had ordered more than twice — onto the direct channel. Within 90 days, 4,200 customer accounts had been created. Of those, 38% had placed a second or third order through the direct channel. The repeat order rate on Zomato for those same customers had been the aggregator's number — the chain had never known it. Now it did.

Missed and wrong orders collapsed from 12 per week across 8 outlets to a tracked, reviewed average of 1 per week. The live order board eliminated the verbal handoff between counter staff and kitchen. The auto-confirmation alert eliminated orders sitting unnoticed. The kitchen display eliminated the paper ticket that got lost during a peak-hour rush.

Menu management went from a 48-hour ticket-and-wait process to a 15-second task. During the first month, the chain ran a weekend combo offer — a change that previously would have required submitting a support request to both aggregators and waiting for it to propagate. On the direct channel, the combo went live at 10:00 AM on Saturday. By 10:02 AM it was showing on every customer's screen.

The dark kitchen's two virtual brands — which had previously been entirely invisible without aggregator promotion — now had a direct ordering page each. The owner ran WhatsApp campaigns to the 4,200 direct customers pointing them to the two brands. Within 60 days, the dark kitchen was generating 18% of its order volume from the direct channel with zero aggregator commission on that share.

The owner's morning routine changed. Previously the day started with checking Zomato Partner App for yesterday's numbers — separated by outlet, requiring manual addition to get a chain total. Now the admin dashboard opened with the previous day's revenue across all 8 outlets, the top 5 selling items across the chain, the delivery time average per zone, and a flag on any outlet where cancellation rate had exceeded 5%. A picture that previously took 45 minutes to assemble was visible in 10 seconds.

BEFORE28–32% (aggregator)
improved to
AFTER1.8% (payment gateway only)

Commission per delivery order

BEFORE0
improved to
AFTER4,200+ in first 90 days

Customer records owned

BEFORE12 across 8 outlets
improved to
AFTER1 — logged, reviewed, resolved

Missed or wrong orders per week

BEFORE48 hrs via support ticket
improved to
AFTERInstant — live across all outlets in seconds

Menu update time (price or availability)

BEFORE48 min (manual rider dispatch)
improved to
AFTER29 min (auto-dispatch + optimised zone assignment)

Average delivery time

BEFOREUnmeasured — no customer data
improved to
AFTER38% within 90 days of launch

Repeat order rate on direct channel

Want a system like this for your food-beverage organisation?

Get a quote for Food Delivery Management Platform
Get a Quote