Order lifecycle
An order moves through a fixed set of public statuses. They are stable across API versions even if GoOrder changes how restaurants work internally.
- placed Sent to the restaurant, waiting for it to accept
- confirmed Restaurant accepted
- preparing Being cooked
- ready Packed, waiting for the rider
- out_for_delivery Rider has it and is on the way
- delivered Handed to the customer
- placed Waiting for the restaurant
- confirmed Restaurant accepted
- preparing Being cooked
- ready Ready to collect
- completed Collected by the customer
- cancelled By you or the customer before the kitchen starts, or by the restaurant at any time
- partially_refunded · refunded Money returned after payment
Status reference
Section titled “Status reference”| Status | Who causes it | You can… |
|---|---|---|
placed | Order accepted by GoOrder, awaiting the restaurant (and payment for card orders) | Cancel, pay |
confirmed | The restaurant accepted it (manually or automatically) | Cancel |
preparing | The kitchen started | Track |
ready | Packed; waiting for the rider (delivery) or the customer (pickup) | Track |
out_for_delivery | A rider picked it up | Track the rider |
delivered | Delivery orders — handed over | — |
completed | Pickup orders — collected | — |
cancelled | By you, the customer, or the restaurant | — |
partially_refunded | Part of the payment was returned | — |
refunded | All of the payment was returned | — |
Cancelling
Section titled “Cancelling”POST /orders/{order_id}/cancel succeeds while the order is placed or confirmed. After the kitchen starts it returns 409 order_not_cancellable — contact the restaurant or GoOrder support instead.
Card orders that were already paid when cancelled are reviewed by GoOrder support for refund; you are notified through the order.refunded webhook when money is returned.
Tracking
Section titled “Tracking”GET /orders/{order_id}/tracking{ "data": { "order_id": "66f1…", "status": "out_for_delivery", "fulfilment": "delivery", "timeline": [ { "status": "placed", "at": "2026-10-12T09:30:00.000Z" }, { "status": "confirmed", "at": "2026-10-12T09:31:10.000Z" }, { "status": "preparing", "at": "2026-10-12T09:33:40.000Z" }, { "status": "out_for_delivery", "at": "2026-10-12T09:52:05.000Z" } ], "rider": { "name": "Imran", "phone": "+9715…", "vehicle": "bike", "location": { "lat": 25.083, "lng": 55.141, "updated_at": "2026-10-12T09:55:20.000Z" } } }}riderisnulluntil a rider is assigned and the order is being prepared or delivered.location.updated_attells you how fresh the position is. If it is older than a minute, show the last known point rather than an animated marker.- Prefer webhooks for status; poll
/trackingonly to move a map, and no more than every 10–15 seconds.
Order of events
Section titled “Order of events”Webhooks for one order are sent in the order things happen, but delivery can be retried, so do not assume arrival order. Compare data.order.updated_at or the status itself, and treat handlers as idempotent — see Webhooks.