← Blog

Medusa.js Inventory Management: What's Native, What Requires Custom Work

Medusa v2 ships with a real inventory system. Not a checkbox feature — a multi-location stock management module with reservations, availability calculations, and warehouse-level tracking. For a free, open-source platform, it covers more ground than most merchants expect.

It still has gaps. Here’s exactly what’s native, what you’ll need to build, and how it compares to Shopify’s inventory tooling.

What Medusa v2 Inventory Handles Natively

The inventory system in Medusa v2 is built on two core concepts: Inventory Items and Stock Locations.

An Inventory Item represents a physical product unit — it’s the thing that gets counted. Each product variant in Medusa links to one or more Inventory Items. A single variant can pull from multiple locations.

Stock Locations represent physical places where inventory lives: warehouses, fulfillment centers, retail floors. You can create as many as you need. Each location tracks its own quantity independently.

Stock Location Management

You can configure multiple warehouses and assign stock levels per location. When an order comes in, Medusa calculates available inventory by summing quantities across relevant locations, minus reservations.

Reservations are automatic. When a customer completes checkout, Medusa creates a reservation against the appropriate stock location. That quantity is held until the order is fulfilled or canceled. This prevents overselling when two customers are checking out simultaneously.

Location-level restocking, manual adjustments, and inventory transfers between locations are all supported through the admin panel.

Variant-Level Inventory Tracking

Each product variant gets its own inventory item. A T-shirt with 4 sizes and 3 colors = 12 variants = 12 inventory items, each with their own quantities per location.

You can also link a single inventory item to multiple variants — useful for interchangeable parts or components that go into multiple SKUs.

Backorder and Out-of-Stock Behavior

Medusa supports three inventory states per variant: allow backorders, deny purchase when out of stock, or continue selling regardless of stock level. These are configured per variant, not globally forced — useful if you want backorders on some products but not others.

The storefront behavior when a product is out of stock depends on how you implement the frontend. Medusa provides the data; your Next.js storefront decides whether to show an “Out of Stock” badge, hide the add-to-cart button, or display a waitlist form. That flexibility is a genuine advantage over hosted platforms where stock display is dictated by the theme.

What Requires Custom Development

Medusa’s native inventory handles the fundamentals well. Advanced operations require custom work.

Automated Reorder Points

Medusa does not generate reorder alerts when stock drops below a threshold. If you need the system to notify your purchasing team or create a purchase order automatically at 20 units remaining, you build that. The hook points exist — Medusa’s event system fires inventory-related events — but the reorder logic and notification delivery are custom.

Estimated build time: 8–16 hours for a basic threshold alert system with email notifications.

Purchase Orders and Supplier Management

There is no supplier database or purchase order module in Medusa v2. Receiving inventory against a purchase order — confirming quantities, adjusting for discrepancies, linking supplier invoices — is not built in.

Businesses managing multiple suppliers with formal PO workflows will either integrate a standalone procurement tool (like Cin7, Linnworks, or a simple Airtable setup) or build a custom supplier module.

Demand Forecasting

Medusa does not forecast. It tracks what exists and what’s reserved. Predicting reorder quantities based on sales velocity, seasonality, or lead times is outside the scope of the platform.

If demand forecasting is a requirement, the practical approach is exporting sales data to a spreadsheet or BI tool (Metabase, Looker Studio) and running forecasting there. Medusa’s API makes data extraction straightforward.

Lot Tracking and Expiry Dates

If your products have lot numbers, batch codes, or expiry dates (food, cosmetics, pharmaceuticals), Medusa does not track these natively. Lot tracking requires a custom metadata layer and custom logic to enforce FIFO or FEFO picking rules.

This is a significant gap for regulated product categories. Budget 40–80 hours for a basic lot-tracking implementation.

Serial Number Tracking

Individual serial number tracking per unit sold is not built into Medusa. For electronics, equipment, or warranty-dependent products that need unit-level traceability, custom development is required.

Kitting and Bundles

Selling a bundle of 3 products as a single SKU — where each component has its own inventory count — requires custom logic. Medusa does not natively decrement component inventory when a bundle product is sold.

This is a commonly requested feature. A workable implementation takes 12–24 hours.

Medusa Inventory vs Shopify Inventory: The Feature Gap

Shopify’s inventory management is more mature, with more out-of-the-box functionality. That’s the honest comparison.

What Shopify does that Medusa doesn’t (natively):

  • Demand forecasting — Shopify’s analytics surface stock trend data and basic forecasting signals
  • Purchase order management — Shopify has a native PO system with supplier records, receiving workflows, and cost tracking
  • ABC analysis — Shopify Analytics categorizes inventory by revenue contribution
  • Transfer orders — Shopify supports inventory transfers between locations with a built-in workflow
  • Stocky (discontinued, but Shopify’s replacement tools) — Shopify has invested in operational inventory tooling that Medusa has not replicated

What Medusa does that Shopify doesn’t:

  • No vendor lock-in. Your inventory data lives in your PostgreSQL database. You own it and can query it directly.
  • No limits on stock locations (Shopify Plus has a 1,000-location limit; Standard plans have 10)
  • No inventory management fees. Shopify charges for advanced reports and multi-location features at higher plan tiers.
  • Custom inventory logic can be built without workarounds. If your fulfillment operation has unusual requirements, you code it — you’re not fighting Shopify’s data model.

For businesses migrating from Shopify specifically to reclaim inventory data control, see our Medusa.js vs Shopify comparison.

Multi-Location Fulfillment Logic

Medusa’s multi-location support includes the data layer for assigning stock to locations. What it does not include natively is fulfillment routing logic — the rules that determine which location ships a given order.

