Multi-currency accounting in Odoo works through a currency conversion layer that sits between transactions and journal entries. Understanding it correctly saves you from a class of revaluation errors and rounding discrepancies that accounting teams reliably surface during quarter close.
Enabling multi-currency#
Accounting → Configuration → Settings → Currencies: enable Multi-Currencies.
This activates the currency fields on sales orders, purchase orders, invoices, and payments. Your company currency is set in Accounting → Configuration → Settings → Company → Currency.
Exchange rate management#
Odoo stores exchange rates in Accounting → Configuration → Currencies → [Currency] → Rates.
Each rate has a date and a rate value (units of company currency per one unit of the foreign currency). Example: if your company currency is EUR and the USD rate is 1.08, one USD = 1.08 EUR (or if expressed as USD per EUR = 0.926).
Important: Odoo stores rates as the quantity of company currency per one foreign currency unit. Verify this matches your bank's rate direction before importing.
Automatic rate updates#
Odoo can fetch rates from provider services (ECB for EUR, other providers for USD-based companies). Configure in Accounting → Configuration → Settings → Currencies → Automatic Currency Rates.
- The default provider is the European Central Bank for EUR companies.
- Rates update via a scheduled action (
account.currency.rate.cron). - If the provider is unavailable, the last known rate is used - with no warning at posting time.
For critical rates (large volume in a single foreign currency), consider a manual rate management process: finance team sets the rate each morning, automated fetching disabled.
How rates apply to documents#
Sales orders and purchase orders: Use the rate active on the order's date. The rate is locked when the order is confirmed.
Invoices: Use the rate on the invoice date. If you invoice in USD and your company currency is EUR, the EUR amounts on the invoice (tax amounts, total) are calculated using the rate on the invoice date.
Payments: Use the rate on the payment date. This is where exchange gains and losses arise.
Exchange gain/loss example#
Invoice: $1,000 USD, invoice date rate = 1.10 EUR/USD → EUR amount = €1,100.
Payment 30 days later: rate = 1.05 EUR/USD → EUR received = €1,050.
Exchange loss: €50. Odoo posts this automatically to the exchange difference account configured in Accounting → Configuration → Settings → Exchange Gain/Loss Accounts.
Bank Account DR €1,050
Exchange Loss DR €50
Accounts Receivable CR €1,100The accounts for exchange gain/loss must exist in your chart of accounts. Odoo creates them if you use a pre-configured localization, but you must configure them manually for custom charts of accounts.
Currency rounding#
Each currency has a decimal precision setting (Accounting → Configuration → Currencies → [Currency] → Rounding). USD: 0.01, JPY: 1, Bitcoin: 0.00000001.
Odoo applies rounding at the line level and may generate a small rounding difference on the total vs. the sum of lines. This is normal and is posted to the currency rounding account automatically.
Common rounding pitfall: If your company currency and foreign currency both round to 0.01 but the exchange rate introduces sub-cent fractions, the sum of rounded lines may differ from the rounded total by €0.01. Odoo handles this with a balancing entry on the rounding account, but your accounting team may flag it as an unexplained penny. Document this behavior during go-live training.
Foreign currency accounts (bank accounts)#
For bank accounts held in a foreign currency (e.g., a USD account for a EUR company):
- Create the bank account journal in USD: Accounting → Configuration → Journals → [Bank] → Currency.
- Set the account currency: on the account record in the chart of accounts.
When you post a payment from this account, Odoo records:
- The foreign currency amount on the bank account.
- The company currency equivalent using the payment date rate.
The bank statement reconciliation then uses the statement's rate (or the rate you set during import) to match payments to invoices.
Invoicing customers in foreign currency#
On the customer invoice:
- Change the currency field to the customer's currency (e.g., USD).
- Enter line amounts in USD.
- Odoo converts to EUR at the invoice date rate for the balance sheet.
The invoice is denominated in USD for the customer; the accounting system stores EUR. Both amounts appear on the invoice PDF (depending on your invoice template configuration).
Supplier invoices in foreign currency#
Same mechanism in reverse. Enter the supplier invoice in their currency. Odoo converts to your company currency at the invoice date rate. When you pay, Odoo uses the payment date rate and posts the exchange difference.
Currency revaluation at period close#
At month end, open balances in foreign currency accounts need to be revalued to the current rate. Odoo provides an unrealized exchange gain/loss calculation:
Accounting → Accounting → Actions → Adjust Currency (or the localization-specific equivalent).
This process:
- Takes all open foreign-currency receivables and payables.
- Recalculates their EUR equivalent at the period-end rate.
- Posts an unrealized gain/loss entry (reversible at the start of next period).
The reversal is critical: without it, the gain/loss is recorded twice - once as unrealized and again when the payment settles.
Testing multi-currency setup#
- Create a test customer invoice in USD.
- Confirm it. Check the journal entry - the EUR amount should match USD × rate on invoice date.
- Post a payment with a different rate. Verify the exchange gain/loss entry appears.
- Reconcile the payment with the invoice. Verify the outstanding balance is zero.
Run this test before go-live on a real date range that includes a rate change. Surprises in multi-currency accounting always show up at payment time, not at invoicing time.

