Skip to main content
iVentureTeam
Finance

Odoo Multi Currency Accounting: Rates, FX Gains, Revaluation Guide

Odoo multi currency accounting in Odoo 19 and 20: rate providers, invoice and payment rates, realized and unrealized FX gains, revaluation and reconciliation.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 5, 202614 min read2 views
Odoo Multi Currency Accounting: Rates, FX Gains, Revaluation Guide cover

Most guides to Odoo multi currency stop at "activate the currency". The hard part comes later: a payment lands at a different rate, month-end needs a closing rate, and the auditor asks where the exchange loss came from. Our Odoo consulting services for finance teams start from those questions.

This guide is for CFOs, controllers and accountants on Odoo 19 or 20 with customers, suppliers or banks in more than one currency. New to the ledger itself? Read how Odoo accounting works from invoice to statements first.

What is Odoo multi currency accounting and how does it work?

Odoo multi currency accounting lets you invoice, pay and bank in foreign currencies while every report stays in one company currency. Each journal item carries two values: the debit or credit in company currency, and the amount in the transaction currency.

The Odoo multi-currency documentation describes three building blocks. Currencies are activated one by one. Rates are stored per currency, per day and per company. Exchange differences post to dedicated accounts in a dedicated journal.

A euro invoice in a US company is stored as EUR 10,000 and, at that day's rate, USD 11,000. When the euros arrive at a different rate, the USD side moves and Odoo books the gap.

How do you set up multi-currency in Odoo 19 and 20?

Setting up Odoo multi currency takes six configuration steps, and the exchange accounts must exist before the first foreign payment. Each step lives under Accounting, Configuration.

  1. Confirm the main currency in Settings, Currencies. Changing it later is a project, not a setting.
  2. Activate foreign currencies under Configuration, Currencies by toggling Active.
  3. Choose the rate source. Once a second currency is active, Automatic Currency Rates appears in Settings. Pick the Service and the Interval, or keep rates manual.
  4. Set the exchange difference accounts in Settings, Default Accounts: the Journal plus the Gain and Loss accounts.
  5. Decide journal currencies. A bank journal set to EUR only accepts EUR lines. Odoo recommends leaving the account's own Currency field blank for flexibility.
  6. Review account currencies. An account with a currency forces every move on it into that currency; an empty field accepts any active currency.

Step 4 is the one self-implemented systems miss most. Without it, the first foreign payment stops with an error about missing exchange accounts. Our Odoo 20 accounting upgrade checklist includes the same check for upgrades.

Which currency rate providers does Odoo support?

Odoo Enterprise fetches rates from the European Central Bank by default and from national central banks or tax authorities where a localization needs an official rate. The interval can be daily, weekly or monthly, with an Update now button for on-demand refreshes.

The foreign currency bank account documentation confirms the ECB default. The table lists providers named in the Odoo 19 localization guides and the Odoo 20 release notes.

Provider in the Service listCountryNotes
European Central BankDefault for every companyEuro reference rates
[MX] Bank of MexicoMexicoOnly USD, EUR, GBP, JPY and CNY update daily
SUNATPeruRate used on Peruvian e-invoices
[CO] Bank of the RepublicColombiaOfficial TRM rate
mindicador.clChileChilean indicator service
Federal Tax AdministrationSwitzerlandSwiss official rates
Central Bank of the UAEUnited Arab EmiratesShips with the UAE localization
[SA] Saudi Central Bank (SAMA)Saudi ArabiaNew in Odoo 20
Azerbaijan, Georgia, Kazakhstan, Uzbekistan central banksThose countriesListed in Odoo 20, available from 19.0

The provider matters for compliance. The Mexico localization guide says the CFDI XML must carry the Banxico rate, so the ECB default would produce invoices the tax authority rejects. The UAE localization ships its Central Bank connection for the same reason.

Automatic rates are an Enterprise feature. On Odoo Community you type rates on the currency form, import them, or add a community module. Weigh that against the other gaps in our Odoo Community vs Enterprise comparison.

Which exchange rate does Odoo use on an invoice, payment or bank line?

