PurchaseOrderDetail
The purchase order returned by the create, update and cancel endpoints, with its line items. It is the response body itself, not wrapped in a purchase_order key as the read endpoints return it. Only is_editable and is_cancellable describe actions an API key can take; the other is_* flags describe what the merchant can do in the Bookkeep app.
The purchase order's unique identifier. Use it in the purchase order paths.
9a1e3b7c-1e3d-4a3f-9f2e-9c6b6e2a2b11The purchase order number the merchant sees in Bookkeep. Numbers are assigned per store, start at 1001 unless the merchant chose a different starting number, and can have gaps.
1042Name of the supplier the purchase order is placed with.
Acme SupplyAn optional name the merchant gave the purchase order. Often null.
nullOne of draft, ordered, partial, received, committed or cancelled, or, for stores that receive stock through Shopify transfers, in_transit, partially_transferred or transferred. See Purchase order statuses in the Inventory API overview for what each means. Purchase orders created through this API start as draft.
draftThe Shopify location the stock is delivered to, as a Shopify location ID (gid://shopify/Location/<id>). You can look these IDs up with the Shopify Admin GraphQL API.
gid://shopify/Location/73986408603Name of the destination location, as it appears in Shopify. Bookkeep looks it up from destination_location_id. It is null if Bookkeep cannot find the name.
Main WarehousePayment terms agreed with the supplier. Typically one of prepaid, upon_receipt, net_7, net_15, net_30, net_45, net_60, net_90 or net_120, but it is free text, so older purchase orders can hold other values.
nullThe date the merchant expects the stock to arrive.
nullThe date the order was placed with the supplier.
nullThe date the supplier shipped the order.
nullThe date the order was cancelled.
nullThe carrier delivering the order.
nullThe carrier's tracking number.
nullA reference the merchant can add for their own tracking. It also appears on printed purchase orders.
nullThe supplier's own number for this order.
nullThe number on the supplier's invoice for this order.
nullA note on the purchase order.
nullTags the merchant uses to group purchase orders.
[]Shipping cost for the order.
0Total tax on the order's lines: the sum of each line's unit_cost times quantity_ordered times its tax_percent / 100. Always calculated by Bookkeep from the lines; you cannot set it.
4.5Sum of each line's unit_cost times quantity_ordered, before tax. Always calculated by Bookkeep from the lines; you cannot set it.
45Order total. For a purchase order created through this API, or whose lines are changed through it, Bookkeep sets it to subtotal plus tax_amount. A purchase order saved in the Bookkeep app keeps the total the app saved, so it can differ from subtotal plus tax_amount.
49.5Extra data saved with the purchase order. On create you can send any JSON object here.
{}Where the purchase order was created, for example bookkeep for the Bookkeep app or partner_api for this API.
partner_apiISO 4217 currency code for all amounts on the purchase order.
USDWhether the merchant archived the purchase order in Bookkeep.
falseProgress of updating incoming stock in Shopify for this purchase order: pending_sync, syncing, synced or sync_failed. A new draft shows pending_sync; Shopify is only updated once the purchase order leaves draft.
pending_syncWhy the last incoming stock update failed or skipped items, for example a line whose item no longer exists in Shopify. Null when there is nothing to report.
nullunbilled, partially_billed or billed: how many of the purchase order's committed receipts are on a bill that is posted to the merchant's accounting platform (none, some or all). Only posted bills count, so a bill that failed to post leaves the purchase order unbilled.
unbilledNumber of bills created from this purchase order's receipts, in any state, including bills not yet posted or that failed to post. It can be above zero while bill_status is still unbilled.
0How stock on this purchase order reaches the store, set from the merchant's Bookkeep settings when the purchase order is created. standard: the merchant records receipts in Bookkeep. shopify_transfers: Bookkeep sends the order to Shopify as one inventory transfer per destination location, and the stores receive it in Shopify (see transfers).
Possible values: [standard, shopify_transfers]
standardTrue while the status is draft. Only then can you change the line items with PATCH.
trueTrue when the purchase order can be cancelled now: a draft or ordered purchase order with no receipts whose incoming stock has not been updated in Shopify, or an in_transit purchase order none of whose transfers has been created in Shopify and whose transfers are not still syncing.
trueWhether the merchant can move the purchase order back to draft in the Bookkeep app. An API key cannot do this.
falseWhether the merchant can still edit notes and costs in the Bookkeep app. True for ordered, partial, in_transit and partially_transferred. An API key cannot make this edit.
falseAlways the same as is_note_editable: one restricted edit in the Bookkeep app covers both notes and costs.
falseWhether the merchant can delete the purchase order in the Bookkeep app. An API key cannot delete purchase orders.
falsecatalog_sync_warnings object[]
Present only when one or more line items could not be matched to a product in your Shopify store. The purchase order is still saved; check the listed lines.
line_items object[]
The line item's ID. Send it on PATCH to change or remove this line.
1The identifier you sent for this line, if any. Unique within the purchase order.
nullThe product's SKU in the merchant's Shopify store.
TSHIRT-BLK-MThe item's barcode.
nullProduct title.
WidgetThe product image from the Shopify store.
nullCost per unit, in the purchase order's currency.
4.5unit_cost times quantity_ordered, before tax.
45The Shopify product ID (gid://shopify/Product/<id>). You can look these IDs up with the Shopify Admin GraphQL API.
gid://shopify/Product/1The Shopify product variant ID (gid://shopify/ProductVariant/<id>). You can look these IDs up with the Shopify Admin GraphQL API.
gid://shopify/ProductVariant/1The Shopify location for this line (gid://shopify/Location/<id>).
gid://shopify/Location/1Name of the line's location.
Main WarehouseTax rate for the line as a percentage, returned as a string, for example "8.25" for 8.25%.
0.0The supplier's own code for this item.
nullA note on this line.
nullThe variant's title, for example a size or colour.
Default TitleNumber of units ordered.
10The Shopify inventory item ID (gid://shopify/InventoryItem/<id>). You can look these IDs up with the Shopify Admin GraphQL API.
gid://shopify/InventoryItem/1Display order of the line on the purchase order.
1True when the line was added while receiving stock, not when the order was placed.
falsevariant_supplier_cost objectnullable
This item's entry in the supplier's price list in Bookkeep: the supplier's SKU, prices and pack details. Null when none is recorded.
The Shopify inventory item the entry is for, as the number only, without the gid://shopify/InventoryItem/ prefix the line's own inventory_item_id has.
46217359098139The supplier's code for the item.
SUP-WIDGET-1The price on the supplier's price list.
4.5The unit cost most recently paid for the item.
4.5Currency of supplier_price and last_cost.
USDWhether this supplier is the item's default supplier.
trueUnits per pack when ordering.
1Unit the item is ordered in, for example case.
eachCost of one ordering unit.
4.5Unit the item is stocked in.
eachUnit the item is sold in.
each2026-06-01T12:00:00.000Z2026-06-01T12:00:00.000Ztransfers object[]
The Shopify inventory transfers for a shopify_transfers purchase order, one per destination location. Empty for a standard purchase order, until the merchant sends the order to Shopify, and again if the merchant moves it back to draft.
The transfer's unique identifier.
3c2b1a0f-9e8d-4c7b-a6f5-e4d3c2b1a0f9The Shopify location the transfer delivers to.
gid://shopify/Location/123456789Name of that location. Null when no name was known.
Main Warehousepending until Shopify has the transfer, then follows it in Shopify: ready_to_ship, in_transit, transferred or cancelled. A transfer cancelled before it reached Shopify goes from pending to cancelled.
Possible values: [pending, ready_to_ship, in_transit, transferred, cancelled]
in_transitThe transfer's ID in Shopify. Null until Shopify has the transfer.
gid://shopify/InventoryTransfer/987654321The ID of the transfer's shipment in Shopify. Null until there is one.
nullWhy the last attempt to send or update the transfer in Shopify failed. Null when it succeeded. Free text for display; the wording can change.
nullWhen the transfer was created in Bookkeep.
2026-06-01T12:00:00.000ZWhen the transfer was last changed.
2026-06-01T12:00:00.000Zline_items object[]
What was sent to this location and what the store has done with it. One entry per inventory item: quantity_ordered sums the purchase order lines for that item at this location.
gid://shopify/InventoryItem/44444444444Quantity sent to this location.
10Quantity the store accepted in Shopify.
8Quantity the store rejected in Shopify.
1Quantity cancelled in Shopify.
0Quantity still on its way. Zero once the transfer is transferred or cancelled, even if the other quantities do not add up.
1When the purchase order was created.
2026-06-01T12:00:00.000ZWhen the purchase order was last changed.
2026-06-01T12:00:00.000Z{
"uuid": "9a1e3b7c-1e3d-4a3f-9f2e-9c6b6e2a2b11",
"sequence_id": 1042,
"supplier_name": "Acme Supply",
"name": null,
"status": "draft",
"destination_location_id": "gid://shopify/Location/73986408603",
"destination_location_name": "Main Warehouse",
"payment_terms": null,
"estimated_arrival": null,
"order_placed_date": null,
"order_shipped_date": null,
"order_cancelled_date": null,
"shipping_carrier": null,
"tracking_number": null,
"reference_number": null,
"supplier_order_reference": null,
"supplier_invoice_number": null,
"note": null,
"tags": [],
"shipping_amount": 0,
"tax_amount": 4.5,
"subtotal": 45,
"total": 49.5,
"metadata": {},
"source": "partner_api",
"currency": "USD",
"is_archived": false,
"incoming_sync_status": "pending_sync",
"incoming_sync_error": null,
"bill_status": "unbilled",
"bills_count": 0,
"receiving_mode": "standard",
"is_editable": true,
"is_cancellable": true,
"is_revertible": false,
"is_note_editable": false,
"is_cost_editable": false,
"is_deletable": false,
"catalog_sync_warnings": [],
"line_items": [
{
"id": 1,
"client_line_id": null,
"sku": "TSHIRT-BLK-M",
"barcode": null,
"title": "Widget",
"image_url": null,
"unit_cost": 4.5,
"line_total": 45,
"product_id": "gid://shopify/Product/1",
"variant_id": "gid://shopify/ProductVariant/1",
"location_id": "gid://shopify/Location/1",
"location_name": "Main Warehouse",
"tax_percent": "0.0",
"supplier_sku": null,
"note": null,
"variant_title": "Default Title",
"quantity_ordered": 10,
"inventory_item_id": "gid://shopify/InventoryItem/1",
"position": 1,
"added_during_receiving": false,
"variant_supplier_cost": {
"inventory_item_id": "46217359098139",
"supplier_sku": "SUP-WIDGET-1",
"supplier_price": 4.5,
"last_cost": 4.5,
"currency": "USD",
"is_default": true,
"pack_size": 1,
"order_uom": "each",
"case_cost": 4.5,
"base_uom": "each",
"sold_by": "each"
},
"created_at": "2026-06-01T12:00:00.000Z",
"updated_at": "2026-06-01T12:00:00.000Z"
}
],
"transfers": [
{
"uuid": "3c2b1a0f-9e8d-4c7b-a6f5-e4d3c2b1a0f9",
"destination_location_id": "gid://shopify/Location/123456789",
"destination_location_name": "Main Warehouse",
"status": "in_transit",
"shopify_transfer_gid": "gid://shopify/InventoryTransfer/987654321",
"shopify_shipment_gid": null,
"sync_error": null,
"created_at": "2026-06-01T12:00:00.000Z",
"updated_at": "2026-06-01T12:00:00.000Z",
"line_items": [
{
"inventory_item_id": "gid://shopify/InventoryItem/44444444444",
"quantity_ordered": 10,
"quantity_accepted": 8,
"quantity_rejected": 1,
"quantity_cancelled": 0,
"quantity_unreceived": 1
}
]
}
],
"created_at": "2026-06-01T12:00:00.000Z",
"updated_at": "2026-06-01T12:00:00.000Z"
}