Skip to content
DevMarket
Odoo ModulesWordPress PluginsWordPress ThemesShopify ThemesApp TemplatesScripts & UtilitiesBlogSell on DevMarket

Purchase Order Approval Workflow for Odoo 19 documentation

A guide to the approval of purchase orders: defining levels, asking for approval, approving and rejecting, what happens when a purchase order changes, and the settings.

Documents version 1.0.0Updated Oct 23, 2026

Start here

In plain words: A purchase order for a big amount, or with a big discount, should not be confirmed without a manager's OK. This module adds that OK to Odoo: you define approval levels, the buyer presses Request approval, the approvers are asked one after the other, and the purchase order cannot be confirmed until every level has approved it.
The four states of a purchase order: approval needed, waiting, approved and rejected with the reason.
The four states of a purchase order: approval needed, waiting, approved and rejected with the reason.
Tip: The approval is tied to the amount: if the total or a discount changes after approval, the purchase order must be approved again.

What you get

FeatureWhat it does
Approval levelsBy order total, by the highest line discount, or both.
Several levels in sequenceA 5,000 order needs the purchase manager; a 20,000 order needs the purchase manager and then the director.
Hard stopConfirm is refused until the purchase order is approved. Vendors are not affected: the guard is for your own users.
Activities and notesEach approver gets a task; every step is written in the chatter.
Reasons for rejectionA rejection needs a reason, which the buyer sees.
Approval is cancelled by a changeA different total or discount asks for a new approval.
To Approve listEach approver sees the purchase orders waiting for them, even those of colleagues.
SettingsSwitch it off, confirm automatically when approved, allow buyers to approve their own.

Requirements

ItemDetails
Odoo19.0 (Community or Enterprise)
Apps neededPurchase (purchase)
ApproversInternal users with access to Purchase
LicenseOPL-1 (Odoo Proprietary License v1.0)

Install

  1. Unzip the package. Inside is taqnix_purchase_approval.zip; unzip it to get the folder taqnix_purchase_approval.
  2. Copy the folder into one of the addons_path folders of your Odoo server and restart Odoo.
  3. Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
  4. Remove the “Apps” filter, search Purchase Order Approval and press Install.
# or from the command line
./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_purchase_approval --stop-after-init
Tip: After installing nothing changes for your team until you add at least one approval level.

Define the approval levels

In plain words: Open Purchase → Configuration → Approval Levels. Each line is a level: who approves, and when it applies.
Three levels: a discount rule, the purchase manager from 5,000 and the director from 20,000.
Three levels: a discount rule, the purchase manager from 5,000 and the director from 20,000.
One level.
One level.
FieldMeaning
LevelThe name shown to everyone, for example “Purchase manager”.
Order total fromThe level applies when the order total (in the company currency) is at least this amount. 0 ignores the amount.
Discount from (%)The level applies when any line has at least this discount. 0 ignores the discount.
ApproversAny one of them can approve the level. They must have access to Purchase.
SequenceLevels that apply are asked in this order.
Tip: A level applies when the total reaches the amount or a line reaches the discount. Levels add up: a 26,000 order needs both the purchase manager and the director.

Settings

In plain words: Open Settings → Purchase Order Approval.
Approval on or off, confirm when approved, self-approval.
Approval on or off, confirm when approved, self-approval.
SettingWhat it does
Require approvalSwitch the whole approval off for the company.
Confirm when approvedThe purchase order is confirmed as soon as the last level approves.
Buyers may approve their own purchase ordersOff by default: the buyer and the person who asked cannot approve. If a level has no one else to approve, the request is refused with a message.

The buyer asks for approval