Odoo takes the rate on the invoice date for invoices and bills, the rate on the payment date for payments, and the amounts you enter for a bank transaction. Each can be adjusted, but only before posting.

  • Invoices and bills: the rate on a draft invoice is computed from the invoice date, or today if the date is blank. You can edit it while draft, and a refresh button resets it to the invoice-date rate.
  • Rate by date: Odoo 19 added a date picker beside the rate that fetches the rate for any date you choose. See our page on the account pick currency date widget.
  • Payments: the Register Payment wizard converts at the payment date. Odoo 20 prints the rate under the amount, for example 1 USD = 0.86 EUR.
  • Bank transactions: enter the company-currency amount, pick the Foreign Currency, and Odoo fills Amount in Currency. Reconciliation shows both.
  • Manual journal entries: set the currency and amount in currency per line; Odoo converts at the entry date.

A partner answer on the Odoo forum confirms that since Odoo 16 the invoice or bill date sets the conversion rate, and that exchange differences are booked even on partial payments.

Realized vs unrealized exchange gains and losses in Odoo: what is the difference?

Odoo multi currency accounting: Realized vs unrealized exchange differences

A realized difference is booked when money moves at a different rate; an unrealized difference restates open balances at the closing rate and is reversed afterward. Odoo handles the two in different places.

AspectRealized gain or lossUnrealized gain or loss
TriggerPayment or credit note reconciled with an invoiceMonth-end or year-end revaluation run
Where it happensAutomatically at reconciliationAccounting, Review, Unrealized Currencies
AccountsDefault Gain and Loss accounts in SettingsIncome and Expense accounts chosen in the wizard
JournalExchange Difference journalJournal chosen in the wizard
ReversalNone, the difference is finalAutomatic on the Reversal Date
Typical useEvery foreign-currency paymentOpen receivables, payables, foreign bank balances

The Odoo payments documentation states the realized side plainly: reconciling a bank transaction in a different currency creates a journal entry for the exchange gain or loss, and unreconciling creates the reversal. The unrealized side is a report with a posting button, covered below.

Worked example: a EUR invoice in a USD company (illustrative)

The illustrative figures below show which entries Odoo creates for one invoice, one payment and one month-end revaluation. The rates are invented for the example, not market data.

The company reports in USD and invoices EUR 10,000 on 1 October at 1 EUR = 1.10 USD. Odoo posts USD 11,000 and stores EUR 10,000 as the amount in currency on the receivable line.

DateEntryDebit (USD)Credit (USD)Amount in currency
1 OctAccounts receivable11,000EUR 10,000
1 OctRevenue11,000EUR 10,000
28 OctEUR bank account10,800EUR 10,000
28 OctAccounts receivable10,800EUR 10,000
28 OctExchange loss (automatic)200
28 OctAccounts receivable (automatic)200

On 28 October the customer pays EUR 10,000 at 1 EUR = 1.08 USD, worth USD 10,800. After reconciliation the euro balance is zero but the receivable still shows USD 200 in company currency.

Odoo closes that gap itself: USD 200 to the Loss account in the Exchange Difference journal, clearing the receivable. In Odoo 20 this appears as one Exchange Loss line under the invoice's payments, with an info icon that opens the entries behind it.

Now suppose a vendor bill for EUR 5,000 booked at 1.10 (USD 5,500) is still open on 31 October and the closing rate is 1.12. The Unrealized Currencies report proposes a USD 100 adjustment on the payable. The EUR 10,000 in the bank is now worth USD 11,200, a USD 400 unrealized gain.

Post the adjustment dated 31 October with a reversal date of 1 November. October's balance sheet carries the restated values, November starts with the originals, and the next close recalculates from the new rate.

How does Odoo currency revaluation work at period end?

Odoo currency revaluation runs from the Unrealized Currencies report, which lists every open foreign-currency balance, the rate used and the adjustment needed to reach the closing rate. You review, post one entry, and Odoo schedules the reversal.

  1. Open Accounting, Review, Unrealized Currencies and set the Date to the period end.
  2. Click Exchange Rates to override a rate for the report only. A yellow banner lets you Reset to Odoo's Rate.
  3. Check the Adjustment column per account and currency.
  4. Click Adjustment Entry, choose the Journal, Expense Account and Income Account, and set the Reversal Date.
  5. Post. The Adjustment column should now read 0.00.

The reversal confuses first-time users. A controller asked on the Odoo forum why Odoo reverses FX gains and losses on the first day of the next month and whether that fits IAS 21. The accepted answer: the reversal prevents double counting and is compliant if revaluation runs at each closing.

Bank balances follow the same logic. Until the euros are converted, their USD value is uncertain, so the adjustment shows the closing-rate value and the reversal keeps the original cost in the ledger.

