Odoo Accounting Basics
Invoicing is not accounting
First, a distinction that decides which edition you need.
Invoicing comes with Odoo Community. You can raise customer invoices, record vendor bills, register payments and see basic reports.
Accounting is the Enterprise app. It adds bank synchronisation, automatic reconciliation, assets, deferred revenue, budgets, analytic accounting and country-specific tax reports.
If your accountant keeps the books in their own software and you just need to bill customers, Invoicing is enough. If you want your books inside Odoo, you need Accounting.
This article covers the accounting side.
The one thing that makes Odoo different
In most accounting software, someone enters the entries.
In Odoo, most entries create themselves.
Validate a delivery and, with automatic valuation on, the stock and cost-of-goods entry posts at that moment. Post a customer invoice and the receivable and income entries appear. Register a payment and the receivable clears.
The accountant’s job shifts from typing entries to checking that the automatic ones are right. That is a better use of the time, but it means the configuration underneath has to be correct — because a wrong setting will now produce wrong entries at speed.
FIGURE 1: WHAT CHANGES FOR YOUR ACCOUNTANT
Traditional software
- Someone types every entry
- Reconcile stock against books monthly
- Errors found weeks later
Odoo with automatic valuation
- Entries post as work happens
- Stock value always matches on hand
- Errors visible the same day
Chart of accounts
Odoo installs a chart of accounts for your country when you set up the company. Start from that rather than building one from scratch.
Three pieces of advice.
Do not over-detail it. A separate account for every product category feels thorough and makes your profit and loss unreadable. Use analytic accounting for that kind of breakdown instead.
Match how you report. The structure should mirror the accounts your board, bank and auditor actually want to see.
Fix it early. Changing account structure after a year of transactions is possible but painful. Get your accountant to sign it off before go-live.
The accounts that matter for stock
If you hold inventory with automatic valuation, four accounts do the work. Understanding them saves a lot of confusion later.
Stock Valuation. The balance sheet value of goods you hold. Should always equal your stock on hand report.
Stock Input. A holding account. Goods received but not yet billed sit here. It should clear when the vendor bill is posted.
Stock Output. The mirror on the sales side. Goods delivered but not yet invoiced.
Cost of Goods Sold. Where the cost lands when goods are invoiced out.
A useful monthly check: the Stock Input and Stock Output accounts should be close to zero. A growing balance in either means receipts are not being billed, or deliveries are not being invoiced. It is one of the most reliable early warnings in the system.
FIGURE 2: THE FOUR STOCK ACCOUNTS
Stock Valuation
- Balance sheet value of goods you hold. Should equal your stock on hand report.
Stock Input
- Goods received but not yet billed. Should clear when the vendor bill posts.
Stock Output
- Goods delivered but not yet invoiced. The mirror on the sales side.
Cost of Goods Sold
- Where the cost lands when goods are invoiced out.
Customer invoices
Invoices come from three places: created from a sales order, created directly, or generated from a subscription.
Draft invoices can be edited freely. Posted invoices cannot — they have a sequence number and journal entries.
To correct a posted invoice, you issue a credit note. This is not Odoo being awkward. It is basic accounting practice, and any auditor will expect it.
Payment terms control when it is due and can define instalments. Fiscal positions handle tax treatment — domestic versus export, registered versus unregistered.
Vendor bills
Same flow in reverse. Created from a purchase order, or entered directly.
When created from a purchase order, the bill is drafted from received quantities. Your job is to compare it against what the vendor actually charged. Order, receipt, bill — the three-way match.
Odoo can also read scanned bills and extract the vendor, date, amount and lines automatically. The extraction is good and it is not perfect. Check it before posting.
Bank reconciliation
This is where Enterprise earns its price for most companies.
Bank statements come in three ways: automatic synchronisation with your bank, file import, or manual entry.
Odoo then proposes matches between statement lines and your invoices and bills. Most match cleanly and you accept them. The rest need attention, which is exactly where an accountant’s time should go.
Reconcile weekly, not monthly. A week of unmatched items is a small job. A month is an afternoon, and by then nobody remembers what the odd payment was for.
Taxes
Set up carefully once and the rest follows.
Taxes define rates and which accounts they post to. Fiscal positions map taxes based on the customer or vendor — so an export customer automatically gets zero-rated treatment.
Odoo’s country localisation packages include the standard taxes and tax reports for most countries. Install the right one and check the tax report against a period you have already filed manually. If it matches, you can trust it.
Analytic accounting
This is the feature most people do not know they need.
Analytic accounting lets you tag transactions with a second dimension — a project, a department, a branch, a cost centre — separately from the account.
The benefit: you get profitability by project or by department without creating dozens of extra general ledger accounts. Your chart of accounts stays clean and readable, and you still get the detailed view.
If you have ever been tempted to create “Sales – Branch A” and “Sales – Branch B” accounts, use analytic accounting instead.
Reports
Profit and Loss. Income and expenses over a period.
Balance Sheet. What you own and owe at a point in time.
Aged Receivable. Who owes you and for how long. The most useful report in the system for most small businesses.
Aged Payable. The same for what you owe.
General Ledger. Every entry on every account. Where you go when something needs explaining.
Tax Report. Your filing figures.
All of them read live data. There is no overnight export and no separate reporting database.
The monthly close
A workable routine:
- Reconcile all bank accounts
- Check that every delivery has been invoiced
- Check that every receipt has been billed
- Confirm Stock Input and Stock Output are near zero
- Review the aged receivable and chase what needs chasing
- Post any manual adjustments — accruals, depreciation
- Review the profit and loss against expectation
- Lock the period so nobody posts into a closed month
Locking is important. Without it, a backdated entry can quietly change a month you already reported.
What usually goes wrong
Nobody checks the automatic entries. They are automatic, not infallible. A wrong product configuration produces wrong entries consistently and confidently.
Stock Input never clears. Almost always means receipts are being made without bills. Check it monthly.
Reconciliation left to month-end. It grows into a job nobody wants.
Periods not locked. Backdated entries change reported figures after the fact.
Chart of accounts too detailed. A profit and loss nobody can read is a profit and loss nobody uses.
Getting started
- Install your country localisation
- Review the chart of accounts with your accountant and sign it off
- Set up taxes and fiscal positions, then test against a period you already filed
- Configure stock accounts if you hold inventory
- Set up bank accounts and reconciliation
- Enter opening balances, agreed with your accountant
- Run a full test cycle and check every entry
That last step is the one that matters. Take one sales order and one purchase order all the way through in a test database, and look at every journal entry Odoo creates. If they are all correct, your configuration is sound.
Setting up accounting in Odoo?
Get in touch. We work with your accountant on the chart of accounts and valuation method before anything is configured.