# Odoo Manufacturing Order: Components Not Available or Will Not Reserve

> Source: https://netray.co/erp-help/odoo-manufacturing-order-components-not-available-reserve
> Publisher: Netray (netray.co), AI and integration engineering for ERP and manufacturing systems.
> Section: ERP Help

## Short answer

An Odoo manufacturing order stays in Confirmed with components marked Not Available when stock.move lines for the raw materials cannot be reserved from the quantity actually sitting in the MO's source location. The usual causes are stock in the wrong location, stock already reserved by another document, lot or tracking mismatches, and a unit of measure difference between the BoM and the product.

## Kind

error

## System

small-erp

## Erp

Odoo

## Module

Manufacturing (MRP) / Inventory

## Query

Odoo manufacturing order components not available cannot reserve

## Alternate Queries

- odoo manufacturing order stuck in confirmed state
- odoo mo check availability not reserving components
- odoo mrp components availability not available but stock exists
- odoo you need to supply quantity to produce manufacturing order

## Applies To

Odoo 15, 16, 17 and 18, Community and Enterprise, Manufacturing and Inventory apps (mrp, stock)

## Steps

### How to find why components will not reserve

**Items:**

Open the manufacturing order (Manufacturing > Operations > Manufacturing Orders) and note the Components location shown in the Miscellaneous tab. Reservation only looks at this location and its children.

