What is Magento Multi-Source Inventory (MSI)?
Multi-Source Inventory (MSI) is the native Magento 2.3+ multi-warehouse inventory system. It replaces the legacy single-quantity-per-product model with a Sources → Stocks → Reservations architecture, letting one store fulfil from multiple physical warehouses, drop-shippers, retail stores, or pickup locations using a priority-based Source Selection Algorithm.
Adobe-Certified Magento developer explains how MSI works, the sources / stocks / reservation system, when to use it, and the three configuration mistakes that bite stores in production.
- Native since Magento 2.3 (2018)
- Cost Free · Open Source + Adobe Commerce
- Replaces Single qty-per-product model
The four moving parts of MSI
MSI is built on four primitives. Once you understand all four, every multi-warehouse scenario is a combination of them.
-
Sources = physical locations
Each source is a real warehouse, retail store, drop-shipper, or 3PL with its own SKU and on-hand quantity. Sources have a name, code, address, and contact details. A SKU can live at N sources simultaneously, each tracking its own qty independently.
-
Stocks = logical groupings
A stock aggregates one or more sources for a website. Example: "EU Stock" = Berlin warehouse + Amsterdam warehouse. Stocks are linked to specific Magento websites — one stock per website is the typical setup, but you can share a stock across websites for unified inventory.
-
Reservations = soft locks
When a customer places an order Magento creates a negative reservation against the stock — not an immediate qty decrement. The reservation stays open until shipment, then it’s consumed and the source qty is permanently reduced. This prevents overselling without locking inventory in the database during checkout.
-
SSA = Source Selection Algorithm
For every order line the SSA picks which source ships it. Default algorithm = Priority-based: lowest-priority-number source with enough qty wins. Distance-based algorithm (Adobe Commerce only) uses lat/long to ship from the closest source. Custom SSAs are pluggable via the
SourceSelectionInterface.
Five scenarios where MSI earns its keep
MSI is overkill for a single-warehouse store with no roadmap to expand. Here’s where it pays for itself instantly.
-
Multiple warehouses
Two or more physical fulfilment locations — typical retail, brand DTC, or wholesale operation with regional distribution. MSI splits one order across sources or routes the whole order to the best single source.
-
Multi-region storefronts
Different stocks per website — EU site fulfils from EU sources, US site from US sources, no cross-contamination. Combines naturally with multi-store setups.
-
Drop-shipping
Each supplier becomes a source. The SSA picks which supplier ships each line based on stock + priority + (optionally) margin. Combined with custom SSAs you can route by supplier SLA or shipping cost.
-
BOPIS / click-and-collect
Buy Online, Pick-up In Store. Each retail store registers as a source. Shoppers see real per-store availability on the PDP, reserve qty at checkout, and the store associate fulfils from local stock.
-
Pre-orders & negative inventory
MSI supports negative on-hand qty out of the box. Backorders accumulate as negative reservations and are netted off when restocking arrives — no third-party pre-order extension required for the basic case.
Three configuration mistakes that bite stores in production
Every MSI debug ticket I’ve handled in the last 3 years traces back to one of these three. Audit your setup against them now — cheaper than the post-mortem.
-
Disabling MSI for "simplicity"
A common upgrade-from-2.2 reflex. You lose native pre-order support, the reservation safety net (overselling prevention), and the SSA. Single-stock mode is implemented as a "Default Stock" containing all sources — the framework is always present. Disabling the modules just hides the admin UI; the cost is later when you actually need a second warehouse.
-
Misconfigured stock-website links
If website-A is linked to stock-EU but the storefront route also serves website-B (linked to stock-US), customers may see EU availability but the order ends up in US stock. Always verify
inventory_stock_sales_channelrows match yourstore_websitesetup. Test with each website’s URL in an incognito window. -
Forgotten source priorities
Without explicit priority numbers the SSA falls back to source-code alphabetical order, which is rarely what you want. Always set priority on every source — lower numbers ship first. Common pattern: priority 10 for primary warehouse, 50 for overflow, 90 for drop-ship.
Six questions stores ask before turning MSI on
Is MSI on by default in Magento 2?
Yes — from Magento 2.3 onwards, MSI ships enabled by default in both Open Source and Adobe Commerce. A new install creates a Default Source and a Default Stock so the platform behaves like a single-warehouse system out of the box. You only see the multi-source admin once you add a second source.
MSI vs the old single-stock model — what’s the performance cost?
Negligible for stores under ~100k SKUs and ~5 sources. The MSI tables (inventory_source_item, inventory_reservation) add an indexer pass and one JOIN at PDP qty resolution, which Adobe shipped with built-in caching. On 1M+ SKU catalogs with 20+ sources you may need to tune the inventory indexer mode (set to "Update on Schedule") and run the reservation cleanup cron regularly. Real-world overhead: 2-5% on TTFB, fully offset by the operational gains from multi-warehouse routing.
Does MSI work with Hyvä Themes?
Yes — MSI is a backend system. Hyvä only changes the storefront layer; the inventory tables, indexers, reservations, and SSA are all pure Magento backend. Hyvä ships its own PDP/cart/checkout templates which call the same StockResolver service Luma does. Source-display widgets (e.g. "stock at your nearest store") may need a small Hyvä-compatible re-skin if the original was Knockout-based.
Can I write a custom Source Selection Algorithm?
Yes — implement Magento\InventorySourceSelectionApi\Api\SourceSelectionInterface and register it via di.xml with a unique algorithm code. Common custom SSAs: ship-from-cheapest-shipping-cost, ship-by-margin-priority, ship-by-supplier-SLA, ship-by-carrier-coverage. The interface receives an InventoryRequestInterface (SKU + qty + destination) and returns a SourceSelectionResultInterface with the source-allocation breakdown. Full reference in the InventorySourceSelection module.
Does MSI play nicely with B2B + customer-segment pricing?
Yes. MSI sits at the inventory layer, B2B and customer-segment pricing sit at the catalog/quote layer — they don’t conflict. A B2B company with negotiated pricing on its quote still routes fulfilment through the SSA on the order’s assigned stock. The only gotcha: if you use stock-per-website to isolate a B2B website, make sure the B2B company’s default website matches.
Adobe Commerce vs Open Source — any MSI feature difference?
Two notable differences: (1) the Distance-based SSA using Google Maps / OpenStreetMap lat-long routing is Adobe-Commerce-only — Open Source ships only the Priority-based SSA. (2) Adobe Commerce’s B2B module exposes per-company source restrictions in the admin UI. Everything else — Sources, Stocks, Reservations, custom SSAs, indexer behaviour, BOPIS support — is identical between editions.
Need MSI configured for a real multi-warehouse build?
I’ve set up MSI on multi-region stores with 5+ warehouses, drop-shipper networks, and BOPIS retail chains. Sources, stocks, custom SSA, indexer tuning — the full kit. Fixed-price quote in 24 hours.