All posts
Integrator7 min read

Odoo purchase order approval: configuring approval levels, purchase limits, and delegation

Odoo purchase order approvals let you require manager sign-off before a PO is sent to a vendor. This guide covers the built-in approval threshold, multi-level approval using automated actions, and the approval matrix pattern for companies that need tiered purchasing authority.

Uncontrolled purchasing is one of the most common sources of budget overrun in mid-size companies. Odoo's built-in purchase approval workflow stops a PO from being sent to a vendor until the right person confirms it - but the out-of-the-box settings only cover a single approval threshold. If your organization needs multiple tiers (team lead → department head → CFO for orders above a certain amount), you'll need to extend the built-in flow.

The built-in purchase approval threshold#

Purchase → Configuration → Settings → Order Approval - enable Purchase Order Approval and set the Amount threshold.

When enabled, any PO where the total exceeds the threshold moves from Draft to To Approve when the buyer clicks Confirm. A user with the Purchase Manager role must then click Approve Order before Odoo sends the RFQ to the vendor.

Below the threshold, confirming a PO bypasses the approval step and sends the order directly.

This binary model (under threshold = auto-approved, over threshold = manager approval) covers most SME requirements. The approval step is logged in the chatter and the approver's name appears in the PO header.

Who can approve#

The Purchase Manager group (purchase.group_purchase_manager) is the only group that can click Approve Order by default. Any user in that group sees the approval button.

There is no built-in per-user purchase limit or hierarchy. If you need "manager A can approve up to $10k, manager B can approve up to $50k, CFO approves anything above", you need either:

  1. A customized module that adds approval rules per user.
  2. The Odoo Approvals module (Enterprise) with a purchase approval template.

Using the Approvals module for multi-level PO approval#

Odoo Enterprise includes the Approvals module (approvals). It adds:

  • Approval Templates: Define an approval process with multiple approvers and conditions.
  • Approval Requests: Triggered from a sale or purchase order, routed to the correct approver(s) automatically.

To configure purchase approval using the Approvals module:

  1. Install the Approvals app.
  2. Go to Approvals → Configuration → Approval Categories and create a new category: Purchase Order Approval.
  3. Add Approvers - these can be specific users or users in a specific role.
  4. Set an Amount Minimum if the approval only triggers above a threshold.
  5. On the purchase order form, a new Approvals smart button appears. Configure the approval template to link to this category.

The limitation: the Approvals module is document-level. It does not natively do a cascading approval chain where the second approver is only notified after the first approves. For true multi-step workflows (A must approve before B sees it), you need automated actions or a custom module.

Automated actions for tiered approval#

For a tiered approval matrix without the Enterprise Approvals module, use Settings → Technical → Automation → Automated Actions (requires developer mode).

Example: Two-tier approval where orders over $5,000 require department head approval, and orders over $25,000 also require CFO approval.

Automated Action 1 - Department Head Notification:

  • Model: Purchase Order (purchase.order)
  • Trigger: Stage is set to (when status changes to to approve)
  • Condition: amount_total > 5000
  • Action: Send email to the department head (computed from user_id.parent_id if your HR hierarchy is set) or add a follower.

Automated Action 2 - CFO Notification:

  • Same trigger, condition amount_total > 25000, sends to the CFO user.

This approach notifies approvers but does not enforce sequential approval - both notifications fire simultaneously and either approver can approve. Enforcing strict sequencing requires a custom status field and more complex logic.

The Delegated Purchasing pattern#

For organizations where buyers have a personal spending limit (not a company-wide threshold), the common pattern is:

  1. Add a custom field x_purchase_limit (Monetary) to res.users.
  2. Override the button_confirm method on purchase.order to check if amount_total > self.user_id.x_purchase_limit.
  3. If over limit, set status to to approve and post a chatter note; if under limit, proceed to purchase (confirmed) status normally.
  4. The approval button checks whether the approver has a higher limit than the buyer.

This requires a custom module. The logic lives in purchase/models/purchase.py - override button_confirm and button_approve.

Resetting and rejecting approvals#

The built-in approval workflow has no Reject button. If a manager decides not to approve, they either:

  1. Move the PO back to Draft manually (cancel → reset to draft).
  2. Add a chatter note explaining the rejection and leave the PO in To Approve state.

If you need a formal rejection flow (status changes to "Rejected", buyer is notified, PO is locked), this requires a custom state field and automated action for notification.

Audit trail for approvals#

Every approval action creates a chatter entry on the PO. The entry records who approved, when, and the PO total at the time of approval. For compliance, instruct approvers never to approve verbally - always use the Approve Order button so the chatter entry is created.

You can also run Purchase → Reporting → Purchase Analysis filtered by status (to approve) to see all pending approvals. Add the Approver column by grouping by approved_by to see who approved what.

Common mistakes#

Setting the threshold too low: If every $100 office supply order needs manager approval, managers spend their day clicking Approve. Set the threshold at the point where spending genuinely warrants oversight - typically $1,000–$5,000 for SMEs.

Approving from email notifications without reviewing the PO: Odoo sends approval-request emails with a direct link. Approvers who click Approve directly from email without opening the PO may miss changed quantities or substituted products. Train approvers to always open the PO before approving.

Not setting a default approver: If no one in the Purchase Manager group is active, POs pile up in To Approve with no one receiving notification. Ensure at least two users have the Purchase Manager role so coverage exists during absence.

Confusing receipt approval with purchase approval: Inventory → Settings has a separate Reception Report approval for validating multi-step receipts. This is not the same as PO approval - one controls who can confirm the purchase, the other controls who validates the incoming shipment.


For the full purchase cycle, see the Odoo purchase-to-pay workflow guide. For budget control by analytic account, see the Odoo analytic accounting guide.

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

Get started free