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.
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.
- Confirm the main currency in Settings, Currencies. Changing it later is a project, not a setting.
- Activate foreign currencies under Configuration, Currencies by toggling Active.
- 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.
- Set the exchange difference accounts in Settings, Default Accounts: the Journal plus the Gain and Loss accounts.
- 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.
- 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 list | Country | Notes |
|---|---|---|
| European Central Bank | Default for every company | Euro reference rates |
| [MX] Bank of Mexico | Mexico | Only USD, EUR, GBP, JPY and CNY update daily |
| SUNAT | Peru | Rate used on Peruvian e-invoices |
| [CO] Bank of the Republic | Colombia | Official TRM rate |
| mindicador.cl | Chile | Chilean indicator service |
| Federal Tax Administration | Switzerland | Swiss official rates |
| Central Bank of the UAE | United Arab Emirates | Ships with the UAE localization |
| [SA] Saudi Central Bank (SAMA) | Saudi Arabia | New in Odoo 20 |
| Azerbaijan, Georgia, Kazakhstan, Uzbekistan central banks | Those countries | Listed 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?

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.
| Aspect | Realized gain or loss | Unrealized gain or loss |
|---|---|---|
| Trigger | Payment or credit note reconciled with an invoice | Month-end or year-end revaluation run |
| Where it happens | Automatically at reconciliation | Accounting, Review, Unrealized Currencies |
| Accounts | Default Gain and Loss accounts in Settings | Income and Expense accounts chosen in the wizard |
| Journal | Exchange Difference journal | Journal chosen in the wizard |
| Reversal | None, the difference is final | Automatic on the Reversal Date |
| Typical use | Every foreign-currency payment | Open 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.
| Date | Entry | Debit (USD) | Credit (USD) | Amount in currency |
|---|---|---|---|---|
| 1 Oct | Accounts receivable | 11,000 | EUR 10,000 | |
| 1 Oct | Revenue | 11,000 | EUR 10,000 | |
| 28 Oct | EUR bank account | 10,800 | EUR 10,000 | |
| 28 Oct | Accounts receivable | 10,800 | EUR 10,000 | |
| 28 Oct | Exchange loss (automatic) | 200 | ||
| 28 Oct | Accounts 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.
- Open Accounting, Review, Unrealized Currencies and set the Date to the period end.
- Click Exchange Rates to override a rate for the report only. A yellow banner lets you Reset to Odoo's Rate.
- Check the Adjustment column per account and currency.
- Click Adjustment Entry, choose the Journal, Expense Account and Income Account, and set the Reversal Date.
- 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.
| Change | Edition | What it means for finance teams |
|---|---|---|
| Rate shown in the Pay dialog | Community and Enterprise | No guessing which rate a foreign payment used |
| Exchange entries as one line per invoice | Community and Enterprise | Easier reading after payment, detail one click away |
| New rate providers (SAMA plus four central banks) | Enterprise | Official rates for Saudi Arabia and Central Asia |
| Cumulative Translation Adjustment line | Enterprise | Consolidated multi-currency balance sheets balance, with an auditable figure |
| Caribbean Guilder (XCG) | Both | Default 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.
| Industry | Pain or cost driver | Odoo approach | How iVentureTeam helps |
|---|---|---|---|
| Import and export trading | USD supplier bills, local-currency sales, bank spreads | Journal per currency, daily rates, landed costs | Design journals and rate policy |
| Professional services | Clients billed in several currencies, long terms | Invoice-date rates, monthly revaluation | Set up the revaluation routine |
| eCommerce and retail | Multi-currency webshop, payouts net of fees | Pricelists per currency, payout splits | Map payout files to bank journals |
| Non-profits and NGOs | Grants in donor currency, spend in local currency | Bank journal per currency, revaluation per fund | Build donor and consolidated reports |
| Groups with several entities | Entities in different currencies | Multi-company, intercompany rules, CTA line | Configure 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

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?

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.
Free Odoo tools
All tools- Odoo Health CheckVersion, modules, findings and upgrade cost
- Odoo App SelectorWhich apps you need, by industry
- Odoo Project EstimateIndicative cost and timeline in minutes
- Odoo Implementation Cost CalculatorImplementation cost and timeline, in minutes
- Odoo Migration Cost CalculatorVersion jump or legacy ERP, priced in minutes
Continue reading
Odoo COGS Explained: How Cost of Goods Sold Is Calculated and Posted
Odoo COGS explained for Odoo 19 and 20: Anglo-Saxon vs Continental timing, FIFO, AVCO and standard cost, journal entries, closing entries and reports.
Odoo Saudi Bank Integration: Statement Sync, Reconciliation, SADAD
Odoo Saudi bank integration explained: bank sync coverage, CAMT and Excel statement import, SAR auto-reconciliation, ISO 20022, WPS and SADAD in Odoo 19/20.
Odoo Manufacturing Cost Accounting: Work Order Costing and Overhead
How Odoo 19 and 20 cost a manufacturing order: work center rates, BOM cost roll-up, overhead absorption, WIP and production journal entries, and variance.
