Skip to main content
iVentureTeam
Internal Controls

Odoo Internal Controls: Access, Approvals, 3-Way Match, Audit Trail

Set up Odoo internal controls in Odoo 19 and 20: access rights, segregation of duties, purchase approvals, three-way match, lock dates and the audit trail.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 2, 202612 min read2 views
Odoo Internal Controls: Access, Approvals, 3-Way Match, Audit Trail cover

Most guides on Odoo internal controls stop at "Odoo has access rights and approvals". Finance teams need to know which setting closes which risk, and where the gaps sit. Our Odoo consulting services start with exactly that control map.

This guide is for CFOs, financial controllers and finance managers running Odoo 19 or Odoo 20 across any country. It covers the whole finance cycle; for the sales side alone, see our guide to Odoo sales order approval thresholds and Studio rules.

What are internal controls in Odoo?

Internal controls in Odoo are the settings, rights and approval steps that stop one person from creating, approving and paying a transaction alone, and that leave a record of every change. They protect cash, keep reports accurate and give auditors evidence.

A control has three parts: a rule (who may do what), a setting that enforces it, and a record that proves it ran. Odoo covers the last two; the rule must come from your finance team. If you are new to how journals, accounts and entries fit together, read how Odoo Accounting works first.

Which Odoo internal controls matter most for finance teams?

Odoo internal controls: Which control closes which risk?

Six controls cover most audit findings we see in Odoo databases: access rights, purchase approvals, three-way match, lock dates, entry hashing and the audit trail. The table maps each one to the risk it closes and where you set it up.

ControlRisk it closesOdoo 19/20 featureWhere to set it
Access rightsOne user creates and pays a vendorAccounting, Purchase and Bank groupsSettings, Users, Access Rights tab
Purchase approvalLarge orders placed without sign-offPurchase Order Approval with a minimum amountPurchase, Configuration, Settings
Multi-step approvalSame person approves twiceStudio approval rules with Exclusive ApprovalStudio, on the Confirm button
Three-way matchPaying for goods not received3-way matching and "Should Be Paid"Purchase settings, Invoicing section
Lock datesEdits to closed or filed periodsTax return, Lock Everything and Hard Lock datesAccounting, Accounting, Lock Dates
Audit trailSilent changes to posted dataAudit Trail report, restrictive mode, hashAccounting, Review, Audit Trail

How do you set up Odoo segregation of duties with access rights?

Odoo segregation of duties starts with access rights: give each role only the groups it needs, so no single user can create a vendor, post a bill and send the payment. Odoo's access rights documentation explains roles and groups.

In Odoo 20, every user gets a role (User, Administrator or Light), and groups add the detailed rights. The Accounting app has levels such as Invoicing, Basic, full accounting and Administrator, plus a read-only level that suits an external auditor.

Bank accounts need special care. Odoo marks new bank accounts as untrusted, and only a user with the "Validate bank account" right can trust them. Keep that right away from the people who enter bills.

A simple segregation of duties matrix for a mid-size finance team looks like this:

TaskAP clerkPurchase managerControllerCFO
Create vendor and bank detailsYesNoNoNo
Trust a vendor bank accountNoNoYesYes
Confirm purchase orders above thresholdNoYesNoYes
Post vendor billsYesNoYesNo
Register and sign paymentsNoNoYesYes
Set lock dates and exceptionsNoNoYesYes

Check the Technical Access Rights tab too, since inherited groups can add rights. Also avoid shared logins, which break every control above; our post on Odoo shared user accounts and audit trail risks explains why.

How does the Odoo purchase order approval workflow work?

The Odoo purchase order approval workflow uses the built-in Purchase Order Approval setting: orders above a minimum amount go to "To Approve" until a purchase administrator confirms them. For more levels, you add Studio approval rules on the Confirm Order button.

In Purchase, Configuration, Settings, tick Purchase Order Approval and enter a Minimum Amount. It gives one approval level, handled by purchase administrators.

Users trip over two things. On the Odoo forum, one user set the approval to $500 and found the setting never seemed to trigger. The fix was to test as a plain purchase user, since approvers can confirm directly.

The second issue is multi-level approval. An Odoo 16 user built two amount-based Studio rules and still saw purchase managers approve orders above $1,000. Studio approval needs careful group design and testing with each role.

Studio approval rules let you set approvers or an approver group per step, add conditions, set the approval order and turn on Exclusive Approval. Exclusive Approval means a user who approves one step cannot approve another step on the same record.

Studio is part of the Custom plan, which costs US$61.00 per user a month billed yearly in the US on the Odoo pricing page. When rules need logic Studio cannot express, our Odoo customization services build a small approval module instead.

