Odoo Reordering Rule Not Creating Manufacturing Orders: Causes and Fixes
Odoo reordering rule not creating manufacturing order
Also searched as
- odoo scheduler not generating manufacturing orders
- odoo run scheduler mrp not working
- odoo replenishment manufacture route no MO created
- odoo reordering rule min max not triggering
Short answer
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.
Applies to: Odoo 15, 16, 17 and 18 (Community and Enterprise) with Manufacturing and Inventory installed
How to diagnose a rule that creates nothing
- 1Open Inventory > Operations > Replenishment. Find the rule and read Forecast, Min, Max and To Order. If To Order is 0, the rule has no need yet.
- 2Check the Route column on the rule. For manufactured products it must be Manufacture. If it is blank, Odoo uses the product's own routes, and multiple matches can choose Buy instead.
- 3Open the product > Inventory tab and confirm the Manufacture route is ticked. The warehouse must also have manufacturing enabled under Inventory > Configuration > Warehouses.
- 4Open the product's Bills of Materials and verify an active BoM of type Manufacture this Product exists for the company, and is not tied to a variant you are not stocking.
- 5Click Order Once on the rule. If an MO appears, the rule works and the scheduler schedule is the issue. If you get a warning, read it, as it names the missing route or BoM.
- 6Go to Settings > Technical > Automation > Scheduled Actions and open Scheduler: Run (named Procurement: run scheduler in older releases). Confirm it is active, next execution is in the future and the user has access to the company.
- 7Check the log for the cron in Settings > Technical > Logging for errors, and for Odoo.sh or self-hosted, the server log lines containing procurement.group or run_scheduler.
What the scheduler actually evaluates
A reordering rule (stock.warehouse.orderpoint) calculates a forecast quantity for the product in the rule's location over a lead-time horizon: on hand, plus incoming receipts and MOs, minus outgoing deliveries and component demand scheduled inside the visibility window. If that forecast is below Min, the rule creates a procurement to reach Max (or Min plus the multiple).
In Odoo 15 and later, the Replenishment menu pre-computes To Order and, if Trigger is Manual, only creates orders when you click Order. Rules with Trigger set to Auto are processed by the scheduler cron. A large number of users create rules and leave them on Manual, then wonder why no MO ever appears.
The procurement then runs through stock.rule records. The Manufacture rule creates an mrp.production using the BoM found for the product. No matching BoM raises a UserError that is swallowed by the cron and logged, which is why the failure looks silent in the UI.
-- Rules, triggers and the active routes involved
SELECT o.id, p.default_code, o.product_min_qty, o.product_max_qty,
o.trigger, o.route_id, o.active
FROM stock_warehouse_orderpoint o
JOIN product_product pp ON pp.id = o.product_id
JOIN product_template p ON p.id = pp.product_tmpl_id
WHERE o.active;
-- Is the scheduler cron enabled and when does it fire?
SELECT c.cron_name, c.active, c.nextcall, c.interval_number, c.interval_type
FROM ir_cron c
WHERE c.cron_name::text ILIKE '%scheduler%';Route and BoM problems
If a product has both Buy and Manufacture routes ticked, the procurement picks the rule by sequence and route priority. Set the Route field on the reordering rule explicitly to Manufacture to stop Odoo purchasing a manufactured item.
The BoM lookup considers company, variant and, with Odoo 16+ multi-operation setups, the picking type. A BoM restricted to another company or to a variant different from the one on the rule is invisible to the procurement. The archived BoM case is common after engineering revisions.
Kits are a distinct trap. A BoM with type Kit does not create MOs. It explodes into component moves on a delivery. A product configured as a Kit never triggers a manufacturing order from a reordering rule.
Forecast and lead time effects
Rules look at the forecast, not on hand. If a confirmed MO or purchase order already covers the shortage, To Order stays at zero. That is correct. Look at Inventory > Reporting > Forecasted Inventory for the product and check receipts, MOs and moves inside the horizon.
Lead times shift when demand is counted. Manufacturing Lead Time on the product, the company's Manufacturing Lead Time in Manufacturing > Configuration > Settings, and the Security Lead Time all push planned dates earlier. A rule with a visibility days setting may ignore demand that falls outside the window.
Multi-company and multi-warehouse setups need a rule per warehouse location. A rule on WH/Stock does not respond to demand from WH2/Stock.
Scheduler runs but fails halfway
When one procurement raises an error, recent releases log it and move on, but older code paths can roll back the batch for the same product group. Look for repeated tracebacks in the server log naming mrp.bom or stock.rule. Fix the data issue, then rerun from Inventory > Operations > Replenishment using Run Scheduler (Enterprise) or Settings > Technical > Scheduled Actions > Run Manually.
On heavily loaded databases, long scheduler runs can overlap with the next one and be skipped. Check cron timing and consider running the scheduler outside business hours.
Common pitfalls
- !Leaving the rule Trigger on Manual and expecting overnight automation.
- !Leaving the rule Route blank when the product has both Buy and Manufacture ticked.
- !Defining the product as a Kit, which never generates a manufacturing order.
- !Archiving the only BoM during an engineering change and not publishing the replacement.
- !Creating the rule in the wrong warehouse location, so it never sees the real demand.
- !Reading On Hand instead of Forecast when judging whether a rule should fire.
How an ERP-grounded AI assistant handles this
This kind of triage is mostly joins across orderpoints, routes, BoMs and forecast moves, which is exactly what a grounded assistant does well. Asked why product X has no MO, an assistant on your Odoo data (ERPray in a read-only setup) can show the rule's trigger and route, the forecast calculation inputs, and whether an active BoM matches, with the query visible. It should not edit rules on its own. Creating or changing replenishment settings stays a human-approved action.
Frequently asked questions
Why does the scheduler run but To Order stays at zero?
The forecast already meets Min. Incoming MOs, receipts or reservations inside the visibility window count against demand. Inspect Forecasted Inventory for the product. If the forecast really is low, check that the rule's location matches where demand is booked.
Does Order Once create an MO even if the scheduler is disabled?
Yes. Order Once runs the procurement for that rule immediately, independent of the cron. It is a good test: if it works, the scheduler or trigger setting is the issue, not the route or BoM.
Can I make a purchased product and a manufactured one share a rule?
Create one rule and set its Route explicitly. For a product that is sometimes bought and sometimes made, use separate rules or a Manufacture route chosen per rule so Odoo does not pick Buy by default.
How often should the scheduler run?
Daily is the default and fine for most shops. Lower intervals help when MOs depend on rapid demand changes, but frequent runs on large databases can overlap, so test run time first.
Related
Odoo Manufacturing Order: Components Not Available or Will Not Reserve
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.
Error fixOdoo Scheduled Actions (Cron) Not Running: How to Fix
Odoo scheduled actions usually stop firing because no cron worker is available (workers or max-cron-threads misconfigured), the action is set inactive, or an earlier job crashed and left an ir.cron row stuck in the running state, which blocks the queue. Check Settings > Technical > Automation > Scheduled Actions first, then the server config and the ir.cron table.
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.
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.
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 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.
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.