How do you reconcile a foreign currency bank account in Odoo?

A foreign currency bank account in Odoo needs its own bank journal set to that currency, and every transaction on it carries both the bank currency and the company currency amount. Reconciliation matches on the bank currency.

Create the journal under Configuration, Journals, set its Currency, and let Odoo create the default account. When a EUR statement line is matched to a EUR invoice, the euro amounts match exactly. Any company-currency gap becomes an automatic exchange entry, posted together with the reconciliation.

Two situations need care:

  • Transfers between currency accounts: your bank converts at its own rate, not the ECB rate. One Odoo Online user found the internal transfer could not take the bank's rate. Post the transfer from the statement line and let the difference go to the exchange account.
  • Fees deducted abroad: EUR 9,975 received against a EUR 10,000 invoice is a partial payment plus a fee, not an exchange difference. Odoo 20 splits one transaction across several accounts in the Set Account dialog.
  • ep one bank journal per currency. Mixing currencies in one journal produces balances that never close and exchange entries nobody can explain to the auditor.

What changed for multi-currency in Odoo 20?

Odoo 20 keeps the accounting model but makes rates visible where users work and adds reporting for groups with several currencies. Our Odoo 20 accounting release notes list five relevant items.

ChangeEditionWhat it means for finance teams
Rate shown in the Pay dialogCommunity and EnterpriseNo guessing which rate a foreign payment used
Exchange entries as one line per invoiceCommunity and EnterpriseEasier reading after payment, detail one click away
New rate providers (SAMA plus four central banks)EnterpriseOfficial rates for Saudi Arabia and Central Asia
Cumulative Translation Adjustment lineEnterpriseConsolidated multi-currency balance sheets balance, with an auditable figure
Caribbean Guilder (XCG)BothDefault currency for Curaçao and Sint Maarten

The CTA line sits under Other Comprehensive Income in the balance sheet, trial balance and general ledger. When companies with different currencies report together, it absorbs the gap created by historical, closing and average rates on different account types.

For groups with several legal entities, this pairs with the consolidation options in our Odoo multi-company setup guide.

Common Odoo multi-currency mistakes and how to avoid them

Most Odoo multi currency problems come from missing configuration or an unreviewed rate, not from the software. These are the ones we see most often during health checks.

  • No gain and loss accounts: the first foreign payment fails or lands in the wrong account. Set them on day one.
  • Rates left on Manually: a rate typed in January is still used in June. Set a Daily or Weekly interval.
  • Wrong rate direction: a rate entered as EUR per USD when the column expects USD per EUR inflates every invoice.
  • Revaluation never run: foreign receivables sit at historical cost all year. Add the Unrealized Currencies run to the close checklist.
  • Tax authority rates ignored: Mexico, Peru and others require a specific source. Pick the local provider before the first invoice.

Not sure which apply to your database? The free Odoo health check reviews version, modules and configuration findings, including accounting defaults.

Odoo multi-currency accounting by industry

The currency problem looks different in each sector, so the Odoo setup should too. The table shows where the pain usually sits and what we configure first.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
Import and export tradingUSD supplier bills, local-currency sales, bank spreadsJournal per currency, daily rates, landed costsDesign journals and rate policy
Professional servicesClients billed in several currencies, long termsInvoice-date rates, monthly revaluationSet up the revaluation routine
eCommerce and retailMulti-currency webshop, payouts net of feesPricelists per currency, payout splitsMap payout files to bank journals
Non-profits and NGOsGrants in donor currency, spend in local currencyBank journal per currency, revaluation per fundBuild donor and consolidated reports
Groups with several entitiesEntities in different currenciesMulti-company, intercompany rules, CTA lineConfigure consolidation and close calendar

Regional tax rules add a layer. Our guides to Odoo accounting for CFOs in the GCC and Odoo for Canadian GST, HST and PST cover how currency meets VAT and sales tax reporting.

How iVentureTeam helps with Odoo multi currency accounting

Running multi currency? Check your setup first

iVentureTeam sets up, audits and repairs Odoo multi currency accounting for finance teams that cannot afford unexplained exchange entries. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.

  • Configuration: currencies, rate service and interval, exchange accounts, journals per currency and account restrictions, documented for your auditors.
  • Close routine: a month-end checklist with the Unrealized Currencies run, reversal dates and a review of exchange entries, delivered through our Odoo implementation services.
  • Repair work: untangling databases where rates were typed backwards, revaluations were never reversed, or gains and losses hit the wrong account.
  • Localization fit: matching the rate provider and invoice format to the tax authority in Mexico, the UAE, Saudi Arabia, India and other markets.
  • Training: hands-on sessions for AR, AP and treasury staff so the people reconciling the bank understand what the exchange entry means.

