How to Set Up Consignment in Odoo 19: Step-by-Step
Consignment is a stocking arrangement where you hold goods a vendor still owns. The inventory sits in your warehouse, on your shelves, in your delivery flow — but it stays on the vendor's books until the moment it sells. Only then do you owe money for it. If a unit never sells, it never becomes your problem: the vendor takes it back or you simply hold it at no cost.
For businesses, the appeal is entirely about risk and cash. You get a full shelf without paying for a full shelf. Your working capital stays free, and the dead-stock risk — the nightmare of paying up front for goods that never move — shifts onto the vendor. Odoo 19 models this natively, and once you understand the single concept it is built on, the whole workflow becomes obvious.
The one concept that makes consignment click
New users assume consignment stock is a special kind of product with its own record. It is not. In Odoo, consignment is a property of the stock, not the product. The same product can be part-owned and part-consigned at the same time, sitting in the same location, and Odoo keeps them straight using a single field: the Owner.
Here is the whole model in two lines:
- Owned stock — the Owner field is blank, which Odoo reads as "My Company." This stock is in your inventory valuation. You already paid for it.
- Consignment stock — the Owner field is set to the vendor. This stock is not in your valuation. You pay for it only when it sells.
That is the entire mental shift. You do not create a "consignment product." You receive ordinary product into your warehouse and stamp an owner on it. Ten units on the shelf might be five you own and five the vendor owns — one product, one location, two owners. Odoo tracks the value accordingly: your five sit in valuation, the vendor's five do not.
Before you start: enable Consignment
The feature is off by default. Turn it on once and it stays on.
- Go to Inventory → Settings.
- Scroll to the Traceability section.
- Tick Consignment.
- Save.
That is all consignment needs. One thing to be clear about: in the same Traceability section you will see Lots & Serial Numbers. That is a completely separate feature. Consignment does not require lots or serial tracking, and enabling it will only add steps you do not need. Leave it alone unless you already use it for other reasons.
The full consignment cycle
There are four stages: receive the vendor's stock, sell it, measure how much sold, and pay for what sold. Each stage maps to one Odoo document.
1. Receive consignment stock
This is where most people expect a Purchase Order — and there isn't one. You are not buying anything yet, so there is no PO. You simply record that the vendor's goods arrived in your warehouse.
- Go to Inventory → Receipts → New.
- Set Receive From to the vendor.
- Add the product and the quantity received.
- On the product line, set Assign Owner to the same vendor.
- Click Validate.
Setting Assign Owner is the load-bearing step. It is what tells Odoo this stock belongs to the vendor and must stay out of your valuation. Skip it and you have just told Odoo you own goods you never paid for.
[SCREENSHOT: The receipt form with Receive From set to the vendor and the line's Assign Owner field set to the same vendor, before clicking Validate]
2. Sell it
When a customer buys, you sell exactly as you would with any product — with one extra field on the delivery.
- Create a Sales Order, add the product, and Confirm it.
- Open the linked Delivery.
- In Detailed Operations, set From Owner to the vendor on the line.
- Click Validate.
The From Owner field is what actually ships the vendor's units instead of your own. This matters enough that it gets its own gotcha below.
[SCREENSHOT: The delivery's Detailed Operations with the line's From Owner field set to the vendor before validating]
3. Find out how much sold
You owe the vendor for exactly the units that shipped from their ownership over a period. Odoo already recorded every one of those moves — you just query them.
- Go to Inventory → Reporting → Moves History.
- Filter by the Product.
- Filter From Owner = the vendor.
- Filter to Done deliveries only.
- Optionally add a date range for your settlement period (for example, one month).
- Read the grouped total — that quantity is what you owe.
There is no preset "Group by Owner" filter. To group by owner, use Group By → Add Custom Group → Owner. The Owner column itself is optional; if you do not see it, add it from the column-options icon.
[SCREENSHOT: Moves History filtered by product, From Owner = vendor, and Done, showing the grouped total quantity sold]
4. Pay the vendor
You now know the settlement quantity. There are two ways to pay, and the recommended one skips purchasing entirely.
- Go to Accounting → Vendors → Bills → New.
- Add the vendor.
- Add the product and the sold quantity from step 3.
- Click Post.
- Click Register Payment.
A vendor bill records the financial obligation without touching stock. That is exactly what you want here, because the goods are already physically in your warehouse and were already moved out by the delivery. Nothing double-counts, nothing needs cancelling.
[SCREENSHOT: A posted vendor bill with the vendor, product, and settlement quantity, ready for Register Payment]
Two gotchas that trip everyone up
Gotcha #1 — Odoo reserves your owned stock first. When you confirm a sale, Odoo's default reservation logic grabs your owned units before it touches anyone else's. If you have both owned and consigned stock of the same product, the delivery will happily ship your own goods and leave the vendor's untouched — which means you never register the sale against the consignment and never settle it correctly. The fix is the From Owner field on the delivery line. Setting it to the vendor forces Odoo to ship the vendor-owned units instead. On any product where you hold consignment stock, treat setting From Owner as non-optional.
Gotcha #2 — a Purchase Order spawns a phantom receipt. It is tempting to pay the vendor by raising a normal Purchase Order, because that is how you pay for everything else. But a PO in Odoo is a promise to receive goods, so confirming it generates a new receipt for stock you already physically hold. If you validate that receipt, you have now counted the same goods twice. To use the PO route safely you must cancel the receipt it creates — an easy step to forget. This is the whole reason the direct vendor bill is the cleaner path: a bill never moves stock, so there is nothing to cancel and nothing to double-count.
Paying the vendor: two methods compared
Both methods settle the same money. They differ entirely in how much stock cleanup they force on you.
| Direct Vendor Bill (recommended) | Purchase Order + cancel receipt | |
|---|---|---|
| Where you start | Accounting → Vendors → Bills → New | Purchase → new PO |
| Moves stock? | No | Yes — spawns a receipt for goods you already hold |
| Extra cleanup | None | Must cancel the phantom receipt |
| Double-count risk | None | High if the receipt is validated |
| Extra setup | None | Set product Purchase Control Policy = On ordered quantities to bill without receiving |
| Best for | Almost every consignment settlement | Teams whose approval process requires a PO paper trail |
If your organisation's controls demand a purchase order for every payment, the PO route works — just set the product's Control Policy to On ordered quantities so you can bill without registering another receipt, and cancel the receipt Odoo generates. For everyone else, the vendor bill is fewer clicks and zero stock risk.
Verified Odoo 19 field labels
Consignment goes wrong when people set the right value in the wrong field. These are the exact labels in Odoo 19, in the order you meet them.
| Where | Field label | What to set it to |
|---|---|---|
| Product form | Track Inventory | Ticked (product Type must be Goods) |
| Receipt line | Assign Owner | The vendor |
| Delivery line (Detailed Operations) | From Owner | The vendor |
| Purchase / product billing | Control Policy | On ordered quantities or On received quantities |
| Inventory Settings → Traceability | Consignment | Ticked |
| Moves History reporting | Group By → Add Custom Group → Owner | No preset "Group by Owner" exists; Owner is an optional column via the column-options icon |
Get these six right and the arithmetic takes care of itself: the vendor's stock stays out of your valuation until it sells, the delivery ships the correct owner's units, and the settlement quantity is whatever Moves History says it is.
Where consignment fits in your wider Odoo setup
Consignment is one piece of a well-run warehouse. It sits directly on top of the reservation, reporting, and valuation mechanics covered in our guide to Odoo inventory management, and it settles through the vendor-bill flow explained in our Odoo accounting module guide. If you already run those two modules cleanly, adding consignment is a matter of one setting and two fields.
If you would like an Odoo Silver Partner to configure your consignment workflow — reservation rules, owner fields, and vendor-bill settlement wired end to end — CentrixPlus can set it up on your instance so it works the first time.
Ready to transform your business?
Talk to our Kuwait-based team about Odoo ERP for your business. Free consultation, no commitment.
