← All articles

October 21, 2026 · Ahmed · More by Ahmed

Shopify Inventory Transfers Can Now Skip Origin or Destination

Shopify loosened its inventory transfer APIs in 2026-01. Here's exactly what became optional, what stayed draft-only, and how referenceName fits in.

What Changed in January 2026

As of API version 2026-01, Shopify's InventoryTransferCreateAsReadyToShip mutation no longer requires both an origin and a destination location to create a transfer. This is meant to support recording stock from external sources, like purchase-order suppliers or unexpected deliveries, by leaving the origin blank, and writing off stock to places Shopify doesn't track, like third-party warehouses or mobile teams, by leaving the destination blank. Shopify's own changelog example sets originLocationId to null while keeping destinationLocationId populated. The one hard rule survives the relaxation: you still must provide at least one of origin or destination to validate the mutation.

Two Different Things the Changelog Easily Blurs

Shopify's January 2026 announcement packaged this alongside a second, separate claim: "edit shipments anytime," meaning you can add, remove, or adjust items in a shipment even after it's in transit or received. That's a shipment-level capability, implemented through inventoryShipmentAddItems, inventoryShipmentRemoveItems, and inventoryShipmentUpdateItemQuantities, three mutations documented separately from anything that touches a transfer's own origin or destination fields. The GraphQL API reference for InventoryTransferEditInput draws a hard line here: both originId and destinationId are explicitly described as changeable "only for draft transfers." A transfer that has already shipped can have its contents edited through shipment mutations, but its origin or destination location is locked.

referenceName Is the Reconciliation Hook

For transfers built with a blank origin or destination, Shopify points to referenceName, available on both InventoryTransferCreateInput and InventoryTransferEditInput, as the field meant to link that transfer back to an external system: a 3PL's own shipment ID, or a write-off ticket number, for example.

Idempotency Tightened on a Fixed Schedule

Separately, the idempotency requirements on these same mutations changed on a fixed version schedule: the @idempotent directive was optional starting API version 2026-01 and became required starting API version 2026-04, for inventoryTransferCreate, inventoryTransferCreateAsReadyToShip, inventoryShipmentCreate, inventoryShipmentCreateInTransit, and inventoryShipmentReceive. Any integration still calling these mutations without an idempotency key on 2026-04 or later needs to add one. Separately, as of June 2026, receiving a purchase order now creates a linked inventory transfer automatically, with partial deliveries tracked as separate shipments against that same transfer and CSV import available for purchase-order line items, a related but distinct change from the origin and destination flexibility described above.

For ERP and 3PL integrations that reconcile Shopify inventory against external systems using transfer records, the practical read is this: loosen validation logic that assumed both locations were always required, but keep the assumption that a shipped transfer's origin and destination are fixed once set. Route any need to relocate stock after shipping through the shipment-edit mutations and referenceName, not through an attempt to rewrite originId or destinationId after the fact.

Sources

Operations & Fulfillment

ASSOSIATIX works on this every day. See our Shopify Operations Automation service

$./start-project.sh

READY TO BUILD
WHAT'S NEXT?

Tell us where you are and where you want to go. We'll help you choose the right path—storefront, system, product, or a focused growth sprint.