Every stockout and overstock starts as a forecasting decision. In Odoo, the deliberate version is a reordering rule: a per-product, per-location instruction that says how low forecasted stock may fall, how high it should be refilled, and which route should do the refilling. Configured well, it removes daily guesswork; configured badly, it automates that guesswork at scale.
This article explains how reordering rules work in Odoo 17 — what triggers them, how the quantity to order is calculated, how automatic and manual triggers differ, and how to choose defensible minimum and maximum values.
What a reordering rule is, in Odoo terms
Technically, a reordering rule is a record on stock.warehouse.orderpoint, often called an orderpoint. Each rule belongs to one product and one location: a product can have a generous rule in a busy warehouse and a lean rule, or none, in a slow store.
Every rule carries a small set of core fields:
- Minimum Quantity. The floor for forecasted stock. When the forecast falls below this value, replenishment is needed.
- Maximum Quantity. The ceiling replenishment aims for. Odoo orders enough to bring the forecast back up to this level, not merely back over the minimum.
- Quantity Multiple. An optional lot size. If stock must be ordered in cases of twelve, the multiple rounds the needed quantity up to the next whole multiple.
- Location and Route. Where the stock is needed, and how it should arrive — buy, manufacture, or resupply from another warehouse.
- Trigger. Whether replenishment happens automatically or waits for a person to confirm it from the replenishment report.
A product must be storable for this to matter, since Odoo only tracks quantities for storable products. A buy flow also needs a vendor on the Purchase tab; a manufacture flow needs a bill of materials.
The key word is forecasted, not on hand
The single most misunderstood point is that reordering rules watch the forecasted quantity, not simply what is physically on the shelf today. In broad terms, the forecast is on-hand stock plus expected incoming quantities, minus expected outgoing quantities, over the relevant horizon. A shelf can look full and still trigger a rule, because tomorrow's confirmed deliveries have already claimed that stock. Conversely, a shelf can look empty and not trigger, because a purchase order is already on its way.
This is a strength, not a quirk. Ordering from on-hand alone double-orders stock that is already in transit and ignores demand that is already confirmed. Ordering from the forecast treats the warehouse as a timeline rather than a snapshot.
Odoo refines this with just-in-time logic: the forecasted date is built from lead times in the replenishment chain, and only demand inside that window counts toward the quantity to order. A distant order therefore does not pull a purchase absurdly early — provided your lead times are honest.
How the quantity to order is calculated
When a rule triggers, the arithmetic is simple to state: Odoo aims to bring the forecast from below the minimum back up to the maximum. If the forecast is 3, the minimum is 10, and the maximum is 50, the starting need is 47 — the distance to the maximum, not just the 7 needed to cross the minimum. That result is then adjusted by the quantity multiple. If the multiple is 12, 47 rounds up to 48, four full cases.
The gap between minimum and maximum is your order cycle in units: a wide gap means fewer, larger orders; a narrow gap means frequent, small ones.
Automatic versus manual triggers
Automatic: set it and let the scheduler work
With the trigger set to Auto, replenishment is created without a person in the loop when the scheduler runs and finds the forecast below the minimum, and when a confirmed sales order pushes the forecast below the minimum. By default the scheduler runs once a day; a developer-mode user can run it manually, though that also processes other pending procurements.
What gets created depends on the route. A Buy route produces a request for quotation in the Purchase app. A Manufacture route produces a manufacturing order. A resupply route produces the inter-warehouse transfers described in the multi-warehouse guide. If no preferred route is set on the rule, Odoo falls back to the route chosen on the product's Inventory tab; if several are chosen there, it uses the first listed, which is a quiet source of surprises.
Manual: a recommendation a person approves
With the trigger set to Manual, the rule does not order by itself. Instead, the product appears as a need on the replenishment report under Inventory > Operations > Replenishment when it is time to reorder, showing the forecast, lead times, and the expected arrival if ordered now. A person reviews it and clicks Order Once, or adjusts the quantity first. Manual rules suit businesses that want the system's arithmetic but a human's judgement on timing, cash flow, or supplier choice — for example, consolidating several needs into one weekly purchase run.
Visibility days let a manual need appear on the report a set number of days earlier, so a buyer who orders only on Mondays can see Friday's problem on Monday.
Choosing defensible minimum and maximum values
There is no universal formula hidden in Odoo, but there is a defensible way to build the numbers from your own data:
- Start with average daily demand for that product at that location, from recent sales or issues, ignoring one-off bulk orders you can explain.
- Minimum covers lead time plus safety. Multiply daily demand by the supplier or resupply lead time in days, then add a safety amount for variability: more for unreliable suppliers or spiky demand, less for steady sellers with fast replenishment. In symbols, a useful starting point is: minimum = daily demand × (lead time days + safety days).
- Maximum adds one ordering cycle. Add daily demand multiplied by how many days you want to go between orders: maximum = minimum + daily demand × cycle days. A 30-day cycle for a stable product is very different from a 7-day cycle for a perishable or fast-moving one.
- Round to how you actually buy. Set the quantity multiple to the case, pack, or production batch size so the rule orders quantities your supplier will accept without manual correction.
Worked example: a product sells about 4 units a day at one warehouse, the vendor lead time is 5 days, you want 3 safety days, and you order roughly every 14 days. The minimum is about 4 × (5 + 3) = 32. The maximum is about 32 + 4 × 14 = 88. If it ships in cases of 10, set the multiple to 10. Those numbers will not be perfect — no starting numbers are — but every input can be explained, challenged, and revised, which is what makes them defensible.
The special case: the 0/0/1 rule
Setting minimum 0, maximum 0, and quantity to order 1 creates a pattern often written as 0/0/1. The product is normally held at zero. When a sales order pushes its forecast to −1, the rule orders a single unit via its route, bringing the forecast back to 0. It resembles the Replenish on Order (MTO) route, with two differences worth knowing: the incoming unit is not reserved for the specific order that triggered it, so it can serve any demand, and the replenishment is not linked to that sales order with the smart-button trail MTO provides. Choose 0/0/1 when you want order-driven replenishment without hard reservation; choose MTO when traceability to a specific order matters more.
Preferred route and vendor
Several useful columns on the reordering rules list are hidden until you reveal them: Trigger, Route, and Vendor among them. Setting a preferred route on the rule itself is safer than relying on product-tab order when a product can be both bought and manufactured. When the route is Buy, you can also pin a specific vendor so the resulting request for quotation is addressed correctly; when it is Manufacture, you can pin the bill of materials.
Common reasons a rule seems not to work
- You looked at on-hand instead of forecast. Check the forecast and the replenishment information pop-up before concluding the rule ignored you.
- The scheduler has not run yet. Automatic rules are evaluated on the scheduler's daily run and on sales confirmation, not continuously on every stock move.
- The product is not storable, or has no vendor or bill of materials. The rule triggers, but the route has nothing complete to create.
- The rule points at the wrong location. A rule for the main warehouse will never save a shop location that is the one actually running out.
- The demand is outside the forecasted window. A far-future sales order may correctly produce a quantity to order of zero today. Check its delivery date against the lead-time window before changing the rule.
- A manual rule is waiting for a person. By design, it will sit on the replenishment report until someone orders it, or snoozes it. Snoozing hides a need for a period; it does not satisfy it.
A sensible rollout
Do not write rules for the whole catalogue at once. Start with ten products you understand, set them to Manual, and watch the replenishment report for two weeks. Move trusted rules to Auto, keep judgement-heavy ones manual, and only then widen the set.
Further reading
- Odoo 17 documentation: Reordering rules
- Odoo 17 documentation: Inter-warehouse replenishment
- Odoo documentation: Routes and push/pull rules
