Idempotency-Key is required. Reusing a key with the same body returns the original response; reusing it with another body is rejected. Generate a durable key for each intended transition and persist it until the request has completed.
Canonical status lifecycle
The current canonical values are:receivedacceptedin_preparationawaiting_shipmentawaiting_collectionin_deliverycompletedrejectedcancelleddelivery_failed
received is created by Chataigne and cannot be submitted as a target. Completed, rejected, cancelled, and failed delivery states are terminal. awaiting_collection is not valid for delivery orders; awaiting_shipment is not valid for collection orders. A transition outside the allowed lifecycle is rejected.
Submitting the order’s current status is a successful no-op. It does not increment
status_version or emit a duplicate status event.Bidirectional updates
Status changes can originate from the POS, Chataigne operators, scheduled automation, the ordering flow, or a delivery provider. Every accepted transition passes through the same state machine, becomes the canonical order status, and incrementsstatus_version.
Use status_version to reject stale webhook updates in your system. Webhook delivery is at least once and can occur out of order after retries. A payload with a version lower than or equal to the highest version already processed for that order can be acknowledged and ignored.
When a POS integration or API receiver submits a status, Chataigne applies the first valid transition that reaches the database. A concurrent writer that observed the previous version receives 409 order_status_conflict; it must retrieve the current order before deciding whether to retry. Accepted order.status.updated events are delivered to the primary receiver and subscribed observers, including when the source is a synchronous POS.
Conflict handling
A
2xx webhook response only acknowledges receipt. If your POS cannot accept an order, acknowledge the webhook, then submit rejected through the status endpoint with a durable idempotency key and an optional reason.