If you have warehouses in New Jersey and Los Angeles, and an order comes in from Texas, Medusa doesn’t automatically pick the closer warehouse. You build that logic.

Routing rules — by geography, inventory availability, shipping cost optimization — require custom development or a third-party fulfillment plugin. This is realistic to build (20–40 hours for basic geographic routing), but it is custom work that Shopify Shipping and platforms with built-in fulfillment handle automatically.

Inventory Data and Reporting

Medusa’s admin panel shows current stock levels per variant per location. It does not surface inventory reports, sales velocity, or low-stock dashboards natively.

Reporting on inventory requires either connecting a BI tool to the Medusa database (PostgreSQL is queryable directly) or building custom reporting in the admin panel. Metabase connected to the Postgres instance is a common and low-cost solution — Metabase’s open-source version is free, and setup takes 4–8 hours.

Third-Party Inventory Integrations

Medusa’s API-first architecture makes it straightforward to integrate with dedicated inventory management systems when the native module isn’t enough.

Linnworks is the most commonly integrated IMS for mid-market Medusa stores. It handles multi-channel inventory sync, purchase orders, and 3PL management. The integration runs via Linnworks’ API — custom middleware syncs Medusa orders to Linnworks and pushes inventory updates back. Build time: 20–40 hours.

Cin7 (formerly Dear Inventory) covers manufacturing workflows, raw material tracking, and multi-location warehouse management at a depth Medusa’s native module doesn’t approach. For businesses with production operations alongside retail, the Cin7 + Medusa combination offloads inventory complexity to a dedicated tool.

Shipbob and ShipHero are fulfillment-focused platforms that include inventory management. If you’re using a 3PL for fulfillment, their inventory counts are the source of truth — Medusa reads from them, not the other way around. Both have REST APIs that Medusa can connect to.

The pattern in all of these integrations: Medusa handles the customer-facing commerce operations (cart, checkout, order creation), and the external IMS handles the operational inventory management. This is a clean separation of concerns that avoids building complex inventory tooling in Medusa when dedicated tools do it better.

Inventory and the Medusa Admin Panel

Medusa’s admin panel at v2 provides stock visibility per variant per location. The interface is functional — you can adjust quantities, view reservations, and manage locations — but it is not a warehouse management UI.

If your operations team needs to work in an inventory system daily, the Medusa admin is a secondary interface, not a primary one. It’s adequate for occasional adjustments and product setup. For daily pick-and-pack operations, most serious Medusa implementations connect to an OMS or WMS and treat the Medusa admin as the ecommerce configuration layer, not the warehouse operations layer.

The Medusa admin is customizable. The admin panel is itself open-source and extensible via custom widgets and route sections. If you need a custom inventory dashboard — low-stock alerts, location transfer UI, reorder status — it can be built directly into the admin. Budget 20–40 hours for a basic custom inventory dashboard.

What This Means for Your Build

If you’re evaluating Medusa for a business with standard ecommerce inventory needs — multiple warehouses, multi-SKU catalog, basic backorder handling — the native v2 module covers you well without custom work.

If you have operational complexity — lot tracking, purchase orders, kitting, serial numbers, demand forecasting — budget custom development time accordingly. These aren’t architectural barriers; they’re feature gaps that a development team can fill. But they add to your build cost and timeline.

A Medusa implementation for a business with moderate inventory complexity (multi-location, some custom fulfillment routing) typically adds $5,000–$15,000 to the base build cost for inventory-specific development.

For context on overall Medusa infrastructure costs, see our Medusa.js hosting and infrastructure guide.


FAQ

Does Medusa.js support multiple warehouse locations?

Yes. Medusa v2’s Stock Location module supports unlimited stock locations. You can assign inventory quantities per variant per location, and Medusa calculates available stock by summing across locations minus active reservations.

Does Medusa automatically reserve inventory when an order is placed?

Yes. Medusa creates inventory reservations when an order is completed at checkout. The reserved quantity is held until the order is fulfilled or canceled, preventing overselling during concurrent checkouts.

Does Medusa support backorders?

Yes, per-variant. You can configure each product variant to allow backorders, block purchase when out of stock, or ignore inventory tracking entirely. The setting is per variant, not applied globally.

How does Medusa inventory compare to Shopify’s?

Shopify has more built-in operational tooling: purchase orders, demand forecasting, transfer orders, and ABC analysis. Medusa covers core multi-location tracking and reservations natively. Advanced operational features require custom development in Medusa. The tradeoff is Shopify’s per-location limits and plan-tier feature restrictions vs Medusa’s unlimited extensibility.

Does Medusa.js support product bundles with component-level inventory tracking?

Not natively. Kitting — where selling one bundle decrements inventory across multiple component SKUs — requires custom development. A basic kitting implementation takes 12–24 developer hours.

Can I track lot numbers and expiry dates in Medusa?

Not natively. Lot tracking, batch codes, and expiry date enforcement require a custom metadata layer and custom picking logic. Budget 40–80 hours for a basic implementation if this is a regulatory requirement.

What does it cost to add custom inventory features to a Medusa build?

Basic reorder alerts: $800–$2,400. Fulfillment routing logic: $2,000–$6,000. Lot tracking: $4,000–$12,000. Purchase order workflow: $5,000–$15,000. These are additive to the base Medusa build cost and depend heavily on requirements complexity.


If you’re building a Medusa store and need to understand what’s included in a proper production implementation, our fixed-price packages lay out what’s covered. For WooCommerce-based inventory solutions — which may be a better fit for some businesses — our WooCommerce development services are worth comparing.