All posts
Integrator8 min read

Odoo purchase workflow: RFQ to bill, approval thresholds, vendor pricelists, and purchase agreements

The Odoo purchase module covers the full procure-to-pay cycle: request for quotation, purchase order confirmation, receipt, and vendor bill matching. This guide covers the workflow, approval controls, vendor pricelist setup, purchase agreements for blanket orders, and the common configuration gaps that cause matching failures.

The Purchase Cycle in Odoo#

Odoo's purchase module covers the full procure-to-pay cycle:

  1. Request for Quotation (RFQ): draft document sent to a vendor for pricing
  2. Purchase Order (PO): confirmed RFQ; vendor is committed
  3. Receipt: warehouse receives goods; inventory is updated
  4. Vendor Bill: accounting records the payable; matched against the PO

Each step is a separate document, and they are linked by Odoo's three-way matching logic: PO quantity, received quantity, and billed quantity are reconciled at billing time.


Request for Quotation#

Create an RFQ from Purchase → Orders → Requests for Quotation → New.

Key fields:

  • Vendor: the supplier
  • Purchase Representative: the internal buyer
  • Order Deadline: date by which the vendor must confirm pricing
  • Receipt Date: expected delivery date
  • Order Lines: products, quantities, unit prices

When you click Confirm Order, the RFQ becomes a PO and the vendor is committed.

Sending the RFQ#

Click Send by Email to dispatch the RFQ to the vendor's email address. Odoo uses the purchase order email template, which you can customize in Settings → Technical → Email → Templates.


Purchase Approvals#

Enable purchase approval thresholds in Settings → Purchase → Purchase Order Approval.

Set a minimum order amount above which a manager must approve before the PO can be confirmed. The workflow:

  1. Buyer creates a PO above the threshold
  2. PO enters "Waiting for Approval" status
  3. A user with Purchase Manager rights approves or rejects
  4. On approval, status moves to "Purchase Order" (confirmed)

Approval is per-PO, not per-line. If you need more granular control (by product category, by department), implement a custom approval flow via automated actions or a workflow module.


Vendor Pricelists#

Vendor pricelists (not to be confused with customer pricelists) define the price Odoo proposes for a product when that vendor is selected on an RFQ.

Configure per product on the product form → Purchase tab → Vendor Prices:

  • Vendor: the supplier
  • Vendor Product Name / Code: the vendor's SKU for cross-referencing
  • Minimum Quantity: the price applies when ordering at least this quantity
  • Price: the unit price
  • Currency: the pricing currency
  • Validity: optional date range for the price

When you add a product line to an RFQ and the vendor is set, Odoo looks up the matching vendor pricelist entry and pre-fills the unit price. If no match is found, the field is left blank.

Updating Vendor Prices from Bills#

When a vendor bill is received with a different price than the PO, Odoo can optionally update the vendor pricelist. Enable Purchase → Settings → Update Vendor Price on Bill to activate this.


Purchase Agreements#

Purchase agreements cover two scenarios:

Blanket Orders#

A blanket order is a long-term agreement with a vendor for a total quantity or value. Individual POs are drawn against the blanket order until it is exhausted.

Create from Purchase → Orders → Purchase Agreements → New, select type Blanket Order. Set the agreed quantity and validity period. When creating RFQs, reference the blanket agreement - Odoo tracks remaining quantities.

Purchase Requirements#

A purchase requirement groups RFQs from multiple requisitions into a single PO call. Useful when a buyer wants to consolidate demand before going to market.


Receipt and Three-Way Matching#

After PO confirmation, a receipt (warehouse incoming shipment) is automatically created.

When goods arrive:

  1. Open the receipt from the PO's Receipts button
  2. Enter actual received quantities (may differ from ordered)
  3. Validate the receipt - inventory is updated

Odoo's three-way matching at billing:

  • Ordered quantities billing: the bill matches the PO quantity regardless of received quantity (useful for services)
  • Received quantities billing: the bill matches what was actually received (default for goods)

Set the billing policy per product category or per product in the product form → Purchase tab → Control Policy.


Vendor Bill Creation and Matching#

From the PO, click Create Bill. Odoo pre-fills the bill lines from the PO (or receipt, depending on control policy).

The bill goes through the standard accounting workflow: Draft → Posted → Paid.

If the vendor invoice differs from the PO price, Odoo flags the price difference. Depending on settings, Odoo either records the difference to a price difference account or requires manual resolution before posting.


Common Configuration Issues#

1. Bill created but not matched to PO#

If a bill is created manually (not from the PO), the smart button link is absent. Always create bills from the PO using the Create Bill button to maintain the three-way match.

2. Received quantity is zero but bill is posted#

If the control policy is "Ordered quantities" on a product that should be received-quantity billed, the bill is created for the full PO quantity even if nothing has arrived. Review the billing control policy setting on the product or category.

3. Vendor pricelist not populating price#

If no vendor pricelist entry exists for the vendor+product combination, or the ordered quantity is below the minimum, the price field is blank. Check the pricelist tab on the product form and confirm a matching entry exists.

4. PO approval stuck without notification#

If the approval threshold is configured but no email notification is sent to the approver, check that the Activity or Email Notification for purchase approval is enabled in Settings. By default, a chatter note is created - not an email.


ERPeek can audit which purchase approval rules and vendor pricelist entries are configured in your Odoo instance, and identify POs that bypassed approval thresholds. See the contact page for details.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free