Timeline: Order arrives on kitchen display β Preparation β Status updates β Order served
Services Involved: Order Service, Notification Service
Key Actors: Kitchen staff, chefs, order tracker
This workflow describes how kitchen staff process orders from receiving to serving, with real-time status updates throughout preparation.
Kitchen Display System (KDS) at:
- Kitchen counter
- Tablet/monitor showing orders
- Sound alert: Beep! Beep!
Display shows new order:
βββββββββββββββββββββββββββββββ
β π΄ NEW ORDER β
βββββββββββββββββββββββββββββββ€
β ORDER #XYZ β
β Table 5 β
βββββββββββββββββββββββββββββββ€
β 2x Butter Chicken (15 mins) β
β 3x Naan (10 mins) β
β Special Req: Extra spicy β
βββββββββββββββββββββββββββββββ€
β Total: βΉ1,250 β
β Payment: PAID β β
β β
β STATUS: RECEIVED β
β [START COOKING] β
βββββββββββββββββββββββββββββββ
Sound: "New order! Table 5!"
Staff immediately know:
β Order number: XYZ
β Table number: 5
β What to cook
β Estimated times
β Payment confirmed
Kitchen staff clicks or taps: [START COOKING] button
Action initiates:
POST /api/orders/order-xyz/status-update
Headers:
Authorization: Bearer <kitchen_staff_token>
X-Tenant-ID: 11111111-1111-1111-1111-111111111111
Body:
{
"new_status": "PREPARING",
"notes": "Started cooking - 2 Butter Chicken, 3 Naan"
}
1. Receive status update request
2. Validate:
- Order exists? β
- Is staff authorized? β
- Valid status transition? RECEIVED β PREPARING β
3. Update database:
UPDATE orders
SET overall_status = 'PREPARING',
status_updated_at = now(),
started_by = 'kitchen_staff1'
WHERE id = 'order-xyz'
4. Publish Kafka event: order.status_changed
{
"event": "order.status_changed",
"order_id": "order-xyz",
"from_status": "RECEIVED",
"to_status": "PREPARING",
"updated_by": "kitchen_staff1",
"timestamp": "2024-10-22T19:08:05Z"
}
Event subscribers:
1. Customer notified
2. Kitchen display updates
3. Waiter/manager dashboard updates
Notification Service:
SMS: "Your order #XYZ at Spice Route is being prepared.
Est. ready in 15 minutes. π³"
Sent via Twilio: 1-3 seconds
Customer sees food is being cooked β
Order on display changes:
Before:
βββββββββββββββββββββββββββββββ
β π΄ NEW ORDER β
β [START COOKING] β
βββββββββββββββββββββββββββββββ
After:
βββββββββββββββββββββββββββββββ
β π‘ PREPARING β
β Started at 7:08 PM β
β Est. ready: 7:23 PM β
β 15 minutes remaining β
β [READY] [CANCEL] β
βββββββββββββββββββββββββββββββ
Color change: Red β Yellow
Staff know: Order is actively being cooked
7:08:30 - Naan section starts 3x Naan
"Going into tandoor, 10 minutes"
7:09:00 - Sauce section starts Butter Chicken sauce
"Onions and tomatoes going in"
7:10:00 - Protein section boils chicken
"Raw chicken in water, 8 mins to boil"
7:15:00 - Naan ready (10 mins elapsed)
Takes out of tandoor, puts on plate
Kitchen staff thinks: "First item ready, mark in system"
7:16:00 - Chicken boiled
Transfers to ghee sauce
"Simmering now, 5 more minutes"
7:18:00 - Sauce done, chicken finalized
"Butter chicken ready!"
7:20:00 - Final plating
Both items ready, placed on table
"Order complete!"
When Naan finishes (7:15 PM):
Kitchen staff clicks on dish:
"3x Naan" β taps [ITEM READY]
POST /api/orders/order-xyz/items/item-status-update
Body:
{
"item_id": "item-456", // Naan item
"status": "ITEM_READY",
"completed_at": "2024-10-22T19:15:00Z",
"prepared_by": "chef_ravi"
}
Kitchen Display updates:
βββββββββββββββββββββββββββββββ
β π‘ PREPARING β
β [β] 3x Naan (ready) β
β [β±οΈ] 2x Butter Chicken (5m) β
β Overall: 7 mins remaining β
βββββββββββββββββββββββββββββββ
When Butter Chicken finishes (7:20 PM):
Kitchen staff marks last item ready:
POST /api/orders/order-xyz/items/item-status-update
Body:
{
"item_id": "item-789",
"status": "ITEM_READY",
"completed_at": "2024-10-22T19:20:00Z",
"prepared_by": "chef_akshay"
}
All items complete!
Order Service checks: All items marked ITEM_READY?
YES β β Update order status to READY
Order Service logic:
1. Check: Are ALL items in order marked ITEM_READY?
2. Query:
SELECT COUNT(*) as total_items,
COUNT(CASE WHEN status = 'ITEM_READY' THEN 1 END) as ready_items
FROM order_items
WHERE order_id = 'order-xyz'
3. Result: total_items = 2, ready_items = 2 β
4. All items ready!
5. Update order:
UPDATE orders
SET overall_status = 'READY',
ready_at = now()
WHERE id = 'order-xyz'
6. Publish Kafka event: order.status_changed
{
"event": "order.status_changed",
"order_id": "order-xyz",
"from_status": "PREPARING",
"to_status": "READY",
"timestamp": "2024-10-22T19:20:05Z"
}
Order display changes:
Before:
βββββββββββββββββββββββββββββββ
β π‘ PREPARING β
β [β] 3x Naan (ready) β
β [β] 2x Butter Chicken (r) β
βββββββββββββββββββββββββββββββ
After:
βββββββββββββββββββββββββββββββ
β π’ READY FOR PICKUP! β
β Table 5 β
β ORDER #XYZ β
β β
β [β] All items prepared β
β Ready time: 7:20 PM β
β Total time: 12 minutes β
β β
β [SERVED] [CANCEL] β
βββββββββββββββββββββββββββββββ
SOUND ALERT: "Ding! Order ready for table 5!"
Notification Service publishes to waiter:
Dashboard or SMS alert:
"Order #XYZ ready for pickup at Table 5"
Waiter app shows:
β Order XYZ
β Table 5
β Ready now
β Tap to confirm pickup
SMS from Notification Service:
"Your order #XYZ is ready! Please come pick it up.
π½οΈ Table 5 at Spice Route"
Customer sees: Food is ready now!
Waiter goes to kitchen counter
Sees order #XYZ plated and ready
Picks up plates
Carries to Table 5
Serves to customer
Asks: "Enjoy your meal!"
Kitchen staff or waiter taps: [SERVED]
POST /api/orders/order-xyz/status-update
Headers:
Authorization: Bearer <waiter_token>
Body:
{
"new_status": "SERVED",
"notes": "Served at table",
"served_by": "waiter_priya"
}
1. Order Service updates:
UPDATE orders
SET overall_status = 'SERVED',
served_at = now(),
served_by = 'waiter_priya'
WHERE id = 'order-xyz'
2. Publish Kafka event: order.status_changed
{
"event": "order.status_changed",
"order_id": "order-xyz",
"from_status": "READY",
"to_status": "SERVED",
"timestamp": "2024-10-22T19:22:00Z"
}
3. Kitchen Display removes order:
Order disappears from "Ready" section
(or shows as "SERVED - Complete")
7:18 PM - Chef realizes Butter Chicken needs 5 more minutes
(cream didn't reduce enough)
Chef action:
POST /api/orders/order-xyz/notes-update
Body:
{
"note": "Butter Chicken needs 5 more minutes - cream reducing",
"delay_estimate": 5
}
Kitchen Display updates:
βββββββββββββββββββββββββββββββ
β β±οΈ DELAYED (5 mins extra) β
β Reason: Sauce reduction β
β New ETA: 7:25 PM β
βββββββββββββββββββββββββββββββ
Notification Service notifies:
- Waiter: "XYZ delayed 5 mins - 7:25 PM ready"
- Customer: "Your order will be ready in 5 more minutes"
7:10 PM - Chef realizes Butter is running low
"We're out of butter!"
Chef can't complete Butter Chicken without butter
Chef/Manager action:
POST /api/orders/order-xyz/item-status-update
Body:
{
"item_id": "item-789",
"status": "ITEM_ISSUE",
"issue_type": "OUT_OF_STOCK",
"message": "Butter unavailable - cannot prepare"
}
Order Service detects issue:
β Updates order to "ON_HOLD"
β Notifies manager & customer
β Manager decides: refund, substitute, or wait
β Inventory team rushes replacement butter
7:12 PM - Customer comes to order counter
"Cancel my order, I'm leaving!"
Waiter calls Order Service:
PATCH /api/orders/order-xyz/cancel
Body:
{
"reason": "Customer request"
}
Order Service:
1. Check status: PREPARING
2. Safe to cancel? YES (not yet served)
3. Update order:
UPDATE orders
SET overall_status = 'CANCELLED',
cancelled_at = now(),
cancellation_reason = 'customer_request'
WHERE id = 'order-xyz'
4. Kitchen Display removes order
Alert: "ORDER CANCELLED #XYZ"
(removes from active queue)
5. Chef stops cooking:
"Forget Butter Chicken XYZ, order cancelled"
6. Payment Service issues refund
7. Notification Service sends SMS:
"Your order has been cancelled. Refund processed."
Kitchen Display shows queue:
[PRIORITY 1]
βββββββββββββββββββββββββββββββ
β π΄ NEW - ORDER #PQR β
β Table 3 - VIP Customer β
β 2x Biryani (20 mins) β
β Priority: HIGH β
βββββββββββββββββββββββββββββββ€
β [START COOKING] β
βββββββββββββββββββββββββββββββ
[PRIORITY 2]
βββββββββββββββββββββββββββββββ
β π‘ PREPARING - ORDER #XYZ β
β Table 5 β
β 2x Butter Chicken (5 mins) β
β Progress: 85% done β
βββββββββββββββββββββββββββββββ
[PRIORITY 3]
βββββββββββββββββββββββββββββββ
β π‘ PREPARING - ORDER #ABC β
β Table 2 β
β 3x Naan (15 mins) β
β Progress: 40% done β
βββββββββββββββββββββββββββββββ
Chef sees: XYZ finishing soon (5 mins) = HIGH
PQR just arrived = HIGH
ABC has time = MEDIUM
Chef prioritizes: Finish XYZ β Start PQR β Continue ABC
Customer signals waiter: "Bill please"
Waiter goes to register
POST /api/orders/order-xyz/status-update
Body:
{
"new_status": "COMPLETED",
"notes": "Customer finished eating, bill settled",
"completed_by": "waiter_priya",
"paid_at": "2024-10-22T21:50:00Z"
}
Order Service:
1. Update:
UPDATE orders
SET overall_status = 'COMPLETED',
completed_at = now(),
completed_by = 'waiter_priya'
WHERE id = 'order-xyz'
2. Publish Kafka event: order.completed
{
"event": "order.completed",
"order_id": "order-xyz",
"total_time_minutes": 102,
"timestamp": "2024-10-22T21:50:00Z"
}
3. Analytics Service records:
- Order duration: 102 minutes
- Total revenue: βΉ1,250
- Payment method: RAZORPAY
- Customer satisfaction data
Order #XYZ marked as COMPLETED
- Removed from active queue
- Added to "Completed Orders" section
- Archived for record-keeping
- Shows in end-of-day report
Dashboard shows:
ββββββββββββββββββββββββββββββββββ
β KITCHEN STATUS - 7:45 PM β
ββββββββββββββββββββββββββββββββββ€
β Active Orders: 7 β
β ββ New (Received): 1 β
β ββ Preparing: 4 β
β ββ Ready (waiting pickup): 2 β
β β
β Recent Completions: β
β β Order #ABC (12 mins) β
β β Order #DEF (14 mins) β
β β
β Average Cook Time: 13 mins β
β Efficiency: 95% β
ββββββββββββββββββββββββββββββββββ
Completed Orders Today:
- 7:20 PM: #XYZ (12 mins) - Table 5
- 7:25 PM: #ABC (14 mins) - Table 2
- 7:30 PM: #DEF (15 mins) - Table 8
- 7:35 PM: #GHI (11 mins) - Table 1
...
(Total: 156 orders completed today)
| Metric | Time | Target |
|---|---|---|
| Order received to cooking started | 1-3 min | < 5 min |
| Cooking time (avg) | 13-15 min | < 20 min |
| Ready to served | 2-5 min | < 10 min |
| Order cancelled | < 30 sec | < 1 min |
| Item status update | < 10 sec | < 30 sec |
| Issue | Detection | Action |
|---|---|---|
| Order not received by kitchen | Manual check | Resend/push notification |
| Long cooking time | Timer expires | Alert manager, check status |
| Item quality issue | Chef inspection | Cancel item, refund, substitute |
| Kitchen crashes | System monitor | Alerts all staff, manual backup |
| Order double-prepared | Validation check | Cancel duplicate, use first prep |
See Also:
- ORDER_SERVICE.md - Order status details
- ORDERING_WORKFLOW.md - Complete customer journey
- NOTIFICATION_SERVICE.md - Alert system