New event (June 2026). Born directly in v1 — no v0 shape exists.
order.status_updated fires when the KDS (Kitchen Display System) reports that an order advanced its kitchen status: preparation started (preparing), it is ready (ready) or it was dispatched (dispatched).
Fire receives the KDS report through the inbound status webhook, validates that it references an event Fire emitted for that order, applies an anti-regression gate (a status never goes backwards: dispatched does not return to ready) and only then emits this event. That is why you receive one event per real advance — no duplicates, no rollbacks.
Trigger condition
Fire emitsorder.status_updated when all of the following are true:
- The KDS reported a kitchen status for an existing order
- The status advances the journey (anti-regression gate:
preparing→ready→dispatched) - The report passed the source-of-truth validation (it references an event Fire emitted for that order)
| Coverage | All countries |
| Statuses | preparing → ready → dispatched (monotonic) |
| Idempotency key | event.id |
| Fires more than once | Once per status advance (max 3 per order); retries share event.id |
| Data source | kitchen.source — only kds today; the field stays open for future sources |
What’s in data
This is a lean (thin) payload — unlike order.completed, it does not carry the full order. It carries what you need to act on a status change: the order’s identity, minimal channel / store refs, the fulfillment type, and the kitchen block (the advance + the full journey). It deliberately omits orderLines, payments, taxes, client, device and the delivery address — you already received those in order.completed; match by orderId / externalOrderId and apply the change.
Identity & context
Fire’s order UUID — match against the
order.completed you received.Human-readable order code.
The order’s id in the channel/aggregator — use it to match on their side.
Business status of the order (
COMPLETED / CANCELLED). Context — the kitchen journey is parallel.code (canonical, always present — e.g. 99) and uid. The human-readable channel name comes from your channel catalog, not from this event.Minimal store ref:
code, name, plus account { uid, name } and vendor { uid, name }.service.code — DELIVERY or PICKUP. Gives the status its meaning (a ready for delivery vs pickup).The kitchen block
The advance that fired the event + the full journey. Distinct from the
kds block (static order info captured at injection).Typical use cases
- Customer order tracking — “your order is ready” on the app or pickup screen
- Notify the aggregator — tell iFood/Rappi/99food the order is ready for the courier
- Kitchen metrics — preparing→ready times per store/station from
history
What it does NOT do
- It does not change the order status.
data.statusremains"COMPLETED"— the kitchen journey is parallel to the payment/invoicing lifecycle. - It never goes backwards. If the KDS reports
readyafterdispatched, Fire discards it (anti-regression gate) and emits nothing. - It does not replace
order.completed. Subscribe to both:order.completedfor the business fact,order.status_updatedfor physical progress.

