Odoo Manufacturing Order: Components Not Available or Will Not Reserve
Odoo manufacturing order components not available cannot reserve
Also searched as
- 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
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.
Applies to: Odoo 15, 16, 17 and 18, Community and Enterprise, Manufacturing and Inventory apps (mrp, stock)
How to find why components will not reserve
- 1Open 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.
- 2Click 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.
- 3Check 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.
- 4If 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.
- 5Compare 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.
- 6Click 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).
- 7If the MO was confirmed before a transfer was done, use Unreserve then Check Availability so Odoo re-evaluates against current quants.
- 8Set 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).
How Odoo decides a component is available
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.
-- 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
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
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
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.
Common 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.
How an ERP-grounded AI assistant handles this
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.
Frequently asked questions
Why does Odoo say Not Available when the product shows stock on hand?
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?
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?
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?
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.
Related
Odoo Reordering Rule Not Creating Manufacturing Orders: Causes and Fixes
Odoo creates a manufacturing order from a reordering rule only when the rule's forecast quantity falls below its minimum, the product has the Manufacture route with an active BoM, and the replenishment scheduler actually runs. Check the rule's route and warehouse, the product's forecast, the BoM, and the scheduler cron, in that order.
How-toOdoo Inventory Valuation Report Does Not Match the Balance Sheet
In Odoo with automated inventory valuation, the stock valuation report should equal the balance of the stock valuation account. Differences nearly always come from manual journal entries to that account, products with manual valuation, costing method changes, landed costs, negative stock, or vendor bills posted at a different price than the receipt.
Error fixFix Odoo AccessError: You Are Not Allowed to Access Records
Odoo raises AccessError when a user's security groups do not grant a CRUD right on a model through ir.model.access.csv, or when an ir.rule record rule filters the specific record out for that user or company. Fix it by adding the user to the group named in the error, editing the model's access rights, or reviewing the record rule's domain under Settings > Technical > Security.
How-toHow to Create a Generic Inquiry in Acumatica
Generic Inquiries (GI) are Acumatica's no-code query builder for joining tables, adding filters, and exposing the result as an inquiry screen, dashboard data source, or API endpoint. Open System > Customization > Generic Inquiry, add your base table, define joins and conditions, then run and save. No SQL or customization project is required.
How-toHow to Void a Check in Sage 100
Sage 100 voids checks through Accounts Payable > Main > Check and Payment Voiding. Select the bank code, choose the check number, and Sage reverses the Cash Disbursements Journal entry and reopens the invoice it paid. A check that already cleared in Bank Reconciliation or falls in a closed period needs an extra step before it can be voided cleanly.
How-toHow to Run Requirements Planning (MRP) in SYSPRO
SYSPRO's MRP engine lives under Planning and Scheduling > Requirements Planning. Set planning parameters per warehouse, run the Requirements Calculation to net demand against supply, then review and release the resulting suggestions as purchase requisitions or work orders. A full regenerative run typically runs on a schedule, with net change runs in between to pick up new activity.
AI for ERPAI Demand Forecasting for Manufacturers: Better Numbers and an Explanation Planners Can Trust
AI demand forecasting explains ERP forecast changes in plain language, flags exceptions for planners, and handles short-history SKUs without Excel overrides.
AI for ERPAI for Odoo Manufacturing That Reads Your Own Database, Not a Vendor's Cloud
Add grounded, natural-language AI to Odoo Manufacturing without sending MRP, BoM, or work order data to a public model. On-prem or private cloud, ORM-native.
Stuck on Odoo?
Talk to engineers who work inside Odoo every week, and who build private AI that answers these questions from your own ERP data.