Every Thai Odoo implementation we have run starts the same way. Someone installs the Thai localization module, looks at the chart of accounts it generates, and asks whether it is ready to use. It is not, not exactly. The Thai chart of accounts Odoo ships with is a reasonable skeleton. It follows the structure the Revenue Department and most Thai auditors expect. But it is generic by design, built to work for a trading company, a service firm, and a small manufacturer all at once. Your business is none of those in isolation. The accounts, groups, and analytic structure need adjustment before anyone posts a real entry against them.
We have done this setup enough times to have a standing checklist. Below is what we actually walk through with a client in the first two weeks of an Odoo implementation, before go-live, not after.
What the Default Thai Chart of Accounts Odoo Setup Gives You
Installing the Thai localization package (l10n_th) creates a chart of accounts numbered broadly in line with Thai accounting convention. Assets sit in the 1xxx range, liabilities in 2xxx, equity in 3xxx, revenue in 4xxx, and expenses in 5xxx and above. It also sets up the account types Odoo needs internally. These decide how each account behaves on the balance sheet or profit and loss statement. It links to Thai tax rates for VAT at 7 percent.
That is a solid base. What it does not do is reflect your company's own cost centers, product lines, branches, or the level of detail management actually wants on a monthly P&L. A trading company importing goods needs cost of goods sold broken out by product category. A professional services firm needs expense accounts split by project or department. A manufacturer needs raw material, work-in-progress, and finished goods valuation accounts that map cleanly to its costing method. None of that is in the box.
Thai Chart of Accounts Odoo Account Groups: Organize Before You Add Detail
Before touching individual accounts, we set up account groups. These are the folders that let you collapse "all bank accounts" or "all trade payables" into one line on a report, then expand when needed. Skipping this step is the single most common mistake we see in self-managed Thai setups. Accountants add accounts as they need them, in no particular order. Six months later the trial balance is unreadable without exporting it to Excel first.
A practical grouping for a mid-size Thai company usually looks like this:
- Current assets: cash, bank, PromptPay clearing, accounts receivable, input VAT, withholding tax receivable
- Non-current assets: fixed assets, accumulated depreciation, intangibles
- Current liabilities: accounts payable, output VAT, withholding tax payable, accrued expenses
- Equity: share capital, retained earnings, current year earnings
- Revenue: by product line or by sales channel if you sell through Shopee, Lazada, or TikTok Shop alongside your own storefront
- Cost of sales and expenses: by department or by nature, depending on how management wants to read the P&L
Get the groups right first. Adding or renaming accounts later is easy. Reorganizing groups after a year of postings means restating comparative reports, which nobody enjoys.
Accounts to Add Before Go-Live, Not After
A few accounts rarely exist in the default chart. They come up in almost every Thai business we onboard:
- A clearing account for PromptPay settlements, separate from your main bank account, so daily reconciliation does not get mixed up with wire transfers
- Separate withholding tax receivable accounts for PND 3 (juristic persons withholding on services) and PND 53 (withholding on services paid to other juristic persons), rather than one blended account
- A suspense or clearing account for e-Tax invoice batches awaiting submission, useful if your invoicing volume is high enough that batches do not clear same day
- Marketplace fee expense accounts, one per channel if you sell on more than one, so you can see Shopee's commission structure against Lazada's without digging into subledgers
None of these are exotic. They are just not in the default chart. Odoo cannot know in advance which marketplaces you sell on or how granular you want your tax receivables split.
Analytic Accounts: Answering Management's Real Questions
The chart of accounts answers "what kind of transaction is this." Analytic accounts answer "which project, branch, or cost center does it belong to." Thai businesses that skip analytic accounting tend to end up requesting a custom report every time the owner wants to know profitability by branch or by job. With analytic accounts set up correctly from day one, that report already exists.
We typically recommend one analytic plan per dimension that actually changes your decisions. A company with three branches in Bangkok, Chonburi, and Chiang Mai wants an analytic account per branch. A project-based business wants one per client engagement. A manufacturer often wants both a cost center plan and a project plan running in parallel. Recent versions of Odoo support this through multiple analytic plans.
The trade-off is discipline. Analytic accounts only produce useful reports if every journal entry, vendor bill, and expense line is tagged correctly at the point of entry. We have seen clients set up a beautiful analytic structure and then abandon it within three months. Staff were not trained to tag transactions, and nobody enforced it. If you are not prepared to make analytic tagging mandatory on the relevant journals, do not bother setting up the plan. A half-used analytic structure is worse than none. It gives false confidence in reports that are actually incomplete.
Fiscal Position and Tax Mapping in the Thai Chart of Accounts Odoo Setup
Thai VAT and withholding tax rules interact with the chart of accounts through fiscal positions and tax groups. Before go-live, check that your default sales and purchase taxes point at the correct output and input VAT accounts. Confirm that withholding tax rates are mapped to the right receivable or payable account rather than a generic one. This matters most when you deal with vendors at different withholding rates, such as 3 percent for most services versus other rates for rentals or specific professional services. Getting this wrong does not usually break anything visibly. It just produces a PND form that does not reconcile to the general ledger at month-end. Chasing that down after the fact is painful.
A Short Pre-Go-Live Checklist
Before anyone posts the first real entry, we walk through this list with the client's finance team:
| Area | Check |
|---|---|
| Account groups | Match how management wants to read the P&L and balance sheet |
| Chart detail | Added marketplace fees, PromptPay clearing, split withholding tax accounts |
| Analytic plans | One per dimension that drives a real decision, not more |
| Default taxes | Sales and purchase taxes mapped to correct VAT accounts |
| Withholding tax | Rates mapped to distinct receivable/payable accounts |
| Opening balances | Loaded against the new structure, not the generic default one |
Running through this list takes a day or two of working sessions with whoever owns the books. It is far cheaper than discovering in March, during the annual audit, that half the expense accounts have no analytic tag and the auditor wants a branch-level breakdown. Reconstructing that manually at the last minute is no fun for anyone.
Where the Chart of Accounts Fits in a Wider Odoo Implementation
Chart of accounts and analytic structure are usually one slice of a broader go-live. That rollout also covers inventory, sales, and sometimes Thai VAT and e-Tax configuration and e-Tax invoice workflows. We treat the accounting setup as something to configure and sign off before any transactional data is loaded. Retrofitting account structure onto live journal entries is possible but messy. It always costs more than doing it right the first time.
If you are early in planning an Odoo rollout for a Thai entity, raise the chart of accounts conversation during the scoping phase of your Odoo ERP development project. Do not leave it for the accounting team to sort out after training. Our team also handles the surrounding integration work, such as marketplace connectors through Odoo API integration, so the chart of accounts lines up with how sales actually arrive in the system. For businesses running on Shopify alongside marketplaces, our own e-commerce development work often touches the same reconciliation questions.
One honest caveat: no chart of accounts, however well designed, replaces a competent accountant reviewing the trial balance monthly. Odoo can enforce structure and tagging rules. It cannot catch a miscoded entry that still balances. Build the structure right. Then keep the monthly review habit regardless.