How does Odoo three-way match work?

Odoo three-way match compares the purchase order, the receipt and the vendor bill, and flags a bill as "Should Be Paid: Exception" when the bill does not agree with what was ordered and received. Odoo describes it in its vendor bill control policies guide.

Set it up in this order:

  1. On each stocked product, set the Control Policy to "On received quantities" in the Purchase tab.
  2. In Purchase, Configuration, Settings, enable 3-way matching in the Invoicing section.
  3. Create bills from the purchase order with Create Bill, so lines link to the PO.
  4. Check the Should Be Paid field in the Other Info tab: Yes, No or Exception.
  5. Filter bills by Exception every week and resolve them before the payment run.

Know the limit: Odoo marks a changed bill as Exception but does not block it. Three-way match is a detective control, so your payment run must exclude Exception bills by procedure or an extra approval.

How do lock dates protect closed periods in Odoo?

Odoo lock dates stop anyone from posting or editing entries on or before a chosen date, which protects closed months, filed tax returns and audited years. You manage them in Accounting, Accounting, Lock Dates.

Odoo's year-end closing guide describes three dates that matter for controls:

  • Tax return lock date: blocks changes that would affect VAT entries in a filed period; new entries move their tax to the next open period.
  • Lock Everything date: blocks creating or changing any posted entry on or before the date; new entries get the next day's date.
  • Hard Lock date: irreversible, made for countries that require inalterable books.

An accounting administrator can grant a lock date exception, for one user or everyone, with a reason. Odoo logs it in the company record's chatter, so review it at month end.

What does the Odoo audit trail record?

The Odoo audit trail records every change to accounting fields with the date, time, user, type of change, old value and new value. You open it in Accounting, Review, Audit Trail.

Odoo's accounting reports documentation also describes the Restrictive Audit Trail setting. With it on, tracked records cannot be deleted, only cancelled or archived. Turn it on in Accounting settings, in the Reporting section.

For stronger proof, enable Secure Posted Entries with Hash on sales, purchase and miscellaneous journals. Odoo's data inalterability guide explains the SHA-256 hash chain. Once you post in a restricted journal, you cannot switch hashing off or edit secured entries.

Which payment controls stop fraud and double payments in Odoo?

Payment controls in Odoo rest on trusted bank accounts, duplicate bill warnings and the payment wizard's check for amounts already paid. Together they cut the two most common losses: paying a fake bank account and paying the same bill twice.

  • Trusted bank accounts: Odoo sets new accounts as untrusted, which blocks outgoing transfers until someone verifies them, as the batch payments guide explains.
  • Duplicate warnings: red flags likely duplicates (same vendor, reference, date and amount); yellow flags possible ones to check before posting.
  • Double payment check: in Odoo 20, the payment wizard deducts payments already made but not yet matched with the bank.
  • Signed payments: Odoo 20 Enterprise can send vendor payments to the bank from Odoo with a single signature.

What changed for Odoo internal controls in Odoo 20?

Odoo 20 adds several control-related changes: cash journal hashing, clearer purchase order matching, a batch Reset to Draft action and split Accounting Firms mode settings. Our Odoo 20 accounting release notes cover each one with screenshots.

Change in Odoo 20What it means for controls
Cash journal hashingCash journals can now use Secure Posted Entries with Hash
Purchase order matchingBill lines show warnings when price or quantity differ from the PO
Reset to Draft in list viewsPosted entries can be reset in batch, so restrict who can do it
Accounting Firms mode splitDocument's sequence editable is now its own option; keep it off
Expenses as draft billsApproved expenses create draft bills reviewed with other vendor documents

Watch the batch Reset to Draft action. Lock dates and hashing protect closed periods, but open periods are exposed, so limit who can use it.

Odoo internal controls by industry

The control that matters most depends on where your money leaks. Product firms focus on receipts and three-way match; service firms on expenses and billing.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
ManufacturingPaying for short or rejected deliveriesReceipt-based control policy and 3-way matchingMap receipts and quality checks to bill control
Wholesale and distributionHigh purchase volume, many vendorsPO approval threshold plus duplicate bill warningsSet thresholds by spend band
Professional servicesExpense claims and write-offsExpense approvals and lock datesBuild approver groups per team
Retail and eCommerceCash and POS differencesCash journal hashing in Odoo 20Design cash close routines
ConstructionSubcontractor bills against progressStudio approvals on bill confirmationAdd project-based approval steps

How do you test Odoo internal controls before an audit?

