Skip to main content
iVentureTeam

Odoo 20 Accounting Release Notes

All 45 Accounting changes from the official Odoo 20 release notes, explained in plain words with a screenshot from a live Odoo 20 database, plus where to find each one and what it means for your upgrade.

Planning the move? See our Odoo upgrade services, the Odoo 20 upgrade guide or get a number from the migration cost calculator.

New feature 9Enhancement 29Refactoring 5Removal 1Security 1In Community 28Enterprise only 17
Type
Edition

Change 1 of 45

Accounting Firms mode settings

EnhancementCommunity + Enterprise

The "Accounting Firms mode" settings have been updated to increase their flexibility.

Official Odoo 20 release note

In plain words

The old single "Accounting Firms mode" dropdown is split into three separate company settings: Quick encoding (the "Total (tax inc.)" field that builds lines for you), Document's sequence editable, and Review data. You can now turn on only the parts you need.

Accounting > Configuration > SettingsThe Accounting Firms mode block now has three separate options: Quick encoding, Document's sequence editable and Review data.

Where to find it

  1. Accounting > Configuration > Settings
  2. Scroll to the Accounting Firms mode block.

For users

Settings show three independent checkboxes under Accounting Firms mode instead of one selection.

For developers

New company fields quick_edit_mode_enabled, document_sequence_editable and set_to_review_documents; quick_edit_mode is now only shown when quick encoding is enabled.

Upgrading from Odoo 19

Code that tested quick_edit_mode alone to decide if sequences are editable should check document_sequence_editable instead.

Change 2 of 45

Analytic distribution for write-offs

EnhancementEnterprise only

Define an analytic distribution when creating a write-off during reconciliation.

Official Odoo 20 release note

In plain words

When you reconcile items that do not balance and Odoo asks for a write-off, the Write-Off Entry dialog now has an Analytic Distribution field, so the write-off line can be charged to a project or department.

Accounting > Journal Items > ReconcileThe Write-Off Entry dialog for a 20.00 difference, with the new Analytic Distribution field set to Acme Corporation.

Where to find it

  1. Accounting > Accounting > Journal Items
  2. Filter a customer and Receivable, select an invoice and a smaller credit note, click Reconcile.
  3. In the Write-Off Entry dialog, fill Analytic Distribution.

For users

Write-offs created from the reconcile dialog can carry analytic accounts.

For developers

account.reconcile.wizard gets an analytic_distribution field passed to the write-off line.

Upgrading from Odoo 19

None.

Change 3 of 45

Annual report layout

EnhancementEnterprise only

Annual reports now use the company's document layout.

Official Odoo 20 release note

In plain words

Annual reports (the former Audit Report built in Knowledge) are printed with the company's document layout: the cover, title pages, table of contents and body pages go through the company's external layout and colours.

Accounting > Reporting > Annual ReportAn annual report record under the renamed Annual Report menu. Its PDF export uses the company document layout.

Where to find it

  1. Accounting > Reporting > Annual Report
  2. Create a report, open it and export it to PDF.

For users

Exported annual reports match the look of invoices and other company documents.

For developers

The PDF parts render through web.external_layout; the export refuses to run when the company has no document layout set.

Upgrading from Odoo 19

Set a document layout on the company before exporting annual reports.

  • The layout itself only shows in the exported PDF, so the screenshot shows where annual reports live. In testing, export failed with "Please make sure a document layout has been set for the company" until a layout was chosen, which confirms the new dependency.

Change 4 of 45

Asset depreciation

EnhancementEnterprise only

Rates and float numbers can now be used when depreciating assets.

Official Odoo 20 release note

In plain words

Straight-line depreciation models can now be based on a Rate (for example 12.5% per year) instead of a duration, and durations accept decimals such as 2.5 years.

Accounting > Configuration > Depreciation ModelsThe new Based On choice set to Rate, with a 12.5% per year rate.

Where to find it

  1. Accounting > Configuration > Depreciation Models
  2. New, Method Straight Line, Based On Rate, enter 12.5 % per Year.

For users

Pick Based On: Rate in a depreciation model and type the yearly percentage; the model name is generated from it.

For developers

method_number becomes a Float; new method_mode (duration/rate) and computed method_rate with inverse.

Upgrading from Odoo 19

Custom code that treats method_number as an integer (range(), int formatting) must handle floats.

Change 5 of 45

Bank consistency

EnhancementCommunity + Enterprise

Part 1

All journal entries impacting bank accounts must now originate from bank transactions, preventing manual journal mismatches.

Official Odoo 20 release note

In plain words

Manual journal entry lines no longer accept bank and cash accounts, so money on a bank account can only come from bank transactions (opening balances also create bank transactions).

Accounting > Journal Entries > NewSearching 1014 offers the suspense and outstanding accounts but not 101401 Bank, which can no longer be used on a manual line.

Part 2

Statement validation feedback has also been refined to quickly identify and fix balance inconsistencies.

Official Odoo 20 release note

In plain words

The bank matching screen shows a short, clear problem next to a wrong statement, such as "Incorrect ending balance, expected ...", with a Review link.

Accounting > Dashboard > BankThe statement header in red with "Incorrect ending balance, expected $ 7,128.00" and a Review link.

Where to find it

  1. Bullet 1: Accounting > Journal Entries > New, add a line and search account 1014.
  2. Bullet 2: Accounting dashboard, open the Bank journal's matching screen with a statement whose ending balance is wrong.

For users

Bank balances can only be changed through bank transactions; broken statements are flagged with an exact message.

For developers

Account domains on journal lines exclude asset_cash; _create_opening_balance_bank_statements creates statement lines for opening balances; problem_description texts changed.

Upgrading from Odoo 19

Imports or scripts that post manual entries on bank accounts should create bank statement lines instead.

Change 6 of 45

Bank reconciliation summary report

EnhancementEnterprise only

The bank reconciliation summary report provides a detailed view of reconciled and unreconciled transactions based on the end date of the selected period.

Official Odoo 20 release note

In plain words

The Bank Reconciliation Summary report now lists reconciled transactions as well as unreconciled ones (receipts and payments) up to the end date of the period.

Accounting > Bank > Bank Reconciliation SummaryThe new Reconciled Transactions section with Receipts, Payments and its total, above the unreconciled part.

