One record per delivery against a purchase order: what came in, to where, on what date, at what cost, and the supplier invoice that billed it. Recording a receipt moves stock, so it requires an Idempotency-Key; voiding one reverses the movement instead of editing a number back down. The invoice and the received date can be corrected afterwards, since they move nothing. GET /v2/receipts lists every receipt in the store, across orders.
Books a delivery against the order: quantities per line, rejected units and their disposition, per-line cost corrections, bins and lots, plus unordered items that arrived. Stock is written to Shopify from a queue; the receipt's shopify_sync says when it landed. Over-delivery follows the store's setting. Requires an Idempotency-Key header.
Path
idintegerpathrequired
Headers
Idempotency-Keystringheaderrequired
Unique per request, up to 255 characters. The same key with the same body replays the stored response; with a different body it is 409 idempotency_key_reused.
BodyJSON
location_idintegerrequired
Shopify location the goods arrived at.
received_atstring (date) or null
notestring or null
invoice_referencestring or null
invoice_totalnumber or string or null
invoice_datestring (date) or null
exchange_ratenumber or null
Store currency per 1 unit of the order currency, if it differs from the order's.
route_to_destinationsboolean or null
Receive each line at its own location_id instead of one location.
rejected_dispositionstring or null
What happens to rejected units - keep them outstanding for a replacement, or remove them from the order.
replaceremove
linesarray of objectrequired
Every line to receive against. Zero quantity is allowed (nothing arrived on that line).
line_idintegerrequired
quantitynumberrequired
rejectedinteger or null
unit_costnumber or string or null
A receive-time cost correction.
bin_locationstring or null
lot_numberstring or null
lot_expirystring (date) or null
lot_manufacturedstring (date) or null
lot_idinteger or null
unorderedarray of object
Items that arrived without a line. Added to the order and received in one step. Named the same way as order lines: an id, or a sku, barcode or supplier_sku matched to the catalog.
variant_idinteger or null
inventory_item_idinteger or null
product_titlestring or null
variant_titlestring or null
skustring or null
barcodestring or null
supplier_skustring or null
quantitynumberrequired
unit_costnumber or string or null
Responses
201
The order after the receipt, with the receipt embedded in receipts.
Attach or correct the supplier invoice for a delivery - its number, total and date - and correct the date the goods were received. The invoice usually arrives days after the goods; this is where an accounts-payable system records it. Nothing moves: quantities, costs and Shopify stock are untouched, so it works on received and closed orders too.
Partial: a field you leave out keeps its value, and null clears it. The order's history records the change, and a receipt.updated webhook goes out. Refused with 422 receipt_voided on a voided receipt, 422 return_receipt for the invoice fields on a return's shipment (a return carries a credit note on the return itself), and 422 invalid_transition on an archived order. A future received_at is refused; a future invoice_date is not.
Path
idintegerpathrequired
receipt_idintegerpathrequired
BodyJSON
received_atstring (date)
The day the goods arrived, in the store's time zone. Not in the future.
Reverses the receipt - quantities return to outstanding and the stock movement is reversed in Shopify. The receipt stays in the list with voided_at set.
Every delivery across every order, oldest update first. A new receipt, a void and an invoice or date correction each move updated_at, so polling with updated_at_min set to the time before your last walk is a change feed. Voided receipts stay in the list with voided_at set.
Each row carries its order's number, type and supplier in purchase_order, so posting a bill needs no second call. Filter by purchase_order_id, supplier_id, location_id (Shopify id), type, received_at_min / received_at_max (the day the goods arrived), voided, invoiced (false lists the deliveries still waiting for an invoice) and invoice_reference (exact, case-insensitive).
Query
limitintegerquery
cursorstringquery
next_cursor from the previous page. A cursor that cannot be read is 400 invalid_cursor.
updated_at_minstring (date-time)query
updated_at_maxstring (date-time)query
created_at_minstring (date-time)query
created_at_maxstring (date-time)query
purchase_order_idintegerquery
supplier_idintegerquery
location_idintegerquery
typestringquery
purchasereturn
received_at_minstring (date-time)query
received_at_maxstring (date-time)query
voidedstringquery
truefalse
invoicedstringquery
false: no invoice number recorded yet. true: one is.
truefalse
invoice_referencestringquery
Responses
200
A page of receipts, oldest update first.
a page of ReceiptListItem in data, with next_cursor and has_more