Skip to content

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.

Delivery orders
  1. placed Sent to the restaurant, waiting for it to accept
  2. confirmed Restaurant accepted
  3. preparing Being cooked
  4. ready Packed, waiting for the rider
  5. out_for_delivery Rider has it and is on the way
  6. delivered Handed to the customer
Pickup orders
  1. placed Waiting for the restaurant
  2. confirmed Restaurant accepted
  3. preparing Being cooked
  4. ready Ready to collect
  5. completed Collected by the customer
Can also happen
  • cancelled By you or the customer before the kitchen starts, or by the restaurant at any time
  • partially_refunded · refunded Money returned after payment
StatusWho causes itYou can…
placedOrder accepted by GoOrder, awaiting the restaurant (and payment for card orders)Cancel, pay
confirmedThe restaurant accepted it (manually or automatically)Cancel
preparingThe kitchen startedTrack
readyPacked; waiting for the rider (delivery) or the customer (pickup)Track
out_for_deliveryA rider picked it upTrack the rider
deliveredDelivery orders — handed over—
completedPickup orders — collected—
cancelledBy you, the customer, or the restaurant—
partially_refundedPart of the payment was returned—
refundedAll of the payment was returned—

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.

Terminal window
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" }
}
}
}
  • rider is null until a rider is assigned and the order is being prepared or delivered.
  • location.updated_at tells 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 /tracking only to move a map, and no more than every 10–15 seconds.

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.