Skip to content

Order Lifecycle

Cart → Reserved → Payment → Paid → Fulfilled
↓ ↓
declined → Cart refunded → Paid
StatusDescriptionNext
pendingOrder created, awaiting paymentconfirmed, cancelled
confirmedPayment receivedprocessing, on_hold, cancelled
processingBeing preparedcompleted, on_hold
on_holdManual reviewprocessing, cancelled
completedShipped and deliveredrefunded
cancelledCancelled
refundedPayment refunded
  1. POST /checkout/initiate — calculate tax, shipping rates
  2. POST /checkout/complete — create order, payment intent
  3. Client confirms payment (Stripe/Airwallex)
  4. POST /checkout/confirm — verify payment, finalize order

Orders can be partially or fully fulfilled:

Terminal window
POST /api/v1/orders/:id/fulfillments
{
"tracking_number": "1Z999AA10123456784",
"carrier": "UPS",
"items": [
{ "order_item_id": "uuid", "quantity": 2 }
]
}

Multiple fulfillments per order for split shipments.

Order state changes emit events:

  • order.created
  • order.paid
  • order.shipped
  • order.completed
  • order.cancelled
  • order.refunded

Events trigger webhooks, emails, and analytics.

Inventory is reserved when the order is created and decremented when fulfilled. Cancelled orders release the reservation.