Multi currency accounting case study: SRMD Global

A global education non-profit consolidated 14 country entities and 7 live currencies onto one ERP with iVentureTeam, making consolidated reporting 78% faster. The platform was ERPNext rather than Odoo, but the currency design decisions are the same ones we make on Odoo projects.

Before the project, each country entity ran its own accounting stack, including QuickBooks in the US, Xero in the UK and Tally in India, and annual consolidation took 11 weeks.

We built a multi-currency consolidation engine with a daily FX rate auto-pull, a fund accounting module for restricted and unrestricted donor funds, and an auditor-validated reconciliation report for each entity at cutover.

Consolidated quarterly reporting now takes 6 working days instead of 11 weeks, with live visibility across 14 entities, 7 currencies and 6 audit jurisdictions. Read the SRMD multi-entity, multi-currency ERP case study for the full build.

The bottom line on Odoo multi currency accounting

Odoo handles multi currency accounting well when three things are set before the first foreign transaction: the rate source, the exchange gain and loss accounts, and a bank journal per currency. After that, realized differences post themselves and revaluation is a monthly report with one button.

The remaining risk is process: rates never updated, revaluations never run or never reversed. Put both on the close calendar.

Ready to get your Odoo exchange entries under control?

Request a currency review

Talk to a consultant who has configured multi currency accounting across several tax regimes. Request an Odoo multi-currency configuration review, call +91-90235-15208, or email business@iventureteam.com.

Frequently Asked Questions

Does Odoo support multi currency accounting?

+

Yes. Odoo lets you invoice, receive bills, register payments and hold bank accounts in currencies other than your company currency. Every journal item stores the company currency value and the amount in the transaction currency, and reports stay in the company currency.

How does Odoo update exchange rates automatically?

+

In Odoo Enterprise, Accounting Settings has an Automatic Currency Rates section where you choose a Service and an Interval of daily, weekly or monthly. The default service is the European Central Bank; national banks are available for countries such as Mexico, Peru, the UAE and Saudi Arabia.

Which exchange rate does Odoo use on an invoice?

+

Odoo uses the rate stored for the invoice date, or today's rate if the date is blank. On a draft invoice you can edit the rate directly or, from Odoo 19, pick another date and let Odoo fetch that day's rate. Once posted, the rate is fixed.

How does Odoo record exchange rate gains and losses?

+

When a payment or credit note is reconciled with an invoice at a different rate, Odoo posts the difference automatically to the Gain or Loss account set under Default Accounts, in the Exchange Difference journal. Unreconciling creates the reversal.

What is the Unrealized Currencies report in Odoo?

+

It is the revaluation tool under Accounting, Review. It lists open foreign-currency balances, the rate used and the adjustment to reach the closing rate. The Adjustment Entry button posts the unrealized gain or loss and schedules an automatic reversal on the date you choose.

Why does Odoo reverse the unrealized gain and loss entry?

+

Because the gain or loss is not yet realized. The adjustment restates balances at the closing rate for the reporting date, and the reversal on the next day prevents double counting when the next revaluation runs. The realized result is booked when the money actually moves.

Can I use a manual exchange rate on a payment in Odoo?

+

The Register Payment wizard converts at the payment date, and Odoo 20 displays the rate it will use. For a bank transfer at your bank's own rate, reconcile from the bank statement line so the difference posts to the exchange account rather than forcing a manual rate.

Is automatic currency rate update available in Odoo Community?

+

No. The rate services are part of Odoo Enterprise. On Community you enter rates on the currency form, import them, or install a community module that fetches them. The exchange gain and loss posting itself works in both editions.

What changed for multi-currency in Odoo 20?

+

The Pay dialog shows the conversion rate, exchange gains and losses appear as one line per invoice, five central bank rate providers were added, and a Cumulative Translation Adjustment line was added to the balance sheet for groups reporting in several currencies.

Free written answer from a certified consultant

Getting Odoo Accounting set up right?

We map your accounting, tax and reporting in Odoo and show what to set up first, and what to watch.

Free, with no obligation. A senior consultant replies within 12 business hours.