Click the product line in Components and open Inventory > Reporting > Stock (or the product's On Hand button) filtered by that location. Confirm quantity exists there, not just in the warehouse total.

Check Reserved vs On Hand. In Inventory > Reporting > Stock, the Reserved column shows quantity locked by other pickings and MOs. Free to Use is On Hand minus Reserved.

If the component is tracked by lot or serial, confirm lots exist in the source location and are not expired or blocked. Reservation cannot fall back to untracked stock.

Compare the unit of measure on the MO line with the product's UoM category. A BoM line in dozens against a product stocked in units still reserves, but rounding can leave a fraction short.

Click Check Availability on the MO. If a component is still short, create a replenishment or internal transfer to the Components location (usually WH/Stock to Pre-Production in 2 or 3 step manufacturing).

If the MO was confirmed before a transfer was done, use Unreserve then Check Availability so Odoo re-evaluates against current quants.

Set the MO reservation policy only when needed: Manufacturing > Configuration > Settings has Reservation controls in newer releases, and the operation type has a Reservation Method (at confirmation, manually, or before scheduled date).

## Sections

### How Odoo decides a component is available

**Body:**

When a manufacturing order is confirmed, Odoo creates a stock.move for each BoM line with the source location set to the operation type's default component location. Reservation then runs through stock.move._action_assign, which searches stock.quant records in that location and its child locations for free quantity of the product, filtered by lot if the move requires one.

That means warehouse-level availability is irrelevant. If the product is in WH/Stock/Shelf A and the MO draws from WH/Stock, children are included and it works. If the stock sits in a sibling location such as WH/Input or a different warehouse, the move stays Waiting or Not Available even though the product form shows plenty on hand.

In multi-step manufacturing (pick components then produce), the MO draws from the Pre-Production location. The stock only gets there once the pick-components internal transfer is done. A common report of components not reserving is simply an undone internal transfer sitting in Ready state.

**Code:**

-- Free quantity by location for a product (psql on the Odoo database)
SELECT l.complete_name, q.quantity, q.reserved_quantity,
       q.quantity - q.reserved_quantity AS free
FROM stock_quant q
JOIN stock_location l ON l.id = q.location_id
JOIN product_product p ON p.id = q.product_id
JOIN product_template t ON t.id = p.product_tmpl_id
WHERE t.default_code = 'RM-1001' AND l.usage = 'internal'
ORDER BY l.complete_name;

### Reserved by something else

**Body:**

Quantity can exist and still not be free. Delivery orders, other MOs and internal transfers reserve against the same quants, and by default reservation is first come first served at confirmation time. An MO confirmed yesterday can hold all of a scarce component while the MO you care about waits.

To see who holds the stock, open Inventory > Reporting > Moves Analysis (stock.move.line) filtered on the product and state Assigned or Partially Available, then group by Reference. You can unreserve the lower priority document from its form and re-run Check Availability on yours.

If reservations are accumulating on documents scheduled weeks out, change the operation type's reservation method to reserve at the scheduled date minus a lead time, rather than at confirmation. Odoo 17 and later expose this on the operation type; earlier releases rely on manual unreserve.

### Lots, serials, expiry and units of measure

**Body:**

For lot-tracked components the move line needs a specific lot. If lots were received without being assigned to the location (for instance an inventory adjustment that created quants without lots), Odoo cannot match them to a tracked move and reports Not Available. Fix it by correcting the quant: Inventory > Operations > Physical Inventory, set the lot, and apply.

With the Expiration Dates feature on, lots past their removal date are excluded from reservation. Check the lot form for the Removal and Expiration dates.

Unit of measure rounding matters too. If the product's UoM rounding precision is 1.0 and the BoM consumes 0.4 per unit made, small orders may compute needs that round up. Review Units of Measure rounding in Inventory > Configuration > UoM Categories rather than editing quantities by hand.

### When the MO should create its own supply

**Body:**

Components flagged with the Manufacture or Buy route plus a reordering rule, or MTO (Replenish on Order), generate procurement automatically when the MO is confirmed. If nothing appears, the MO is waiting on a manual process. Check the component's Inventory tab for Routes, and confirm the route is applicable on products and the warehouse.

If the component is a subassembly with Manufacture selected, a child MO should appear linked from the parent. The smart button on the parent MO shows child orders. A missing child MO usually means the sub-product has no BoM or the BoM is archived.

## Pitfalls

- Looking only at On Hand on the product form. Availability is evaluated per source location, not per warehouse total.
- Forgetting that multi-step manufacturing needs the pick-components transfer validated before the MO can reserve from Pre-Production.
- Force-validating the MO without reserving. This can consume negative stock and leaves valuation and lot traceability wrong.
- Editing reserved_quantity on stock_quant directly in SQL. It desynchronizes quants from stock.move.line and creates phantom reservations.
- Ignoring archived or lot-less quants created by inventory adjustments, which look available in reports but cannot satisfy tracked moves.

## Ai Angle

An assistant grounded in your Odoo database can answer the question people actually ask, which is why this one component is short. Because it reads stock_quant, stock_move_line and the MO's source location together, it can list free quantity by location, show which documents hold the reservations, and point out an undone pick transfer. A tool like ERPray keeps this read-only and shows the query it ran, so a planner verifies the answer before unreserving anything. Any write, such as unreserving another order, stays behind human approval.

## Faq

### Why does Odoo say Not Available when the product shows stock on hand?

**Answer:** The product form shows total quantity across internal locations. Reservation only searches the MO's component source location and its children, and only free quantity. Stock in another location or already reserved by other documents will not count.

### What is the difference between Check Availability and Unreserve?

**Answer:** Check Availability tries to reserve from current free quants for any unreserved demand. Unreserve releases quantity already held by the order so it can be used elsewhere. Run Unreserve then Check Availability to force a fresh evaluation.

### Can I produce an MO with partial components?

**Answer:** Yes. Odoo allows producing the quantity you have, and the MO can be processed with a backorder for the remainder. Manually set the produced quantity and consumed components on the MO, and confirm when you create the backorder.

### Why are no child MOs created for my subassembly?

**Answer:** The subassembly needs the Manufacture route, an active BoM, and either an MTO route or a reordering rule that triggers on demand. Check the route is enabled for the warehouse and the BoM is not archived or restricted to another company.

## Search terms

odoo manufacturing order not available, odoo mo components not reserved, odoo check availability mrp, odoo pre-production location, odoo unreserve manufacturing order, odoo stock quant reserved quantity, odoo multi-step manufacturing, odoo mrp reservation method

---
Talk to an engineer: https://netray.co/contact?intent=erp_ai | Machine catalog: https://netray.co/agent/catalog.json
