Quoted at one rate, invoiced at another, paid at a third.
If your company sells in dollars, buys in yuan and reports in baht, you already know the pattern: every number is right in its own currency and wrong in every other. The margin you approved is not the margin that lands, and month-end reconciliation turns into detective work. None of this means your team is careless — it means the rate moved between systems that each froze it at a different moment.
—— Sound familiar?
You know this problem by these symptoms.
The margin you approved on the quote is never the margin the finished order reports, and nobody can say exactly where the points went.
Finance keeps a master spreadsheet of exchange rates because the CRM, the accounting system and the bank each have their own idea of today's rate.
A dollar payment lands a few hundred baht away from the invoice it pays, and the difference sits in a suspense account that grows every month.
Month-end revaluation of foreign receivables and bank balances is a manual ritual that only one person in the company knows how to run.
Sales can quote in the customer's currency, but converting the pipeline into company currency takes an afternoon and is stale by the next morning.
This happens because each tool freezes a moving number at a different moment. The CRM captures a rate when the quote is made, the accounting system applies another when the invoice posts, and the bank settles at a third — none of them wrong, none of them matching. These tools were adopted one at a time, each for good reasons, and were never built to share a single rate table. Reconciliation logic designed for one currency then treats every exchange difference as an error to investigate instead of an entry to post.
—— The way out
How Odoo closes this gap.
One rate table for every document
Odoo keeps a single currency rate table that Sales, Purchase and Accounting all read from, updated automatically every day from a provider such as the European Central Bank. A quote, its invoice and its journal entry stop disagreeing about what a dollar was worth. Where a contract fixes a rate, you set it on that document and the system respects it.
Exchange differences posted, not investigated
When you reconcile a foreign-currency payment against its invoice, Odoo computes the realised gain or loss and posts it to the exchange difference journal automatically. The payment matches, the invoice closes, and the difference lands in the right account with a full audit trail — not in a suspense account waiting for month-end archaeology.
Month-end revaluation built into the close
Odoo Enterprise accounting includes an unrealised currency gains and losses report that revalues open receivables, payables and foreign-currency bank balances at the closing rate, then posts the adjustment entry for you with the reversal ready for the next period. The ritual one person carried in their head becomes a report anyone on the team can run.
Their currency on the document, yours on the report
Pricelists let sales quote in each customer's currency, vendor bills post in the supplier's currency, and each bank journal can hold its own currency. Underneath, every line also carries its company-currency value, so margins, aged receivables and the P&L read in one currency without anyone maintaining a conversion spreadsheet.
—— How we run it
The transition, managed properly.
Configured against your own ledger
We take real transactions from your current books — quotes, invoices, payments, the awkward ones included — and rebuild them in Odoo to prove the postings match what your accountant expects. Configuration is signed off against your numbers, not a demo dataset.
One parallel month-end before go-live
You close at least one month in the old system and in Odoo side by side, and we walk through every FX posting that differs until each one is explained. The old system stays authoritative until you sign the comparison off.
Open items moved at their historical rates
Open invoices and unreconciled payments migrate in validated batches, each carried at the rate from your books so ageing and balances still tie to your trial balance. The finance team trains on these live items — their real reconciliations, not sample data.
—— FAQ
Questions teams ask about this problem.
How long does it take to get multi-currency running properly?
For a single entity whose pain sits mainly in sales documents and accounting, plan for a few weeks of configuration plus one parallel month-end close — the close is the real test, so the calendar depends on where your month-end falls. Multiple entities or a consolidation add time, because each company's rate handling is validated separately.
Can we keep our current system running during the switch?
Yes — that is the plan, not a concession. Your current system remains the system of record through the parallel close, and we only cut over after you have signed off that Odoo's postings match. Nothing gets switched off on faith.
Our historical rates are a mess. Will that break the migration?
No. Open items move at the rates already in your books, whatever they are, so balances still tie to your trial balance on day one. Closed history can stay in the old system as reference — you do not need to clean years of rates to start clean going forward.
What does this cost, and what is licence versus services?
Services are a fixed written scope per phase, agreed before the phase starts. On licences: Odoo Community is free, but the accounting features this page describes — including the revaluation report — sit in Odoo Enterprise, which Odoo bills you directly and we never mark up.
Let's find out whether Odoo actually fits your business.
A short call, an honest answer. If it isn't the right system for you, we'll say so.