Where to find it

  1. Accounting > Dashboard > Bank card menu > Reconciliation Report (Bank Reconciliation Summary).

For users

The report explains the full bank balance: reconciled plus unreconciled transactions.

For developers

New report lines and custom engines _report_engine_reconciled_receipts/_payments.

Upgrading from Odoo 19

Custom reports inheriting the bank reconciliation report lines should check the new line structure.

Change 7 of 45

Bank synchronization: Syncfy

New featureEnterprise only

Not verified from the Odoo 20 source code. Shown as Odoo published it.

Syncfy is supported as a third-party provider for bank synchronization in LatinAmerica.

Official Odoo 20 release note

In plain words

Not verified from the supplied source code. Syncfy would be a bank synchronisation provider for Latin America.

Where to find it

  1. Accounting > Configuration > Add a Bank Account (provider list comes from Odoo's server).

For users

Not verified.

For developers

No reference to Syncfy was found in Community or Enterprise source; providers are handled by Odoo's online synchronization proxy service.

Upgrading from Odoo 19

None.

  • Text only: the provider list is served by Odoo's external bank synchronization service, not by the source code, and it cannot be shown without a live connection.

Change 8 of 45

Bill line prediction

EnhancementEnterprise only

Partly confirmed in the Odoo 20 source code. Parts of this note could not be traced.

When encoding a bill (manually or via import), Odoo suggests line elements based on the bill history and the label. The product, account, tax, analytic distribution, and the vehicle will be automatically pre-encoded based on the best matches. Manually encoded values on existing lines are still preserved.

Official Odoo 20 release note

In plain words

When a bill line is created, Odoo looks at earlier posted bills of the same vendor and picks the best match on the label to fill product, account, taxes, analytic distribution and, with Fleet, the vehicle. Values you typed yourself are kept.

Accounting > Vendors > BillsThe imported bill line got account 612500 Vehicle Fuel from the earlier bill with the same label.

Where to find it

  1. Post a bill for a vendor with a line "Diesel fuel card" on account 612500.
  2. Accounting > Vendors > Bills > Upload an e-invoice (UBL) from the same vendor with the same label.

For users

Imported bills come with the account used last time for the same vendor and label.

For developers

_predictive_field_getter returns (field, formatter, SQL) tuples; accountant_fleet adds vehicle_id; protected fields keep manual values.

Upgrading from Odoo 19

Overrides of the old prediction helpers must move to _predictive_field_getter.

  • In this build the account was predicted on import. Typing the label by hand in the new Description cell did not trigger the prediction, and the analytic and vehicle were not filled on import, although the server method returns them (checked in an Odoo shell), so the bullet is partial.

Change 9 of 45

Bill options display

EnhancementCommunity + Enterprise

Options added on a bill such as depreciation models, vehicles, and deferred payments are stacked vertically under the account instead of being displayed horizontally.

Official Odoo 20 release note

In plain words

On bill lines, extra options such as the depreciation model, the vehicle and deferred dates are shown stacked under the account in the same cell, instead of in extra columns.

Accounting > Vendors > BillsThe account 151100 Company Vehicles with the depreciation model 5 Years and the vehicle 1-ACK-205 stacked below it.

Where to find it

  1. Accounting > Vendors > Bills, open a bill with a line on a fixed asset account that is also a vehicle account.

For users

Bill lines are narrower and easier to read; related options sit under the account.

For developers

account_id in invoice lines uses the m2o_cell_with_extra_fields widget with parent_field; fields placed next to account_id render under it.

Upgrading from Odoo 19

Custom views that add columns after account_id on invoice lines will now render inside the account cell.

Change 10 of 45

Bill/invoice matching rules

New featureCommunity + Enterprise

Configure "Matching Rules" to set payment tolerance and matching order for automatic bill/invoice reconciliation.

Official Odoo 20 release note

In plain words

A new Matching Rules menu lets you define rules for automatic bill and invoice matching in bank reconciliation: a payment tolerance (in percent or amount) and a matching order (oldest or newest first).

Accounting > Configuration > Matching RulesA matching rule with a 2% payment tolerance and Oldest first matching order.

Where to find it

  1. Accounting > Configuration > Matching Rules (also from the bank journal card menu)
  2. New rule: set Payment Tolerance and Matching Order.

For users

Bank transactions are matched to open invoices and bills with a tolerance you choose, in the order you choose.

For developers

account.reconcile.model gets rule_type (matching_rule / reco_model), payment_tolerance, payment_tolerance_type and matching_order; matching rules are always auto_reconcile.

Upgrading from Odoo 19

Existing reconciliation models stay reco_model; check custom matching logic that relied on the old invoice matching models.

  • The demo rule was archived again after the screenshot so it does not change other bank matching.

Change 11 of 45

Cash journal entry hashing

SecurityCommunity

Secure cash journals with entry hashing upon reconciliation.

Official Odoo 20 release note

In plain words

Cash journals can now use "Secure Posted Entries with Hash". When a cash statement is posted, its transactions are marked reconciled and their entries are hashed, and a hashed cash statement cannot go back to draft or end with a negative balance.

Accounting > Configuration > JournalsOn a Cash journal the Advanced Settings tab now offers Secure Posted Entries with Hash. In Odoo 19 it was only shown for sales, purchase and miscellaneous journals.

Where to find it

  1. Accounting > Configuration > Journals > New (or a cash journal), Type Cash
  2. Advanced Settings tab: Secure Posted Entries with Hash.

For users

Cash registers can be made tamper proof like sales and purchase journals.

For developers

New statement fields is_statement_posted and is_journal_hash, action_post and _hash_statement, constraints _check_hashed_journal_statement_state and _check_hashed_journal_balance_end_real.

Upgrading from Odoo 19

Once hashed, cash statements cannot be reset to draft; plan imports before enabling.

  • The screenshot uses an unsaved new Cash journal because the demo database has no cash journal.

Change 12 of 45

Conversion rates

EnhancementCommunity

Conversion rates are now clearly displayed when registering payments in a foreign currency.

Official Odoo 20 release note

In plain words

When you register a payment in a foreign currency, the Pay dialog shows the conversion rate under the amount (for example 1 USD = 0.86 EUR).

Accounting > Customers > Invoices > PayThe rate line 1 USD = 0.860000 EUR under the payment amount.

Where to find it

  1. Open a posted customer invoice in EUR (company in USD) and click Pay.

For users

No more guessing which rate Odoo uses for a foreign currency payment.

For developers

New exchange_rate field on account.payment.register and an account_currency_exchange_rate widget.

Upgrading from Odoo 19

Custom views replacing amount_div in the register payment wizard must keep the new layout.

Change 13 of 45

Cumulative Translation Adjustment (CTA)

New featureEnterprise only

An auditable "Cumulative Translation Adjustment (CTA)" line has been added to the balance sheet, trial balance, and general ledger to automatically balance discrepancies caused by different exchange rate types (e.g., historical vs. closing) across account categories.

Official Odoo 20 release note

In plain words

The balance sheet has a new "Cumulative Translation Adjustments" line under Other Comprehensive Income. When companies with different currencies are reported together, it absorbs the gap caused by using different rate types (historical, closing, average), and it can be audited. The trial balance and general ledger show it too.

Accounting > Configuration > Accounting Reports > Balance SheetThe new Other Comprehensive Income line and its Cumulative Translation Adjustments child in the balance sheet definition.

Where to find it

  1. Accounting > Configuration > Accounting Reports (debug mode) > Balance Sheet, Lines tab.

For users

Consolidated multi-currency balance sheets balance, with a traceable CTA figure.

For developers

New CTA/OCI report lines with custom engine _report_engine_cumulative_translation_adjustment; currency_translation option 'cta'.

Upgrading from Odoo 19

Localized balance sheets that do not include a CTA line show a warning when reporting several currencies.

  • All demo companies use USD, so the CTA line is zero and hidden in the report itself; the screenshot shows it in the report definition.

Change 14 of 45

Currency exchange rate providers

New featureEnterprise only

Part 1

New currency exchange rate providers are available: The Central Bank of Azerbaijan(available from 19.0)

Official Odoo 20 release note

In plain words

The Central Bank of Azerbaijan can be chosen as the service for automatic currency rates.

Accounting > Settings > Currencies > ServiceThe option [AZ] Central Bank of Azerbaijan (the dropdown cuts the long name).

Part 2

The National Bank of Georgia (available from 19.0)

Official Odoo 20 release note

In plain words

The National Bank of Georgia can be chosen as the service for automatic currency rates.

Accounting > Settings > Currencies > ServiceThe option [GE] National Bank of Georgia.

Part 3

The National Bank of Kazakhstan (available from 19.0)

Official Odoo 20 release note

In plain words

The National Bank of Kazakhstan can be chosen as the service for automatic currency rates.

Accounting > Settings > Currencies > ServiceThe option [KZ] National Bank of Kazakhstan.

Part 4

The Saudi Central Bank

Official Odoo 20 release note

In plain words

The Saudi Central Bank (SAMA) is a new service for automatic currency rates.

Accounting > Settings > Currencies > ServiceThe option [SA] Saudi Central Bank (SAMA).

Part 5

The Central Bank of Uzbekistan (available from 19.0)

Official Odoo 20 release note

In plain words

The Central Bank of Uzbekistan can be chosen as the service for automatic currency rates.

Accounting > Settings > Currencies > ServiceThe option [UZ] Central Bank of Uzbekistan.

Where to find it

  1. Accounting > Configuration > Settings > Currencies
  2. Tick Automatic Currency Rates and open the Service list; type the country name.

For users

Companies in these countries can fetch official rates automatically.

For developers

New provider codes cbar, nbg, nbkz, sama and cbu with their _parse_*_data methods.

Upgrading from Odoo 19

None.

  • The release note says four providers are also available from 19.0; this cannot be checked because the Odoo 19 Enterprise source is not available. All five are present in Odoo 20.

Change 15 of 45

Customer invoice reminders

EnhancementCommunity + Enterprise

Send customer invoice follow-ups manually via the invoice list view or via the "Send" button on the invoice form view. Automatic invoice reminders can be enabled and managed in the Accounting settings.

Official Odoo 20 release note

In plain words

Customer invoice reminders can be sent by hand from the invoice list (Send Reminder button on selected invoices) or from the Send button of an invoice. Automatic Invoice Reminders is a setting in Accounting, with a link to manage the reminder steps.

Accounting > Customers > InvoicesWith an invoice selected, the list shows the new Send Reminder button.

Where to find it

  1. Accounting > Customers > Invoices, select an invoice.
  2. Settings: Accounting > Automatic Invoice Reminders > Manage your automatic reminders.

For users

Follow-ups become invoice reminders, reachable where invoices are handled.

For developers

New manual_reminder_action on account.move, last_reminder field, automatic_invoice_reminder company setting.

Upgrading from Odoo 19

Custom follow-up flows and templates should be checked against the reworked reminder code.

Change 16 of 45

Download invoice attachments

EnhancementCommunity

Download a zip file from the invoice list view with all the attachments that were generated for the selected invoices (PDF, XML, etc.).

Official Odoo 20 release note

In plain words

Select invoices in the list and click Download to get one zip file with all their generated documents (PDF, XML and other e-invoice files). In Odoo 19 this was an "Export ZIP" entry in the Print menu.

Accounting > Customers > InvoicesThe Download button shown for the two selected invoices.

Where to find it

  1. Accounting > Customers > Invoices, select invoices, click Download.

For users

A visible Download button for invoice files, with a warning when there is nothing to download.

For developers

action_move_download_all now filters moves with documents and returns a notification when none; button added to the list header.

Upgrading from Odoo 19

Overrides of get_extra_print_items for Export ZIP should move to the new button.

Change 17 of 45

Employee Expenses menu item

RemovalCommunity

The standalone "Employee Expenses" menu item has been removed to unify accounting flows: Approved expenses now generate draft bills in the default expense journal, allowing accountants to filter, review, and post them alongside standard vendor receipts.

Official Odoo 20 release note

In plain words

The Accounting menu no longer has Vendors > Employee Expenses. Approved expenses create draft bills or receipts in the expense journal, so accountants review and post them with the other vendor documents.

Accounting > VendorsThe Vendors menu lists Bills, Refunds, Payments, Products and Vendors; Employee Expenses is gone.

Where to find it

  1. Accounting > Vendors (open the menu).

For users

Accountants find expenses as draft bills; the Purchases journal card shows them.

For developers

Menu menu_hr_expense_account_employee_expenses removed; the action action_hr_expense_account still exists.

Upgrading from Odoo 19

Custom menus or views that reference the removed menu XML ID must be updated.

  • In the demo, approved expenses are grouped in the draft receipt "Expenses of Ronnie Hart", and the Purchases card shows "1 Expense".

Change 18 of 45

Exchange entries

EnhancementCommunity

Exchange gains and losses are now consolidated into a single line per invoice, which can be expanded to view the calculation details.

Official Odoo 20 release note

In plain words

In the payments area of an invoice, exchange gains or losses are shown as one line with the total amount. Click its info icon to see the entries behind it.

Accounting > Customers > InvoicesA single "$ 120.74 Exchange Loss" line under the reversal, with an info icon to see the detail.

Where to find it

  1. Invoice in EUR dated Aug 20, credit note in EUR dated Sep 25, reconcile them.
  2. Open the invoice and look at the totals area.

For users

Foreign currency invoices are easier to read after payment.

For developers

The payment widget data gets an exchangeInfo block (line_ids, exchange_amount, label).

Upgrading from Odoo 19

Custom payment widget templates must handle the new exchange block.

Change 19 of 45

Improved duplicate detection

EnhancementCommunity

Invoice duplicate detection has been improved with two levels of warnings for invoices and bills: red invoices that are highly likely to be duplicates that should be corrected and yellow potential duplicates that should be investigated before posting. After posting, only red warnings will remain (available from 19.0).

Official Odoo 20 release note

In plain words

Duplicate warnings on invoices and bills come in two levels. Red means almost certainly a duplicate (same reference, partner, date and amount) and stays after posting. Yellow means a possible duplicate to check, and is only shown while the document is a draft.

Accounting > Vendors > BillsThe red alert "This document might be a duplicate of NW-2026-0801 at $ 300.00".

Where to find it

  1. Post a bill with a reference, then create a draft bill with the same vendor, reference, date and amount.

For users

Fewer false alarms; real duplicates stand out in red.

For developers

is_exact_move_duplicate and duplicated_ref_ids drive the two alerts; detection is split into overridable helpers.

Upgrading from Odoo 19

Custom code using the renamed draft duplicate field must use the new name.

  • The release note marks this as available from 19.0, and the red and yellow alerts already exist in the Odoo 19 views; Odoo 20 refines the detection.

Change 20 of 45

Intercompany purchase order matching

EnhancementEnterprise only

When synchronizing sales orders, purchase orders, and invoices between companies, synchronized vendor bills are now automatically matched with synchronized purchase orders.

Official Odoo 20 release note

In plain words

With inter-company rules, when a company's invoice creates the matching vendor bill in the other company, the bill lines are now linked to the original purchase order lines, so the bill shows as matched to the PO.

Accounting > Vendors > BillsThe auto-generated bill shows PO Matching 100% and a link to purchase order P00022.

Where to find it

  1. Enable inter-company sales orders and bills between two companies.
  2. Confirm a PO to the other company, confirm the generated SO, invoice it and post.
  3. Open the generated bill in the buying company.

For users

Synchronized bills are already matched to their PO, no manual matching needed.

For developers

_inter_company_create_invoices sets purchase_line_id on the generated bill lines by product.

Upgrading from Odoo 19

None.

  • For the shot the inter-company flags were switched on only for the duration of the test, and a warehouse was added to My US Company because the flow requires one.

Change 21 of 45

Intuitive payment status

EnhancementCommunity + Enterprise

Payment statuses have been renamed from "In Process" to "Paid" and from "Paid" to "Reconciled" to clarify the flow. The manual "Mark as Reconciled" button has been moved to the action menu to encourage linking payments with real bank entries via the bank matching menu.

Official Odoo 20 release note

In plain words

Payment states are now Draft, Paid and Reconciled (before: In Process and Paid). The manual "Mark as Reconciled" is moved to the Actions menu, so payments are normally reconciled from bank matching.

Accounting > Vendors > PaymentsThe status bar Draft, Paid, Reconciled of a validated payment.

Where to find it

  1. Accounting > Vendors > Payments, open a validated payment.

For users

A payment is Paid once validated and Reconciled once matched with the bank.

For developers

Selection values in_process/paid become paid/reconciled; action_mark_payment_as_reconciled server action bound to the form.

Upgrading from Odoo 19

Code, filters and reports testing state == 'in_process' or 'paid' must be updated; the upgrade migrates stored values.

Change 22 of 45

Inventory valuation

New featureCommunity

In perpetual accounting, accrual entries that impact inventory valuation can be madedirectly from the inventory valuation closing report: Bills To Receive, Billed Not Received, Invoices To Be Issued, and Invoiced Not Delivered. The generated journal entry directly impacts the inventory valuation account instead of transiting through the stock variation account.

Official Odoo 20 release note

In plain words

With perpetual valuation, the Inventory Valuation closing report has an Accruals section (Bills to Receive, Billed Not Received, Invoices to be Issued, Invoiced Not Delivered). Generate Entries books these accruals directly from the report.

Accounting > Reporting > Inventory ValuationThe Accruals section with Bills to Receive on 211100 Accrued Expenses and the inventory side.

Where to find it

  1. Create a product category with Perpetual valuation and a storable product in it.
  2. Confirm a purchase order and receive it without billing.
  3. Inventory or Accounting > Inventory Valuation (stock-valuation-closing).

For users

Month end accruals for received but not billed (and similar) goods are done from the valuation report.

For developers

_get_accrual_candidate_lines hooks in purchase and sale; _create_accrual_moves on res.company; report data gets an accrual block.

Upgrading from Odoo 19

Custom accrual wizards should use the new company helpers.

  • In this demo only one product category is perpetual, and the inventory side of the accrual appears on 110200 Inventory Variation, so the "directly impacts the inventory valuation account" part is not visible here.

Change 23 of 45

Invoice email attachments

EnhancementCommunity

When sending an invoice by email, documents from the Documents app (available from 19.0), or documents previously added to the chatter can be easily added as attachments.

Official Odoo 20 release note

In plain words

In the Send dialog of an invoice, the paperclip button lists the files already attached to the invoice's chatter so you can add them to the email in one click, or upload a new one. A second button adds files from the Documents app.

Accounting > Customers > Invoices > SendThe paperclip menu offers Delivery confirmation.jpg from the chatter, plus Add... for a new file.

Where to find it

  1. Attach a file to an invoice's chatter.
  2. Click Send, then the paperclip button.

For users

No need to download and re-upload chatter files to send them with an invoice.

For developers

mail_attachments_widget uses the new account_move_send_attachments_selector widget.

Upgrading from Odoo 19

None.

  • The Documents app picker is the icon next to the paperclip; the release note says that part exists since 19.0.

Change 24 of 45

Manual reconciliation

EnhancementCommunity

Manual reconciliation can now be performed on any account. The "Allow Reconciliation" checkbox has been renamed "Payment Reconciliation"; this checkbox allows open items in that account to be suggested in the bank reconciliation view and determines if "Exchange Rate Difference" journal entries are expected upon reconciliation.

Official Odoo 20 release note

In plain words

Any account can now be reconciled by hand from the journal items, not only receivable, payable or flagged accounts. The old "Allow Reconciliation" checkbox is now called "Payment Reconciliation". It only decides whether open items of that account are proposed in bank reconciliation and whether exchange difference entries are expected.

Accounting > Configuration > Chart of AccountsThe column that used to be called "Allow Reconciliation" is now "Payment Reconciliation".

Where to find it

  1. Accounting > Configuration > Chart of Accounts.

For users

The Chart of Accounts shows a "Payment Reconciliation" toggle; manual reconciliation works on every account.

For developers

account.account.reconcile keeps its technical name; only its label and help text changed (string 'Payment Reconciliation').

Upgrading from Odoo 19

No data migration needed. Custom code that blocked reconciliation on accounts without the flag should be reviewed.

Change 25 of 45

Multi-ledger consolidation

RefactoringCommunity

Journals are now included instead of excluded in multi-ledger consolidation.

Official Odoo 20 release note

In plain words

A multi-ledger (ledger group) now lists the journals it includes instead of the journals it excludes. Each journal points to its ledger group, so a report filtered on that ledger only uses those journals.

Accounting > Configuration > Multi-ledgerThe ledger group now lists its "Included Journals" (here Miscellaneous Operations).

Where to find it

  1. Accounting > Configuration > Multi-ledger.
  2. Create a ledger group and pick the journals it includes.

For users

Accounting > Configuration > Multi-ledger shows an "Included Journals" column.

For developers

account.journal.group.excluded_journal_ids (Many2many) and company_id are gone; included_journal_ids is a One2many on account.journal.journal_group_id. The name is now unique globally.

Upgrading from Odoo 19

Existing ledger groups must be converted from excluded to included journals; check custom report filters that read excluded_journal_ids.

Change 26 of 45

Multiple invoice details

EnhancementCommunity

When sending multiple invoices at once, the popup window identifies how each invoice will be sent.

Official Odoo 20 release note

In plain words

When several invoices are sent at once, the send dialog groups them by sending method (email, Peppol, and so on). Each group can be unfolded to see exactly which invoice goes to which customer.

Accounting > Customers > Invoices > SendThe summary is unfolded: three invoices will go by email, each listed with its customer.

Where to find it

  1. Accounting > Customers > Invoices.
  2. Select several posted invoices and click Send.
  3. Unfold a line of the summary.

For users

The batch Send dialog lists the invoices behind each "N invoice(s) by ..." line.

For developers

summary_data entries now carry a 'moves' list (id, name, partner_name) besides count and label.

Upgrading from Odoo 19

Overrides of _compute_summary_data must return the new 'moves' key.

Change 27 of 45

New currency: Caribbean Guilder

EnhancementCommunity

The Caribbean Guilder (XCG) has been added to the list of supported currencies and is set as the default currency for Curaçao and Sint-Maarten (available from 18.0).

Official Odoo 20 release note

In plain words

The Caribbean Guilder (XCG) is a supported currency and is the default currency of Curaçao and Sint Maarten. The same data is already present in the Odoo 19 source, in line with the "available from 18.0" note.

Contacts > Configuration > Countries > CuraçaoCuraçao now uses XCG (Caribbean Guilder) as its currency.

Where to find it

  1. Contacts > Configuration > Countries > Curaçao.

For users

Curaçao and Sint Maarten show XCG as their currency; XCG can be activated in the currency list.

For developers

New record base.XCG (inactive by default, symbol Cg).

Upgrading from Odoo 19

None; activate XCG if you invoice in it.

  • The XCG record and country mapping are also in the Odoo 19 source (backported).

Change 28 of 45

Onboarding improvements

EnhancementCommunity + Enterprise

Partly confirmed in the Odoo 20 source code. Parts of this note could not be traced.

The Accounting onboarding has been improved to ease e-invoicing setup and tax configuration.

Official Odoo 20 release note

In plain words

The accounting dashboard onboarding now covers periods and tax setup in one step: the "Set Periods" dialog has a "Not Subject to VAT" checkbox and the tax return periodicity. Companies not subject to VAT get no sales taxes and only non deductible purchase taxes.

Accounting > Dashboard > Set PeriodsThe onboarding periods dialog now starts with "Not Subject to VAT", followed by the fiscal year and tax periodicity.

Where to find it

  1. Accounting > Dashboard, Tax Returns card > Set Periods.

For users

The "Set Periods" onboarding step asks whether the company is subject to VAT.

For developers

New res.company.vat_disabled (stored, inverse switches sale taxes) and vat_disabled_available (EU and Switzerland).

Upgrading from Odoo 19

None for existing databases.

  • The e-invoicing part (Peppol registration changes in the same commit) is not shown: this demo company is in the United States, where Peppol and the VAT setting are not offered.

Change 29 of 45

Optimized data entry

EnhancementEnterprise only

Partly confirmed in the Odoo 20 source code. Parts of this note could not be traced.

Encoding is now faster thanks to quick reconciliation model shortcuts and statement transaction batching.

Official Odoo 20 release note

In plain words

In bank reconciliation the buttons of the selected transaction have keyboard shortcuts (hold Alt to see them), so reconciliation models and actions can be applied without the mouse. Transactions can also be entered one after another with "Add & New".

Accounting > Bank Matching (Alt held)With Alt held, the buttons of the selected transaction show their shortcuts (SHIFT+ENTER, SHIFT+3).

Where to find it

  1. Accounting > Dashboard > Bank > reconcile.
  2. Click a transaction and hold Alt.

For users

Bank Matching: Alt+Shift+1 to 8 trigger the reconcile buttons, Alt+Shift+Enter the main one.

For developers

ButtonList.registerHotkeys() adds useHotkey entries for each reconcile button.

Upgrading from Odoo 19

None.

  • The exact commit that added the Alt+Shift shortcuts could not be isolated from the commit subjects; the code is in button_list.js. "Statement transaction batching" is read as the "Add & New" quick create; this reading is not confirmed by a commit message.

Change 30 of 45

PAIN version setting

RefactoringEnterprise only

The PAIN version setting for outgoing payments has been moved from the journal level to the payment method level to offer more flexibility.

Official Odoo 20 release note

In plain words

The SEPA XML version (PAIN version) is now chosen per outgoing payment method line of a journal instead of once per journal. A bank journal can therefore use different versions for different methods.

Accounting > Configuration > Journals > Bank > Outgoing PaymentsThe XML Version column is set per payment method; the SEPA Credit Transfer line uses pain.001.001.09.

Where to find it

  1. Accounting > Configuration > Journals > Bank.
  2. Outgoing Payments tab, show the "XML Version" column.

For users

Journal > Outgoing Payments has an optional "XML Version" column on SEPA lines.

For developers

sepa_pain_version moved from account.journal to account.payment.method.line (computed from IBAN or company country, editable).

Upgrading from Odoo 19

Custom code reading journal.sepa_pain_version must read it from the payment method line.

  • A SEPA Credit Transfer line was added to the demo Bank journal for this shot.

Change 31 of 45

Parent accounts

RefactoringCommunity + Enterprise

Account groups have been replaced by parent accounts as the method of structuring charts of accounts. Account codes are now optional.

Official Odoo 20 release note

In plain words

The account.group model is gone. A chart of accounts is now structured by giving accounts a parent account, which builds a tree. Account codes are no longer mandatory: the US chart ships without codes.

Accounting > Configuration > Chart of Accounts > Fuel"Fuel" has no code and sits under the parent account "Automobile Expenses".

Where to find it

  1. Switch to a company using the US chart.
  2. Accounting > Configuration > Chart of Accounts > open an account.

For users

Account forms have a "Parent Account" field; the Account Groups menu is gone; accounts can have no code.

For developers

Odoo 19 had account.group and account.account.group_id (computed from code prefixes). Odoo 20 has account.account.parent_id, parent_path and parent_ids; account.group and its views and l10n CSV files are removed.

Upgrading from Odoo 19

Big one: custom code, reports or data using account.group or group_id must move to parent_id. Code that assumes every account has a code needs a fallback.

Change 32 of 45

Pay bills from Odoo

New featureEnterprise only

Pay bills (individually or in batches) with a single signature directly from Odoo via the new PISP (payment initiation service providers) interface.

Official Odoo 20 release note

In plain words

Vendor payments can be sent straight to the bank from Odoo with "Pay Now", one by one or in batches, and signed once. It uses the bank connection of Online Synchronization as a payment initiation service (PISP).

Accounting > Vendors > PaymentsWith a draft vendor payment selected, "Pay Now" sends it to the bank for signature.

Where to find it

  1. Accounting > Vendors > Payments.
  2. Select a draft payment.

For users

Vendor Payments and batch payments have "Pay Now" and "Sign Payment" buttons; the bank card shows payments to sign.

For developers

account_online_payment (auto install) adds action_pay, action_sign and payment_online_status on account.payment.

Upgrading from Odoo 19

Needs a supported bank connected through Online Synchronization.

  • The actual bank signature step needs a live bank connection and cannot be shown in this demo.

Change 33 of 45

Peppol global location identifiers

EnhancementCommunity

Add GLN (global location identifiers) to partners' delivery contacts for use with Peppol (available from 17.0).

Official Odoo 20 release note

In plain words

Delivery addresses have a GLN (Global Location Number) field on the Sales & Purchase tab, used in Peppol documents. The Odoo 19 bridge module account_add_gln is merged into Accounting.

Contacts > Azure Interior Warehouse > Sales & PurchaseThe GLN of the delivery address, shown only on delivery contacts.

Where to find it

  1. Contacts > a company > open a delivery address.
  2. Sales & Purchase tab.

For users

A delivery contact shows GLN under Sales & Purchase > Misc.

For developers

res.partner.global_location_number is computed from additional identifier 'EAN_GLN'; account_add_gln no longer exists.

Upgrading from Odoo 19

Databases with account_add_gln get the field from account.

  • A demo delivery contact was created for this shot.

Change 34 of 45

Prevent double payments in the payment wizard

EnhancementCommunity

To prevent double payments, the payment wizard now detects pending ("Paid") payments, automatically deducts them from the amount due, and sorts outstanding payments by date for a clearer timeline.

Official Odoo 20 release note

In plain words

When you register a payment, the wizard now sees payments already made but not yet matched with the bank (state "Paid"). It shows how much is already paid and lowers the proposed amount. The payments listed on an invoice are sorted by date.

Accounting > Vendors > Bills > PayThe wizard shows 400.00 already paid, so it proposes the remaining 600.00 instead of the full 1,000.00.

Where to find it

  1. Create a bill, register a partial payment.
  2. Click Pay again on the bill.

For users

Paying a bill again shows "X already paid" with a link to the payments, and the amount due minus that.

For developers

New unreconciled_paid_amount and actionable_errors on account.payment.register; the amount compute subtracts it. The invoice payments widget content is sorted by date.

Upgrading from Odoo 19

None.

  • A demo bill and a partial payment were created for this shot.

Change 35 of 45

Professional percentage for receipts

EnhancementCommunity

The "Professional" percentage column that was available for vendor bills is now also available for purchase receipts (available from 19.0).

Official Odoo 20 release note

In plain words

The "Professional" percentage column (how much of an expense is for business use) is also available on purchase receipts, not only on vendor bills. The Odoo 19 source already has it, as noted (from 19.0).

Accounting > Vendors > new Purchase ReceiptThe Professional column is available on a purchase receipt.

Where to find it

  1. Create a purchase receipt (Bill form, Receipt option).
  2. Show the "Professional" optional column.

For users

A purchase receipt can show the optional "Professional" column.

For developers

In Odoo 20 the field is deductible_percentage (percentage widget); Odoo 19 used deductible_amount labelled "Professional %".

Upgrading from Odoo 19

Code reading deductible_amount must switch to deductible_percentage.

Change 36 of 45

Purchase order matching

EnhancementCommunity

Vendor bill and purchase order matching has been improved, including the "Auto-Complete" option checking for matching bill lines before creating new ones; a clear summary of what has been matched and a warning if the price and quantity are different than expected; and the possibility to unmatch a vendor bill and purchase order.

Official Odoo 20 release note

In plain words

Bill to purchase order matching is clearer. Auto-Complete first matches existing bill lines to PO lines before adding new ones and tells you how many were matched. Each matched line shows a warning when price or quantity differ from the PO, and lines can be unmatched.

Accounting > Vendors > Bills > draft billEach line shows its PO: the first flags a higher price than the PO ($10.00), the second a quantity above the ordered 1.0 unit.

Where to find it

  1. Create a bill for a vendor with a confirmed PO.
  2. Show the "Purchase Order" optional column on the lines.

For users

The Purchase Order column of a bill line shows arrows for price differences and a warning for quantity differences; a notification reports matched and unmatched lines; the matching list has an "Unmatch" action.

For developers

New purchase_matching_issue_msg on account.move.line, new purchase_line_match_field widget and action_unmatch_lines on purchase.bill.line.match.

Upgrading from Odoo 19

None.

  • A demo draft bill was created against P00019. The column is narrow, so the warning text is cut on screen.

Change 37 of 45

Reconciliation with multiple accounts

EnhancementEnterprise only

Split a bank transaction's amount across multiple accounts more easily during bank reconciliation.

Official Odoo 20 release note

In plain words

In bank reconciliation, "Set Account" opens a list where you can tick several accounts and type an amount for each, so one bank transaction is split across multiple accounts in one go.

Accounting > Bank Matching > Set AccountThe 800.00 rent payment is split: 500.00 to Rent and 300.00 to Bank Fees; the balance left is 0.00.

Where to find it

  1. Accounting > Dashboard > Bank > reconcile.
  2. Click Set Account on a transaction, tick accounts and type amounts.

For users

Set Account dialog has an editable Amount column and the balance left to allocate.

For developers

New transient model account.select.account.line and set_multiple_account_bank_statement_line.

Upgrading from Odoo 19

None.

  • The dialog was closed without validating, so the demo transaction stays unreconciled.

Change 38 of 45

Reminder workflow

EnhancementEnterprise only

Partly confirmed in the Odoo 20 source code. Parts of this note could not be traced.

The workflow for both automatic and manual reminders has been simplified and improved.

Official Odoo 20 release note

In plain words

Payment reminders were reworked. Reminders now work per invoice: invoices have a "Send Reminder" button and a "Last Reminder" date, and reminder levels can be set before or after the due date.

Accounting > Customers > Invoices"Send Reminder" sends a manual reminder for the selected invoices; the Last Reminder column tracks it.

Where to find it

  1. Accounting > Customers > Invoices.
  2. Select an unpaid invoice.

For users

Customer invoices list: select invoices and click "Send Reminder"; Configuration > Invoice Reminders has before or after timing.

For developers

account.move gets last_reminder and manual_reminder_action; followup lines get reminder_timing.

Upgrading from Odoo 19

Review custom follow-up code; the flow moved from partner level towards invoice level.

  • Odoo 19 Enterprise source is not available, so which reminder parts are new could only be judged from the commit subjects.

Change 39 of 45

Reset to Draft action in list views

New featureCommunity

In any list view, reset entries to draft in batch using the new "Reset to Draft" action.

Official Odoo 20 release note

In plain words

Journal entries, invoices and bills can be reset to draft in batch from any list view with the new "Reset to Draft" action.

Accounting > Customers > Invoices > ActionsReset to Draft in the Actions menu for the three selected invoices.

Where to find it

  1. Accounting > Customers > Invoices.
  2. Select posted invoices, open Actions.

For users

Actions menu of move lists has "Reset to Draft".

For developers

New server action bound to account.move list views calling button_draft on the selection.

Upgrading from Odoo 19

None.

Change 40 of 45

Run Auto Reconciliation

New featureEnterprise only

Manually retrigger the automatic bank reconciliation with the "Run Auto Reconciliation" option.

Official Odoo 20 release note

In plain words

The bank reconciliation screen has a "Run Auto Reconciliation" entry in its gear menu. It runs the automatic matching again on demand.

Accounting > Bank Matching > gear menu"Run Auto Reconciliation" retriggers the automatic matching.

Where to find it

  1. Accounting > Dashboard > Bank > reconcile.
  2. Open the gear menu next to the title.

For users

Bank Matching gear menu: Run Auto Reconciliation.

For developers

New cog menu item and bank_rec_auto_reconcile_wizard.

Upgrading from Odoo 19

None.

Change 41 of 45

Simplification of asset models

RefactoringEnterprise only

Asset models have been replaced by depreciation models, focusing specifically on the calculation logic of fixed assets. Furthermore, asset-related configurations and tracking have been consolidated: essential information and automated behaviors are located on asset accounts themselves.

Official Odoo 20 release note

In plain words

Asset models are replaced by depreciation models, which only hold the calculation (method, duration, rate). The accounts and the default depreciation model now live on the fixed asset account itself.

Accounting > Configuration > Chart of Accounts > Fixed AssetsThe asset settings are now on the account: depreciation model "2 Years" plus the depreciation and expense accounts.

Where to find it

  1. Accounting > Configuration > Chart of Accounts.
  2. Open a Fixed Assets account.

For users

A Fixed Assets account shows a Depreciation section: depreciation model, accumulated depreciation account, expense account.

For developers

New model account.depreciation.model; account.account gets depreciation_model_id, asset_depreciation_account_id, asset_expense_account_id. Odoo 19 chart data shipped asset models as account.asset rows with accounts (e.g. l10n_be account.asset-be.csv); Odoo 20 ships account.depreciation.model rows with only method and duration.

Upgrading from Odoo 19

Asset models must be migrated: accounts move to the asset accounts, calculation to depreciation models. Custom code using asset model records needs rework.

  • Odoo 19 Enterprise source is not available; the old structure is confirmed from Odoo 19 Community chart data (account.asset CSV files).

Change 42 of 45

Split items on invoices

New featureEnterprise only

Open an invoice's journal items from the smart button and select one or more lines to split. This improves handling of multiple quantities and asset creation, as well as splitting an amount across different accounts.

Official Odoo 20 release note

In plain words

From an invoice or bill, open Journal Items with the smart button, select lines and click "Split". You can split a line by quantity (for example to create one asset per unit) or move part of the amount to another account.

Invoice > Journal ItemsWith a journal item selected, the new Split button opens the split wizard.

Where to find it

  1. Open a posted invoice, click the Journal Items smart button.
  2. Select a line and click Split.

For users

Journal Items list header has a Split button that opens a wizard with Quantity, Amount and Account.

For developers

New account.split.journal.item.wizard and action_split_lines on account.move.line.

Upgrading from Odoo 19

None.

Change 43 of 45

Taxes in fiscal positions

EnhancementCommunity

Taxes are only allowed in their respective fiscal positions, meaning that if a default tax on a product or account does not belong to the fiscal position set on an invoice, the tax is removed, even if there is no replacement.

Official Odoo 20 release note

In plain words

A tax that is linked to fiscal positions can only be used within them. If the default tax of a product or account does not belong to the invoice's fiscal position, it is removed, even when the fiscal position has no replacement.

Accounting > Configuration > Taxes > 15%This tax belongs to the Domestic fiscal position, so it is dropped on invoices using another fiscal position.

Where to find it

  1. Accounting > Configuration > Taxes > open a tax.

For users

Taxes show a Fiscal Position field; invoices drop taxes that do not fit their fiscal position.

For developers

account.fiscal.position.map_tax keeps an unmapped tax only if it has no fiscal positions or includes the current one; Odoo 19 kept it unless mapped.

Upgrading from Odoo 19

Check invoices after upgrade: taxes restricted to other fiscal positions will disappear from lines.

Change 44 of 45

Valuation without Inventory

RefactoringCommunity

It is now possible to manage product stock on hand and accounting valuation without the Inventory app.

Official Odoo 20 release note

In plain words

Stock valuation basics moved into the core apps: "Track Inventory" and on hand quantity are in Product, and valuation method, costing and the Inventory Valuation report are in Accounting. So stock on hand and its accounting value can be managed without the Inventory app.

Invoicing > Configuration > Product Categories > (category) > AccountingThe Furniture category's Accounting tab sets Inventory Valuation and Costing Method directly, with no Inventory app installed.

Where to find it

  1. On a database without Inventory, go to Invoicing > Configuration > Product Categories.
  2. Open a category and its Accounting tab has the valuation and costing fields.

For users

Accounting has an Inventory Valuation report; storable products and costs work with Accounting only.

For developers

is_storable and qty_available moved from stock to product; property_valuation, property_cost_method, valuation and the valuation report moved from stock_account to account.

Upgrading from Odoo 19

Custom modules that depend on stock or stock_account only for these fields can drop that dependency; check field overrides in stock_account.

Change 45 of 45

Withholding tax on payment improvements

EnhancementCommunity

On bills that involve a withholding tax, the due amount is broken down to show the "Amount Due," "Withhold Due," and "Net Due." Additionally, a radio button in the payment wizard allows you to pay only the withholding amount, only the payment amount, or the total amount.

Official Odoo 20 release note

In plain words

Bills with a withholding tax show the due amount in three parts: Amount Due, Withhold Due and Net Due. In the payment wizard you choose to pay the withholding only, the payment only, or both.

Accounting > Vendors > BillsA 1,000 bill with a 10% withholding tax: Amount Due 1,000, Withhold Due 100 and Net Due 900 under the totals.

Where to find it

  1. Apps: install Withholding Tax on Payment (l10n_account_withholding_tax); it is included in the localizations that use it.
  2. Accounting > Configuration > Taxes: create a purchase tax of -10% with Withhold ticked.
  3. Create a vendor bill for 1,000 with that tax and confirm it. The totals show Amount Due, Withhold Due and Net Due.
  4. Click Pay to choose between paying the withholding, the payment, or both.

For users

Bill totals show Withhold Due and Net Due; the payment wizard has Withhold and Pay, Withhold Only or Payment Only.

For developers

New withholding_residual_amount_currency and withholding_net_residual_amount_currency on account.move; new withhold selection on account.payment.register.

Upgrading from Odoo 19

None.

  • Only the bill breakdown is shown. The Pay wizard then offers the withholding choice as radio buttons (field withhold on account.payment.register).

See all 585 Odoo 20 changes across 52 apps

Odoo 20 Accounting: common questions

What is new in Odoo 20 Accounting?

The official Odoo 20 release notes list 45 Accounting changes (9 new features, 29 enhancements, 5 refactorings, 1 removal, 1 security). They include Accounting Firms mode settings, Analytic distribution for write-offs, Annual report layout, Asset depreciation and more.

Are the Odoo 20 Accounting changes available in Community edition?

28 of the 45 changes are in Odoo 20 Community (and Enterprise). 17 are Enterprise only. Each change on this page is labeled with its edition.

Do Odoo 20 Accounting changes affect my customizations when upgrading from Odoo 19?

30 of the 45 changes have something to check when upgrading from Odoo 19, for example Accounting Firms mode settings, Annual report layout, Asset depreciation. Each change on this page has an "Upgrading from Odoo 19" note. Test custom modules on a copy of your database before moving production.

How do I upgrade Accounting to Odoo 20?

Restore a copy of your database, run the Odoo 20 upgrade on the copy, fix any custom modules that extend Accounting, then test your main Accounting flows with real users before switching production. iVentureTeam runs Odoo upgrades end to end, including custom module migration and user testing.

Odoo services for this

By industry

More Odoo 20 release notes

Planning your Odoo 20 move

Want these Accounting changes in your database?

We upgrade Odoo databases with their customizations and data intact, and test every custom module against the new version before go-live.