All posts
Integrator8 min read

Odoo localization: chart of accounts, taxes, fiscal positions, and country-specific configuration

Odoo's accounting localization layer handles country-specific chart of accounts, tax rates, fiscal positions, and reporting requirements. This guide covers how localizations are packaged, how fiscal positions map taxes and accounts for international transactions, and the configuration steps that differ between jurisdictions.

What a Localization Covers#

An Odoo localization (also called a country-specific accounting package) provides:

  • Chart of Accounts: a pre-configured set of account codes following local accounting standards
  • Tax rates: standard VAT/GST rates, reduced rates, and zero-rated categories
  • Fiscal positions: mapping rules for international or cross-jurisdiction transactions
  • Tax reports: predefined report layouts for statutory filings (VAT return, tax summary)
  • Payment terms: local conventions for payment scheduling

Localizations are distributed as Odoo modules (e.g., l10n_fr for France, l10n_ca for Canada, l10n_de for Germany). Install via Apps → search for your country name.


Chart of Accounts#

After installing the localization module, go to Accounting → Configuration → Chart of Accounts.

The chart of accounts provides:

  • Account codes (numeric or alphanumeric, per local standard)
  • Account types (receivable, payable, income, expense, equity, bank, current asset, current liability)
  • Default taxes linked to specific accounts

Customizing the Chart#

Add custom accounts by creating new entries. Most localizations allow you to add accounts under the existing hierarchy without modifying the base accounts (which are managed by the localization module and may be reset on upgrade).

To rename or reconfigure a localization account: create a new account under the same parent and migrate existing journal entries by setting the new account on a journal entry template - do not delete localization accounts mid-year.


Taxes#

Tax Structure#

Go to Accounting → Configuration → Taxes.

Each tax has:

  • Tax name and code: for display and reporting
  • Tax computation: Percentage of Price, Percentage of Price Tax Included, Fixed, Python expression
  • Tax account: where the tax amount posts (usually a VAT payable or VAT receivable account)
  • Tax group: groups taxes on invoices (e.g., "15% GST" and "9.975% QST" may appear as a combined line or separately)
  • Include in analytic cost: whether the tax is included in project cost reporting

Tax Grids#

Tax grids are lines in the statutory VAT/GST return. Each tax is mapped to one or more tax grid lines. When you generate the tax report, Odoo sums the tax amounts per grid line and produces the return.

Inspect grid mappings under Accounting → Reporting → Tax Report → (open a period).


Fiscal Positions#

A fiscal position is a rule set that remaps taxes and accounts for specific customer or vendor contexts:

  • Intra-EU transactions: remap standard VAT to the reverse charge tax
  • Export outside VAT territory: remap standard VAT to zero-rated tax
  • Customer in a special zone: apply the zone's specific rate instead of the standard rate

How Fiscal Positions Apply#

A fiscal position can be:

  1. Set manually on a customer record - all invoices for that customer use this fiscal position
  2. Detected automatically by country and VAT status - configure in Accounting → Configuration → Fiscal Positions → Auto-detection tab

Defining a Fiscal Position#

Fiscal Position: EU Reverse Charge
Tax Mapping:
  21% VAT (Input)  → RC 0% VAT (Input) + RC Self-Billed (Output)
Account Mapping:
  Revenue Account → (no change needed)

Tax mapping replaces the tax on each invoice line. Account mapping replaces the journal account. Both are optional - you can use only tax mapping, only account mapping, or both.


Multi-Currency Configuration#

Enable multi-currency in Accounting → Configuration → Settings → Currencies.

Set the Main Currency (your functional currency). Add foreign currencies and configure their exchange rate sources:

  • Manual: enter rates manually each period
  • Automatic: Odoo fetches rates from a currency provider (ECB for EUR, others available via OCA)

Currency gains and losses post to the accounts configured under Accounting → Configuration → Settings → Currencies → Exchange Difference Journals.


Country-Specific Configuration Checklist#

Canada (GST/HST/QST)#

  • Install l10n_ca (Canadian chart of accounts)
  • Configure GST and provincial tax rates per province
  • Set up two tax lines for Quebec (5% GST federal + 9.975% QST provincial)
  • Configure the Canada Revenue Agency tax grid for HST filing

United Kingdom (VAT)#

  • Install l10n_uk
  • Configure Making Tax Digital (MTD) submission if filing digitally
  • Standard rate (20%), reduced rate (5%), zero rate - map to correct grid lines

European Union#

  • Install country-specific l10n_XX module
  • Configure OSS (One Stop Shop) fiscal position for B2C cross-border sales if above the threshold
  • Intra-EU reverse charge fiscal position for B2B purchases from EU suppliers

United States#

  • Install l10n_us (generic chart of accounts; no federal VAT)
  • Configure sales tax per state/county using tax groups and fiscal positions per customer state
  • 1099 reporting configuration for US vendor payments

Common Localization Issues#

1. Invoice posts to wrong tax account#

Check the tax configuration: the tax should have a Tax Account (Credit) for customer invoices and a Tax Account (Debit) for vendor bills. If these are swapped or missing, the posting uses a fallback account.

2. Fiscal position not auto-detected#

Auto-detection requires the customer to have both a Country and a VAT number (for EU reverse charge). If either is missing, Odoo falls back to the default fiscal position. Check the customer record completeness.

3. Tax report shows unexpected amounts#

If journal entries were posted with the wrong fiscal period, they appear in the wrong period's tax report. Use Accounting → Accounting → Journal Entries to identify entries with wrong dates and correct them before running the report.

4. Chart of accounts shows duplicate codes after module upgrade#

This happens when a localization upgrade renames or renumbers an account while you have a custom account with the same code. Rename your custom account code before upgrading.


ERPeek can inspect your Odoo tax configuration, fiscal positions, and chart of accounts - identifying unused accounts, fiscal position gaps, and tax grid mismatches. See the contact page for details.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free