In short: Connecting Exact Online and Odoo is not hard. Keeping the two in step every day is where the work is. In this article we share seven lessons from a live integration that brings sales invoices, vendor bills and other journal entries from Exact Online into Odoo: what went wrong, why, and what we changed in the integration. At the end you will find a checklist you can use before you start.
Our partner Connecta wrote a good overview of how to connect Odoo and Exact Online and what to check before you choose a connector. We wrote earlier about why companies deliberately run Odoo next to Exact Online. This article goes one step further: what happens once the integration is live and real bookkeeping runs through it every day.
The examples come from our own helpdesk. We describe them without customer names, but with the real causes and solutions.
What is Exact Online, and why connect it to Odoo?
Exact Online is a cloud accounting package that is widely used in the Netherlands and Belgium, often because the accountant works with it. Odoo is an ERP system: sales, purchasing, inventory, projects and accounting in one database. Many companies use both for a while, or permanently. Odoo runs the operational processes, Exact Online keeps the financial administration, or the other way round during a migration.
An integration makes sure both systems tell the same story. In the integration we discuss here, the direction is Exact Online to Odoo: sales invoices, vendor bills, payroll and memorial entries and the opening balance are read from Exact and booked in Odoo. A daily check compares the balances in both systems and reports any difference.
Lesson 1: an invoice without a linked relation is silently skipped
The first daily check reported a difference of a few thousand euros. Three vendor bills from Exact were missing in Odoo. The cause: the supplier on those bills was not yet in the link table between Exact relations and Odoo contacts. The integration skipped the bills, because it does not want to guess which Odoo contact is meant.
That is safe behaviour, but only if you notice it. We changed two things:
- A setting "Create missing suppliers" (and the same for customers). When it is on, the integration creates the relation from Exact in Odoo and books the invoice after all.
- A clear run report. The last run now lists which bookings were skipped and why, so nobody has to find out from a balance difference.
Tip: decide up front whether you want relations created automatically. If your Odoo contacts are well maintained, you may prefer to link them manually and accept that an invoice waits. If Exact is leading for relations, automatic creation saves a lot of work.
Lesson 2: decide who issues the invoice number
Sales invoices from Exact already have a number. Do you keep that number in Odoo, or does Odoo assign its own? At first the integration only offered an on/off switch to use the Exact number. That turned out to be too limited, so it became a choice list with several options, for example the Exact Online number or an external reference.
Why it matters: your customer received the invoice with a particular number. If Odoo shows a different number, every phone call about "invoice 2026-0412" becomes a search. And two overlapping number sequences in one journal is something you can no longer tidy up afterwards. Our rule: one system issues the numbers, the other copies them.
Lesson 3: general ledger mapping is right, until someone reclassifies in Exact
After a change to the integration, the accountant reported that some invoices in Odoo were on a different general ledger account than in Exact. We checked every line. The account per invoice line comes one to one from a mapping table between Exact accounts and Odoo accounts. In this case 72 accounts were mapped, covering every account used that year. All 639 vendor bills and all sales invoices of the run matched Exact exactly.
So where did the differences come from? From reclassifications in Exact after the import: amounts were moved from a trade goods account to a purchase account, and from there to another purchase account. The integration follows such changes at the next run, but between two runs the systems differ.
We also found a weak spot: the check "changed in Exact" only compared which accounts were on an invoice, not the amount per account. A reclassification within the same accounts could slip through. Lesson for every integration: reconcile on amounts, not only on account codes.
Lesson 4: small VAT differences are a choice, not an error
One bill had a few euros of VAT that the bookkeeper in Exact had booked as costs, because it could not be reclaimed. In Odoo the same amount ended up as input VAT. Both are defensible, but they are not the same. These cases cannot be solved by mapping alone. Agree with your accountant how you treat non-deductible VAT, and configure the tax in Odoo accordingly.
Lesson 5: choose which Exact journals you import
Besides invoices, Exact contains memorial entries, payroll entries, bank and cash journals and the opening balance. Initially the integration fetched the journals that one customer used. For a second customer that did not fit, so it became a setting:
- A list of Exact journal codes, separated by commas, for example
10, 20, 90. - Empty means: all journals.
- A minus sign excludes a journal, for example
-80means everything except journal 80.
Some rules we built in, because otherwise the totals no longer match:
- The opening balance always takes all journals.
- Sales invoices and vendor bills always run through the invoice import, not through "other entries", so they are never counted twice.
- Entries that were imported earlier from a journal you later exclude stay in Odoo. They are not reversed automatically.
- The run report shows per Exact journal whether it was fetched or skipped, and the balance check takes the skipped journals into account.
Lesson 6: check where payroll is actually booked before you build
A customer asked to import payroll journal entries from Exact. A reasonable question, and the integration could already do it: payroll entries come in with the other entries. When we looked at the data, Exact contained no payroll entries at all for that year. The payroll journal was empty and the salary cost accounts had no movements. Payroll taxes and pension were paid through the bank, but the payroll journal entry itself was booked somewhere else.
The lesson: first check the data, then build. Ask the accountant or payroll provider where the payroll journal entries go. If they do arrive in Exact, link the Exact payroll journal to a separate payroll journal in Odoo. Otherwise they end up in the fallback journal (usually miscellaneous operations), which makes them hard to find. If payroll comes from a payroll provider such as Nmbrs, a direct import into Odoo may be better. We wrote about that in booking Nmbrs payroll journal entries in Odoo automatically.
Lesson 7: one missing API permission can stop a flow for weeks
An integration with Exact Online uses an app registration in the Exact App Center. That registration has scopes: permissions per type of data. In one case the import of sales orders from Exact had failed for weeks with an authorisation error (HTTP 403), because the scope for sales orders was not enabled. Invoices kept coming in, so nobody noticed. The effect only showed later, when the customer asked why gross margin per order was not visible in Odoo.
What helps:
- Check all scopes you need when you register the app, not only the ones for the first flow.
- Let failed runs create an alert or activity for a named person.
- Look at the run history of every flow once a week, not only at the ones you work with.
Bonus: an integration of bookings does not give you margin per product
Exact Online delivers invoices as bookings: one line per general ledger account, usually with a description like "relation - number", not with products and quantities. If you import those into Odoo, you get correct accounting, but no margin per product or per order. Margin is then only visible at general ledger level: revenue accounts against cost of sales accounts. Do you want margin per order? Then the sales and purchase process has to run in Odoo itself, with products on the lines. We explain the options in our article on gross margin in Odoo.
Checklist before you connect Exact Online to Odoo
- Direction per data type. What goes from Exact to Odoo, what goes the other way, and what does not sync at all?
- Leading system for relations. Do you create missing customers and suppliers automatically, or link them manually?
- Invoice numbering. Which system issues the number, and which number does the customer see?
- Mapping tables. General ledger accounts, VAT codes, journals and payment terms. Go through them with your accountant.
- Journals. Which Exact journals come in, and to which Odoo journal does each one go?
- Reconciliation. A daily balance check on amounts, with a report of skipped bookings.
- Permissions. All scopes enabled in the Exact App Center, and alerts on failed runs.
- Ownership. One person who looks at the run report and acts on it.
Frequently asked questions
Can I import invoices from Exact Online into Odoo?
Yes. With the Exact Online integration from Connecta, sales invoices, vendor bills, other journal entries and the opening balance can be imported from Exact into Odoo, with a daily balance check.
What happens to an invoice whose customer or supplier is not in Odoo yet?
By default the invoice is skipped and reported in the run report. With the setting "Create missing customers/suppliers" on, the relation is created from Exact and the invoice is booked.
Can I choose which Exact journals are imported?
Yes. You list the journal codes to fetch, leave the field empty for all journals, or exclude a journal with a minus sign. The opening balance always includes all journals.
Why do I not see margin per product after importing from Exact?
Exact delivers invoices as bookings per general ledger account, without products. Margin per product or order requires the sales and purchase process to run in Odoo with products on the lines.
Finally
An integration between Exact Online and Odoo is not a project you finish and forget. It is a process with choices, checks and someone who keeps an eye on it. At DAADit we build our integrations on Connecta, as a Connecta Premium Partner: AI builds, a consultant checks. Want to know what an Exact integration looks like for your administration? Contact DAADit Group or take the free Business Scan.