In plain words: When a purchase order reaches a level, a banner says so and Request approval appears. Confirm is refused until it is approved.
A 7,200 purchase order: the purchase manager must approve.
A 7,200 purchase order: the purchase manager must approve.
Pressing Confirm first explains what to do.
Pressing Confirm first explains what to do.
After Request approval: waiting for the purchase manager.
After Request approval: waiting for the purchase manager.
SituationWhat happens
Request approvalThe steps are created, the first level is asked and gets a task.
Two levelsThe second level is asked only when the first has approved.
Confirm before approvalA message explains that approval is needed or pending.
Reset approvalClears the steps so you can ask again, for example after changing the purchase order.

The approver approves or rejects

In plain words: Purchase → Orders → To Approve lists the purchase orders waiting for you, also those of your colleagues.
The purchase orders waiting for me.
The purchase orders waiting for me.
The approver sees Approve and Reject.
The approver sees Approve and Reject.
After the first level approved, the purchase order waits for the director.
After the first level approved, the purchase order waits for the director.
A rejection needs a reason.
A rejection needs a reason.
The Approval tab shows every level, who decides, and the state.
The Approval tab shows every level, who decides, and the state.

Approved, or sent back

Every level approved: the purchase order can be confirmed. The chatter shows who approved what.
Every level approved: the purchase order can be confirmed. The chatter shows who approved what.
A rejected purchase order shows the reason. Change it and press Request approval again.
A rejected purchase order shows the reason. Change it and press Request approval again.
Every step is written in the chatter.
Every step is written in the chatter.
Tip: The buyer and the person who asked are notified when the purchase order is approved or rejected.

When the purchase order changes

ChangeResult
The total or a discount goes up or down after approvalThe banner says the purchase order changed. It must be approved again to be confirmed.
The purchase order no longer reaches any levelIt can be confirmed without approval.
The purchase order is cancelled or set back to draftThe approval steps are cleared.
The purchase order is duplicatedThe copy starts without approval.

Arabic and right to left

In plain words: The levels, buttons, banners, notes and settings are translated, and the banner follows the direction of the language.
A purchase order waiting for an approver whose interface is in Arabic.
A purchase order waiting for an approver whose interface is in Arabic.

Who can do what

WhoWhat they can do
BuyersRequest approval for their purchase orders, reset it.
ApproversSee and approve or reject the purchase orders waiting for them, even if they belong to a colleague.
Purchase managersDefine the approval levels and the settings.
Vendors (portal)Are not affected: the guard applies to your own users.

Limits

LimitDetail
Purchase orders onlyIt guards the Confirm Order button of requests for quotation. Sales quotations have their own module.
Any one approver per levelA level is approved by any one of its approvers; there is no “two out of three”.
Internal confirmations are guardedEverything that confirms a purchase order as an internal user is blocked, including server actions.
CurrencyAmounts are compared in the company currency.

For developers

In plain words: Skip this chapter if you only use the module.
ItemDetails
Modelstaqnix.purchase.approval.rule (a level), taqnix.purchase.approval.line (a step of one purchase order).
Order fieldstx_approval_state, tx_banner, tx_current_approver_ids, tx_approval_needed.
Methodsaction_tx_request_approval, action_tx_approve, action_tx_reset_approval; the guard is _tx_check_approval.
# approve from your own code, as the approver
order.with_user(manager).action_tx_approve()

# which levels does a purchase order need?
order._tx_required_rules().mapped('name')

Troubleshooting

ProblemWhat to do
Nothing is asked for approvalCheck that a level exists, that its amount or discount is reached, and that Require approval is on.
Request approval says nobody can approveThe only approver is the buyer or you. Add another approver, or allow self-approval in the settings.
An approver cannot find the purchase orderUse Purchase → Orders → To Approve. The approver needs access to Purchase.
The purchase order was approved but cannot be confirmedThe total or a discount changed after approval. Request approval again.
A level cannot be savedA level needs an amount or a discount, and every approver needs access to Purchase.

Updating and removing

Replace the folder with the new version, restart Odoo and run -u taqnix_purchase_approval. Levels and settings are kept. To remove it, uninstall it from Apps: the levels and the approval history are deleted with it, and purchase orders can be confirmed freely again.

Support

Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.