Skip to main content

Overview

An order is a placed purchase. It’s created by completing a Cart and holds its own copy of everything the customer agreed to — items, prices, taxes, discounts and delivery. Anything your storefront stored in the cart’s metadata is copied onto the order too, including onto every order of a checkout split between sellers.

Order attributes

Every amount comes in two forms: total is the raw value ("135.60") and display_total is formatted for the currency ("$135.60"). Render the display_ one.

Statuses

An order tracks payment and delivery separately, because they genuinely move at different speeds. An order can be paid but not yet sent, or sent and later partly refunded. payment_status fulfillment_status A canceled parcel is ignored while others are still live, so an order whose second parcel was recalled is described by the first. delivered means every parcel arrived. A fulfillment that travels as several consignments — a machine in three boxes, a pallet under one freight number — is only delivered when the last of them lands, and the order follows from there. See where the parcel actually is. Both are worked out automatically from the order’s payments, refunds and fulfillments. You change an order’s status by acting on those — taking a payment, sending a parcel, issuing a refund — never by setting the status yourself.

Reading an order

A customer can fetch their own order; guests use the order token they got at checkout.

Managing orders

Back-office work happens through the Admin API.
Canceling always puts stock back — the goods are not going out either way — and every payment is settled at the gateway. What that means is the gateway’s decision: an authorization it never drew on is released, and a captured charge it cannot release is refunded instead. On a split checkout one payment is shared across several orders, so what comes back is this order’s own share, drawn from each payment in turn until it is met. refund_amount names part of that share to return, keeping a restocking fee back, say. It is refused on an ordinary order rather than ignored: the gateway returns the whole captured payment there, so a cap could not be honoured, and accepting one would refund everything while you believed part was held back. It records who canceled, and optionally why: the reason comes from a list you manage yourself under Settings, so it can say what your team actually means. A staff-facing note can go alongside it.

Orders don’t change quietly

A placed order is meant to stay put. Its items and prices are written when the cart is completed and then left alone, so an order keeps saying what the customer actually agreed to — even if a product’s price changes the next day. Where admin edits are allowed, totals are re-added from the order’s existing rows rather than worked out again from scratch. Editing an order must never quietly re-apply today’s promotions and hand the customer a different discount than the one they accepted.

Money on an order

Tax, discounts and fees are kept as separate records, so you can ask what tax was charged without picking through a mixed list. See Order totals.

Events

Orders publish events — order.placed, order.canceled, order.paid and more — which also reach webhooks. This is the right way to push orders to another system, trigger fulfillment, or start an email flow.