Inventory & Channel Sync

Reserving inventory for exchanges without killing sellable stock.

Setting aside enough stock to cover exchanges without hurting what you can sell.

Last updated September 16, 2026

An exchange hold is unpublished quantity. It is not extra on-hand you hope no one sells.

Shopify ATS is on-hand minus committed, minus quarantine, minus this pool. The pool is what a CX agent swaps when the PDP is sold out. If you publish it, a stranger buys the last Medium and the return in the mailbox has nowhere to land. Sold-out on the site is the point. The hold is the swap.

Size the hold by SKU and size

Size the hold by SKU and size, not by a catalog percent. Hold one or two of the sizes that actually come back (the 32, the Medium, the 9). A blanket 5% on every variant starves A-movers and still leaves the high-exchange size empty. Last season's exchange log is the list. Do not invent a safety stock that is really a drop buffer with a nicer name. Do not size the hold off on-hand. A 200-unit pile does not need a 10-unit swap pool if that size almost never comes back.

Keep the hold unpublished

This is not a BOPIS reserve and not a prepaid-box hold. Those park units for a named cart or a future box. An exchange pool is a small, unnamed warranty pile that must never publish to Shopify ATS. The 3PL cannot pick it for a web order. CX, or a swap order type from that zone, is the only path. A display pool that does not stop allocation will still let tonight's wave take the two you showed as held. Tell the 3PL the reserved qty, or keep those units in a zone they cannot pick for DTC. Channel ATS reservations are a different cut: they change what a channel sees. They do not create a swap.

Do not raid or overwrite the hold

Do not raid the hold for a drop. The morning you are sold out is when someone needs a size swap. Empty the pool into the wave and you have no exchange. Replenish the hold from inbound after the site is back in stock, not from the last two sellable units. A same-SKU return can refill the hold before it goes sellable. Do not dump every return into ATS and then wonder why the swap queue is dry.

On-hand stays honest. Published Shopify qty is ATS after the hold. If the next inventory export writes the warehouse count to the PDP, the hold vanished. That overwrite is the usual miss. When a ticket says sold out and there is no swap, reconstruct that SKU's on-hand, published, and hold for the hour. The missing unit is usually the one you published.

The hold is the exchange. Publish it and there is no exchange.

Run this with AI

Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.

You are the ops lead protecting a small exchange and warranty pool so a sold-out PDP can still swap a size.
Here is: sku, size, on_hand, exchange_hold_qty, shopify_published, exchange_rate_90d, inbound_qty, same_sku_returns_in_qc, zone_or_pool, 3pl_can_pick_hold (y/n), hold_raided_for_drop (y/n).
[paste]

Produce:
1. SKUs where the hold is published to Shopify ATS (no exchange once sold out).
2. Blanket-percent holds that starve A-movers, or high-exchange sizes with a hold of zero.
3. Holds that the 3PL can still pick for a web wave, or that were raided for a drop.
4. Same-SKU returns that went sellable instead of refilling the hold, and inbound that did not replenish the hold after the site was back in stock.
The hold is unpublished qty. Do not publish it. Do not raid it.

See it run on
your data.

Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.