01When does it fire?
- On every real status transition of an existing order — from any path (dashboard, POS, API, payment confirmations).
- A same-value write generates no event — the transition must be real.
- The transition system legally allows returning to an old status (CONFIRMED then PENDING then CONFIRMED again) — the sequence number, not the status pair, is what makes each transition unique.
02Full payload example
{
"order_id": "3f0c8e6a-1d24-4b7f-9a3e-2c5b8d90f1aa",
"receipt_number": "RCP-20261020-1482",
"order_type": "DELIVERY",
"order_source": "WEBSITE",
"status": "SHIPPED",
"customer_name": "Ahmed Mahmoud",
"customer_phone": "+201001234567",
"delivery_address": "15 El-Tahrir St., Dokki, Giza",
"table_number": null,
"branch_id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
"payment_method": "COD",
"coupon_code": "WELCOME10",
"total_amount": 624,
"tax_amount": 62,
"shipping_fee": 50,
"discount_amount": 50,
"created_at": "2026-10-20T12:34:56.789147+00:00",
"items": [
{
"product_id": "7a2b9c4e-8f31-4d5a-b6c2-1e9f8a7b6c5d",
"variant_id": "2c4e6f8a-0b1d-4e2f-8a3b-5c6d7e8f9a0b",
"name": "Cotton T-shirt - Blue / L",
"price": 225,
"quantity": 2
},
{
"product_id": "9d8c7b6a-5f4e-4d3c-2b1a-0f9e8d7c6b5a",
"variant_id": null,
"name": "Summer cap",
"price": 112,
"quantity": 1
}
],
"items_truncated": false,
"previous_status": "CONFIRMED",
"changed_at": "2026-10-20T13:05:11.402318+00:00",
"id": "mwh:order-status:9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b:3f0c8e6a-1d24-4b7f-9a3e-2c5b8d90f1aa:2",
"type": "order.status_changed",
"api_version": "v2",
"tenant_id": "9e8d7c6b-5a4f-4e3d-2c1b-0a9f8e7d6c5b"
}03Payload fields
| Field | Can be null? | Meaning |
|---|---|---|
| previous_status | No | The order status before the transition. |
| status | No | The order status after the transition. |
| changed_at | No | The change time, ISO 8601. |
04Event identity
Pattern: mwh:order-status:<tenant_id>:<order_id>:<seq> — note the historical order-status prefix (NOT order-status-changed), kept as-is because working consumers build dedupe on it. <seq> is the per-order status-transition ordinal (1, 2, 3…). The emitter serializes same-order writes on the order row lock — the count is a stable monotonic identity.
COMPLETE YOUR INTEGRATION
