Inventory Reallocation Behavior When Using FulfillmentService and fulfillmentOrderMove

Hi everyone

I’m developing a 3PL (fulfillment service) app following Shopify’s Fulfillment Service guidelines. When a merchant installs our app, we create a FulfillmentService and activate inventory levels for the products they want us to fulfill using inventoryActivate.

However, we are facing a confusing inventory behavior. Let me describe a simplified scenario:

  1. Initially, the merchant has 1 unit of inventory at the Shop Location (Available: 1) and overselling is disabled.

    Our FulfillmentService Location (referred to as “3PL” below) does not manage physical inventory, so we usually initialize its available quantity as 0.

    At this point, the product is available for sale (total sellable quantity = 1).

  2. A customer places an order through the Online Store.

    After the order is created, the inventory state becomes:

    • Shop Location: Available = 0

    • 3PL Location: Available = 1

  3. When the merchant assigns the order to us for fulfillment, we call fulfillmentOrderMove to move the fulfillment order from the Shop Location to our 3PL Location.

    After this operation, Shopify automatically adjusts inventory as follows:

    • Shop Location: Available = 1

    • 3PL Location: Available = -1

At this point, the product unexpectedly becomes available for sale again in the Online Store, even though it should be sold out. This creates a serious risk of overselling.


Additionally, I tried an alternative setup where inventory is maintained directly at the 3PL Location instead:

  • Shop Location: Available = 0

  • 3PL Location: Available = 1

However, in this case, the Online Store shows the product as sold out, even though there is available inventory at the 3PL Location.


My questions are:

  • What is the correct inventory architecture for a 3PL app using FulfillmentService?

  • How should inventory be configured to avoid inventory reallocation issues when calling fulfillmentOrderMove?

  • If inventory is stored at the 3PL Location, what configuration is required to ensure the Online Store recognizes it as sellable inventory?

Any clarification or best practice guidance would be greatly appreciated. Thank you!

Hey @rj_G the inventory reallocation you’re seeing with fulfillmentOrderMove is actually expected behavior. When you move a fulfillment order from Shop Location to your 3PL, Shopify releases the inventory commitment at the source and creates a new one at the destination. That’s why Shop Location’s available quantity jumps back to 1 — the commitment moved, making the product appear sellable again.

The core issue is that fulfillmentOrderMove isn’t the right tool for a 3PL workflow. Instead, use the fulfillment request workflow: the merchant (or order routing) sends a fulfillment request to your service, your app accepts it with fulfillmentOrderAcceptFulfillmentRequest, then creates the fulfillment with fulfillmentCreateV2. Shopify handles inventory adjustments automatically at fulfillment time — no manual moves needed.

For your inventory architecture, if your 3PL tracks warehouse stock, set inventoryManagement: true on the fulfillment service and keep the actual inventory quantities at the 3PL location. Since permitsSkuSharing is now enabled by default for all fulfillment services, inventory items can exist at both the 3PL and merchant locations simultaneously — so the merchant can also stock items locally if needed. Shopify’s order routing will automatically pick the location with available stock. If your 3PL doesn’t manage inventory, just keep stock at the merchant’s Shop Location and let Shopify handle the adjustment when the fulfillment is created.

Regarding your question about 3PL location inventory not showing as sellable on the Online Store — the merchant needs to ensure your 3PL location is included in a shipping profile that covers online orders and is listed in their location fulfillment priority (Settings > Shipping and delivery). Without that, the Online Store won’t count that location’s stock toward the sellable quantity. For more details, check out the fulfillment service docs and inventory level docs. Hope that helps!

1 Like

Hey @rj_G , Liam covered the API flow really well so I won’t repeat that.

What I’d add is the ongoing sync piece. Once you’re on the fulfillment request workflow with inventoryManagement: true at your 3PL location, Shopify handles the committed adjustments
correctly on fulfillment events. But on_hand at that location still needs to come from your 3PL’s WMS whenever physical stock changes, receiving, returns, manual adjustments at the
warehouse. That’s where a lot of 3PL apps get the API flow right and still end up with drifting available counts.

For pushing those stock changes back, inventorySetOnHandQuantities works well for full reconciliation snapshots, and inventoryAdjustQuantities for incremental deltas
( inventoryAdjustQuantities - GraphQL Admin ). Worth knowing that the “available” number Shopify computes is always on_hand minus committed minus reserved, so if the WMS side isn’t pushing updates consistently the count drifts even when everything else is correct.

If the 3PL system has its own data layer or database, something like https://www.stacksync.com/ handles that continuous two way sync between warehouse data and Shopify inventory without you building and maintaining a custom webhook receiver for every event type. Might be overkill depending on the integration complexity, but worth knowing it exist.

Hope this helps alongside what Liam shared.

2 Likes