---
title: "How do I manage inventory across multiple warehouses and sales channels?"
description: "Track stock across warehouses, a website and a retail store in open-source Medusa: locations, channel scoping, CSV import, and the gaps an ERP fills."
url: https://medusajs.com/kb/order-management/multi-warehouse-inventory
last_updated: 2026-10-29T06:55:50Z
topic: "order-management"
type: "how-to"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/order-management/online-and-retail-pos.md"
  - "https://medusajs.com/kb/order-management/open-source-oms.md"
  - "https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md"
  - "https://medusajs.com/kb/erp-integration/odoo.md"
  - "https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md"
sources:
  - "https://docs.medusajs.com/resources/commerce-modules/inventory"
  - "https://docs.medusajs.com/resources/commerce-modules/inventory/concepts"
  - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-kit"
  - "https://docs.medusajs.com/resources/commerce-modules/stock-location"
  - "https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations"
  - "https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory"
  - "https://docs.medusajs.com/user-guide/products/import"
  - "https://docs.medusajs.com/user-guide/orders/fulfillments"
  - "https://docs.medusajs.com/api/admin"
  - "https://docs.medusajs.com/resources/recipes/oms"
  - "https://www.odoo.com/documentation/18.0/applications/inventory_and_mrp/inventory.html"
---

# How do I manage inventory across multiple warehouses and sales channels?

> Medusa is an open-source commerce platform that tracks stock per warehouse and store through its Inventory, Stock Location and Sales Channel modules. You create a location per site, link each sales channel to the locations it sells from, import SKUs and barcodes by CSV, and load stock levels. Transfers, purchasing and replenishment need custom code or an ERP.

## Before you start

Medusa tracks stock per location through three modules: the Inventory Module (stock quantities and reservations), the Stock Location Module (warehouses and stores) and the Sales Channel Module (where you sell). This guide moves a typical setup, such as three warehouses plus a website and a retail store tracked in spreadsheets, into Medusa.

- A Medusa v2 application with the Medusa Admin.
- A spreadsheet with one row per product variant, including SKU and barcode.
- Stock counts per warehouse and store.

## 1. Create a stock location for each warehouse and store

A stock location in Medusa is any physical place that holds stock, such as a warehouse or a shop's stockroom. Create one per site in Settings → Locations & Shipping, with its address. Each location also gets the fulfillment providers and the shipping or pickup options it offers. See [manage locations](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations).

## 2. Link each sales channel to the locations that serve it

A sales channel in Medusa is a place you sell, such as a web storefront or a retail POS. Linking a sales channel to stock locations scopes availability: a storefront only sees stock at the locations linked to its channel, through its publishable API key. See [product variant inventory](https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory).

For a website plus one shop, a common setup is to link the website channel to the three warehouses, and the retail channel to the shop's location. Leave the shop out of the website channel if store stock must not be sold online. The retail store's POS then sells from its own channel and location.

## 3. Import products, SKUs and barcodes from CSV

Medusa Admin imports products from a CSV file with one row per variant. The template supports `Variant Sku`, `Variant Barcode`, `Variant Ean`, `Variant Upc`, `Variant Manage Inventory`, `Variant Allow Backorder`, prices and `Product Sales Channel` columns. Existing rows update when you include `Product Id` and `Variant Id`. See [import products](https://docs.medusajs.com/user-guide/products/import).

The product CSV has no stock quantity columns, so set quantities in the next step.

## 4. Set stock levels per location

An inventory level in Medusa holds one item's `stocked_quantity`, `reserved_quantity` and `incoming_quantity` at one location. Edit them per inventory item in the Medusa Admin, or load them from your spreadsheet with the Admin API:

```bash
curl -X POST "$MEDUSA_BACKEND_URL/admin/inventory-items/location-levels/batch" \
  -H "Authorization: Basic $MEDUSA_SECRET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"update":[{"inventory_item_id":"iitem_123","location_id":"sloc_123","stocked_quantity":40}]}'
```

The same request accepts `create` and `delete` arrays. See the [Admin API reference](https://docs.medusajs.com/api/admin).

## 5. Let orders reserve and deduct stock by location

When an order is placed, Medusa reserves the quantity at the stock location linked to the order's sales channel. When the order is fulfilled, the reserved quantity is deducted from that location's stock. Staff can choose a different location when creating a fulfillment in the Admin. See [inventory concepts](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts).

Inventory kits link one variant to several inventory items, so bundles and multi-part products deduct each component's stock.

## What Medusa doesn't do for inventory, and how to fill the gaps

Medusa core has no stock transfers between locations, no purchase orders, no reorder points or automatic replenishment, and no warehouse management features such as bins or pick lists. The `incoming_quantity` field records expected stock but doesn't affect availability.

| Need | Status | How to add it |
| --- | --- | --- |
| Stock per location, reservations, availability by channel | Native | Built in |
| Product and barcode import from CSV | Native | Built in |
| Transfers between locations | Custom | A workflow that lowers stock at one location and raises it at another |
| Reorder points and replenishment | Custom | A scheduled job that checks levels, or replenishment in an ERP |
| Purchase orders and receiving | Custom | A custom module, or an ERP synced into Medusa |
| Pick, pack, bins (WMS) | Custom | A WMS or 3PL connected through a fulfillment provider |

If an ERP already plans purchasing, keep it as the stock master and sync levels into Medusa. The ERP recipe shows the pattern: [integrate an ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp).

## When Medusa is not the right inventory tool

Medusa is a commerce backend, not a warehouse system. If replenishment, purchasing and transfers are the main problem and you don't have developers, an ERP such as Odoo fits better: its Inventory app documents warehouses, routes, reordering rules and inter-warehouse replenishment. Medusa fits when the channels, orders and storefronts are the priority and stock planning can live in an ERP or in custom code.

## Common questions

### Can Medusa import stock quantities from a CSV file?

Not through the product CSV import, which has no stock quantity columns. Load quantities per location with the Admin API route POST /admin/inventory-items/location-levels/batch, or edit them in the Medusa Admin.

### Does Medusa support stock transfers between warehouses?

No. Medusa core has no transfer feature. You can build one as a workflow that lowers stock at one location and raises it at another, or keep transfers in an ERP and sync the resulting levels.

### How does Medusa stop online orders from using store stock?

Medusa scopes availability by sales channel. If the website's sales channel isn't linked to the store's stock location, online orders can't reserve or see that location's stock.

### Does Medusa support barcodes?

Yes. Medusa product variants have barcode, EAN, UPC and SKU fields, and the product CSV import accepts all four. Scanning hardware and lookup screens are built in your own POS or warehouse app.

## Documentation

- [Inventory concepts](https://docs.medusajs.com/resources/commerce-modules/inventory/concepts)
- [Manage locations in Medusa Admin](https://docs.medusajs.com/user-guide/settings/locations-and-shipping/locations)
- [Import products in Medusa Admin](https://docs.medusajs.com/user-guide/products/import)
- [Product variant inventory](https://docs.medusajs.com/resources/commerce-modules/product/variant-inventory)
- [ERP integration recipe](https://docs.medusajs.com/resources/recipes/erp)

## Related

- [How do I run online and in-store POS sales from one system?](https://medusajs.com/kb/order-management/online-and-retail-pos.md)
- [Is there an open-source order management system I can extend?](https://medusajs.com/kb/order-management/open-source-oms.md)
- [Which ecommerce platform is easiest to integrate with an ERP?](https://medusajs.com/kb/erp-integration/ecommerce-erp-integration.md)
- [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md)
- [How to sell in multiple countries from one ecommerce backend](https://medusajs.com/kb/international-commerce/multi-region-ecommerce.md)