Test every control as a real user of each role, not as an administrator, because administrators skip most rules. A short quarterly test cycle is enough for most firms.

  1. Log in as each role and try a task that role must not do.
  2. Raise a purchase order just above the threshold and check it stops at To Approve.
  3. Edit a draft bill above the received quantity and confirm it shows Exception.
  4. Try to post an entry in a locked period.
  5. Change a posted field and check the Audit Trail report shows it.
  6. Add a new vendor bank account and confirm it cannot be paid until trusted.

Our free Odoo health check flags common setup risks in a few minutes. For a deeper review, our Odoo audit checklist lists warning signs and severity scores.

How iVentureTeam helps with Odoo internal controls

Unsure of your setup? Run a health check

iVentureTeam turns your finance policy into working Odoo settings, approval rules and tests that auditors can follow. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.

  • Control matrix: we map your segregation of duties rules to Odoo roles and groups.
  • Approval design: purchase thresholds, Studio approval rules and, where needed, small custom modules.
  • Close setup: lock dates, journal hashing, restrictive audit trail and a month-end routine.
  • Testing: role-based tests your team can repeat each quarter.
  • Training: short sessions for approvers and AP staff through our Odoo ERP training.

For GCC groups with VAT and e-invoicing duties, see our guide on Odoo accounting for CFOs in the GCC.

Odoo internal controls case study: Fernando Tax Management B.V.

Controls only work on clean data, and this Dutch tax firm needed its accounting data cleaned up and visible before it could trust its reports. Fernando Tax Management B.V. is a tax and accounting practice in the Netherlands.

Manual entry had produced duplicate and inconsistent records, and a hidden journal lines issue was obscuring accounting data.

Over 10 weeks, iVentureTeam migrated the firm to Odoo 18 and fixed the hidden journal lines issue. We built a cost-tracking workflow into the Sales and Purchase modules and created localized tax reports for the Netherlands and Curaçao.

The firm reports a 60% reduction in manual data entry, with all its processes on one Odoo platform. Read the Fernando Tax Odoo accounting automation case study.

The bottom line on Odoo internal controls

Odoo 19 and 20 have the tools a finance team needs for strong internal controls, but they only work when you design roles first, switch the right settings on and test them as real users. Defaults alone will not satisfy an auditor.

Start with a one-page control matrix, then set access rights, purchase approvals, three-way match, lock dates and the audit trail in that order. Retest each quarter and after every upgrade.

Ready to tighten your Odoo finance controls?

Book an Odoo controls review

Get a control review from a team that configures Odoo Accounting every week. Request an Odoo internal controls review, call +91-90235-15208, or email business@iventureteam.com.

Frequently Asked Questions

Does Odoo have an audit trail?

+

Yes. Odoo Accounting has an Audit Trail report under Accounting, Review. It shows the date, time, user, change type, old value and new value for changes to accounting fields. A restrictive mode stops tracked records from being deleted.

How do I set up an approval workflow in Odoo Purchase?

+

Go to Purchase, Configuration, Settings, tick Purchase Order Approval and enter a minimum amount. Orders above it wait in To Approve for a purchase administrator. For more levels, add Studio approval rules on the Confirm Order button.

Does Odoo support three-way matching?

+

Yes. Enable 3-way matching in Purchase settings and set products to bill on received quantities. Vendor bills then show a Should Be Paid field set to Yes, No or Exception, based on the order and the receipt.

How do I enforce segregation of duties in Odoo?

+

Give each role only the Accounting, Purchase and Bank groups it needs, keep bank account validation separate from bill entry, and use Studio approval rules with Exclusive Approval so one person cannot approve two steps.

What is a lock date in Odoo?

+

A lock date blocks posting or editing entries on or before that date. Odoo has a tax return lock date, a Lock Everything date and an irreversible Hard Lock date. Administrators can grant logged exceptions with a reason.

Can a posted journal entry be changed in Odoo?

+

A posted entry can be reset to draft and edited unless a lock date covers it or its journal uses hashing. Once a hashed journal has posted entries, secured entries cannot be edited and hashing cannot be turned off.

Do Studio approval rules need the Custom plan?

+

Yes. Studio is included in the Odoo Custom plan, along with multi-company and the external API. The Standard plan does not include Studio, so multi-step approvals need Custom or a custom module.

What should auditors get access to in Odoo?

+

Create a named user with read-only accounting access where possible, so the auditor can view reports and the audit trail without changing data. Never share an existing login with an auditor.

Ready to put this into action?

Talk to iVentureTeam about Odoo, AI automation, or custom development — get a free, no-obligation consultation.