23 Sept 2026 · 4 min read
Backorders and partial shipment without overselling
Configure MSI backorders and partial shipments so you capture demand without promising phantom stock
Part 4 of the MSI / Inventory series — backorders are a promise; keep them payable.
The backorder list became a debt ledger
A merchant selling furniture left backorders unlimited through a supply disruption. Checkout kept accepting orders at a fixed "ships in 7 days" message while inbound purchase orders slipped by six weeks. By the time supply resumed, the backorder queue exceeded two months of capacity and cancellations spiked. Backorders had converted stockouts into revenue on paper and into refunds in practice. Each backorder is debt against inbound supply; this post shows how to cap it, split it across sources, and keep it payable.
Why this matters
Backorders convert stockouts into future revenue, but only when the promise matches inbound reality. Partial shipments split that debt across sources: two warehouses each ship what they have instead of one order waiting for a single complete parcel. Done right, customers get half their order now and the rest on a stated ETA. Done wrong, salability goes deeply negative with no purchase order behind it, shipments split silently, and partial returns credit the wrong source so the ledger never recovers.
How it works
Backorder thresholds per source. In MSI, backorder behavior is configured per source item: inventory_source_item carries backorders flags and backorder_qty / min_qty semantics surfaced in Admin under Manage Sources per product. The practical controls:
- Stores > Configuration > Catalog > Inventory > Product Stock Options: Backorders (No / Allow Qty Below 0 / Allow Qty Below 0 and Notify Customer), plus Out-of-Stock Threshold per product.
- Per source item: cap how negative salability may go by setting the out-of-stock threshold to the maximum payable debt, not zero. Unlimited backorders with no inbound purchase order is how the furniture queue happened.
Checkout validation reads the stock view (inventory_stock_1, etc.): salable qty may go negative down to the threshold. Past it, the product shows out of stock even with backorders enabled, which is the correct behavior.
Partial shipment mechanics. One order ships from N sources as N shipments, each with its own tracking. At shipment creation Magento appends reservation compensations and decrements the shipping source's inventory_source_item.quantity. Verify per-source impact:
SELECT source_code, sku, quantity, status
FROM inventory_source_item
WHERE sku = 'SKU-123';
SELECT sku, stock_id, SUM(quantity)
FROM inventory_reservation
WHERE sku = 'SKU-123'
GROUP BY sku, stock_id;
bin/magento inventory:reservation:list-inconsistencies
bin/magento indexer:reindex inventory
Notify with realistic ETA. The backorder notification template must carry the inbound date from the purchase order, not a fixed "7 days" string. Expose the ETA as a product attribute or source-level note synced from the ERP, and render it on product, cart, and order confirmation consistently. A backorder without a date is a complaint scheduled for later.
Partial returns need the same discipline: credit the source that shipped the returned parcel, not the default source. A partial return credited to the wrong source inflates one location and starves the other until the next physical count.
Pitfalls
- Unlimited backorders with no inbound purchase order. Every unit below zero must map to a dated inbound line. Review the negative-salability SKU list weekly against open POs.
- Splitting shipments without telling the customer why two parcels arrive. Each shipment email must state which lines it contains and what remains. Silent splits read as duplicate charges.
- Crediting the wrong source on partial returns. Returns to stock must increment the shipping source's
inventory_source_item. Default-source crediting is the quietest way to corrupt per-store counts. - Static ETA templates. "Ships in 7 days" hardcoded in a CMS block while supply slips to six weeks guarantees cancellations. Drive the ETA from data, and disable backorders per SKU when the date is unknown.
Field check on a live store
Export every SKU with negative salable quantity from each stock view and join it against open purchase orders by SKU and date. Any row with no inbound line is unpayable debt: either attach a PO date or disable backorders for that SKU today. For rows with dates, compare the promised storefront ETA against the latest PO date; the furniture merchant found promises predating supply by five weeks on half the list. Re-run this join weekly during any disruption. It takes one SQL query and replaces the quarterly surprise of a backorder queue that exceeds fulfillment capacity with a number the merchandising team can act on while there is still time.
Closing
Cap backorders at what inbound supply can pay, ship partial from the sources that have stock, notify with real dates, and credit returns where they shipped from. Review thresholds whenever lead times shift; a cap set during stable supply becomes unlimited the moment a disruption doubles lead time. That closes the MSI arc: sources pool into stocks, reservations keep the ledger honest, pickup promises a specific shelf, and backorders price the future without counterfeiting it.
Next in this series:
magento2-msi-bundled-configurable