Odoo's purchase module implements a structured procurement workflow: request → quotation → purchase order → receipt → vendor bill → payment. The workflow controls - approval thresholds, receipt matching, and billing policies - determine whether your procurement team spends time approving each step manually or whether the system handles routine transactions automatically.
Purchase order states#
| State | Description |
|---|---|
| Draft (RFQ) | Created, not sent to vendor |
| RFQ Sent | Sent to vendor via email or portal |
| Purchase Order | Confirmed; creates stock picking |
| Done | All products received |
| Cancelled | Cancelled before receipt |
Confirming a purchase order (clicking "Confirm Order") creates a stock receipt (incoming shipment). The receipt is the physical confirmation that goods arrived.
Approval thresholds#
Purchase → Configuration → Settings → Orders → Purchase Order Approval.
Enable approval and set an amount threshold. Orders above the threshold require a second approval from a user with the "Purchase Manager" role before confirmation.
How it works:
- Order below threshold: any user with Purchase User role can confirm.
- Order above threshold: confirmation moves to "Waiting for Approval" state. A Purchase Manager must approve.
Configure multiple thresholds by using Odoo's approval rules addon or implement a custom approval matrix via server actions for complex hierarchies (department head → CFO → CEO based on amount).
Approval notification: When a PO reaches "Waiting for Approval," Odoo sends an activity to users with the Purchase Manager role. The activity appears in their activity view and sends an email if notifications are enabled.
Receipt methods and three-way match#
The billing policy on each product determines when the vendor bill can be created:
| Billing Policy | When to Use |
|---|---|
| Ordered Quantities | Bill immediately on PO confirmation (service contracts, subscriptions) |
| Received Quantities | Bill only after goods received (standard physical goods) |
Set on the product: Purchase tab → Control Policy.
Three-way match in Odoo means: the vendor bill quantity is validated against both the PO quantity and the received quantity. If the billed quantity exceeds what was received, Odoo creates a quantity mismatch that the accounting team must resolve.
The three-way match is enforced during vendor bill creation:
- Create bill from the PO: Purchase → [PO] → Create Bill.
- Odoo pre-fills bill lines with quantities based on the billing policy.
- If "Received Quantities" is set, only received-and-not-billed quantities appear.
Override quantities are possible (manual edit of bill lines), but they create a discrepancy that shows in the PO's billing status.
Automated vendor bill creation#
For high-volume procurement, automate bill creation from EDI or supplier portal:
Via vendor portal: Vendors access their portal (Odoo sends a portal invite). They create bills directly against their receipts. The bills appear in your Accounting → Vendor Bills queue for approval.
Via email alias: Configure Purchase → Configuration → Settings → Purchase → Alias to accept inbound bills by email. Vendors email invoices to purchase@yourcompany.com. Odoo creates a draft vendor bill. Optical character recognition (OCR) extracts amounts if the AI digitization feature is enabled.
Via EDI (EDIFACT/X12): Requires the account_edi module and a compatible connector. Structured invoice data maps directly to Odoo bill fields.
Purchase agreements#
For blanket orders or framework contracts with a vendor:
Purchase → Orders → Purchase Agreements → New.
Types:
- Blanket Order: A commitment to purchase a total quantity from a vendor over a period. Individual POs draw down against the agreement.
- Purchase Template (call for tenders): Request quotations from multiple vendors for the same purchase. Compare and select the best offer.
For blanket orders: set the product, total quantity, price, and validity period. When creating a new PO, link it to the agreement. Odoo tracks remaining quantity against the commitment.
Vendor lead time and reordering rules#
Each vendor has a lead time on the product vendor pricelist: Product → Purchase tab → Vendors → [Vendor] → Delivery Lead Time.
The scheduler uses this lead time when calculating reorder dates. Reordering rules (Inventory → Configuration → Reordering Rules) define:
- Minimum stock quantity (trigger threshold).
- Maximum stock quantity (replenish-to quantity).
- Preferred route (buy, manufacture).
When stock falls below the minimum, the scheduler creates a draft PO for the vendor with the configured lead time as the expected delivery date.
Vendor bills and payment workflow#
After receiving and matching the vendor bill:
- Vendor bill in Draft → confirm → status moves to "Posted" (accounting entry created).
- Set payment due date based on vendor payment terms.
- Accounting → Vendor Bills → Register Payment → select bank account, date, amount.
- Payment creates a journal entry debiting Accounts Payable and crediting Bank.
Partial payments: Odoo handles partial payments and tracks remaining balance on the bill. Multiple payments against one bill are reconciled automatically.
Early payment discounts: Configure on payment terms (Accounting → Configuration → Payment Terms). Add a discount line: "10 days, 2% discount" adds a discount option that reduces the payment amount if paid within the discount window.
Reporting#
Purchase → Reporting:
- Purchase Analysis: ordered quantities, received quantities, billed amounts by vendor/product/date.
- Vendor Lead Time: actual vs. promised lead time per vendor and product.
- Vendor Bills: open bills by due date for cash flow planning.
The vendor lead time report is particularly useful for renegotiating supplier terms and identifying unreliable suppliers before they cause stockouts.

