Fiscal Positions in Odoo: Why HK Businesses With No VAT Still Need Them
How Odoo fiscal positions auto-classify revenue and expenses by region — and why correct local-vs-offshore mapping matters for Hong Kong Profits Tax filing, even with no consumption tax.

At APAA, "Hong Kong has no VAT — do I even need fiscal positions?" is one of the most common questions we field from SME owners setting up Odoo. It is a fair question, and the short answer surprises people: if you do any cross-border business at all, yes, you absolutely need them — just not for the reason most people assume.
Hong Kong's simple, low-tax regime is genuinely an advantage. No VAT, no GST, no sales tax. But that simplicity disappears the moment trade crosses a border. Selling to a mainland China client brings PRC VAT into the picture. Exporting to the EU means dealing with VAT Reverse Charge. Importing from overseas can pull in customs duties. And even for purely local transactions, different revenue types need to land in separate accounts so your Profits Tax filing holds up. Odoo's fiscal positions exist to handle exactly this, automatically. This guide explains what they are, how to configure them for a Hong Kong business, and the three ways to apply them.
Why Hong Kong Businesses Need Fiscal Positions
Let us address the objection head-on. Yes, Hong Kong imposes no consumption tax. But fiscal positions in the Hong Kong context are mostly not about tax rates — they are about classifying revenue and expenses correctly, which is what makes your tax filing defensible.
The Hong Kong Tax Landscape
| Tax | Rate | Notes |
|---|---|---|
| Profits Tax | First HK$2M: 8.25%, remainder: 16.5% | Only on Hong Kong-sourced profits |
| Salaries Tax | Progressive, max 15% | Not relevant to fiscal positions |
| VAT/GST | N/A | Hong Kong imposes no consumption tax |
| Import Duty | Most goods duty-free | Only on alcohol, tobacco, hydrocarbon oils, methanol |
That two-tier Profits Tax — 8.25% on the first HK$2 million of profits and 16.5% on the rest — applies only to Hong Kong-sourced profits. That last phrase is the whole reason fiscal positions matter here: you need to be able to show, cleanly, which of your revenue is local and which is offshore.
When You Actually Need Fiscal Positions
| Transaction type | Tax treatment | Account classification |
|---|---|---|
| Local sale (B2B/B2C) | No tax (0%) | Local sales revenue |
| Export to mainland China | No tax on the HK side; the buyer handles PRC VAT | Export revenue — China |
| Export to EU B2B | No tax (Reverse Charge — the buyer reports VAT) | Export revenue — EU |
| Export to US | No tax on the HK side | Export revenue — other regions |
| Import from mainland China | Most goods duty-free; record the import costs | Import costs |
| Import from EU | May involve local VAT (record if refundable) | Import costs — EU |
The key takeaway: Hong Kong charges no consumption tax, but correctly separating local from export revenue is critical for Profits Tax filing — and especially for any offshore income exemption claim.
What Fiscal Positions Are
Fiscal positions are rule sets inside Odoo's accounting module that automatically swap the default taxes and accounts on your products when a transaction meets specific conditions.
How they work:
- You set default taxes on your products (for example, "No Tax" for a Hong Kong business)
- When a customer or transaction matches a fiscal position's criteria,
- Odoo substitutes the taxes and accounts that position defines.
What that looks like for a Hong Kong business:
| Customer type | Default tax | Fiscal position | Applied tax | Account |
|---|---|---|---|---|
| Local customer | No tax | None (use default) | No tax | Local sales revenue |
| Mainland China B2B | No tax | China Export | No tax | Export revenue — China |
| EU business customer | No tax | EU B2B Export | No tax | Export revenue — EU |
| Other overseas customer | No tax | Overseas Export | No tax | Export revenue — other |
Notice what is happening across that table: the tax stays "No tax" in every row. In the Hong Kong context, fiscal positions are doing account classification, not tax-rate substitution. You are not adding tax — you are routing each region's revenue to its own ledger account, which you need for three reasons:
- Profits Tax filing — distinguishing Hong Kong-sourced from offshore income
- Management reporting — seeing how each market actually performs
- Audit preparation — clean classification means fewer auditor queries
Setting Up Fiscal Positions for Hong Kong
Step 1: Review Your Chart of Accounts
Before you configure any fiscal position, make sure your chart of accounts is granular enough to receive the classified revenue. Here is a structure that works well for an export-active Hong Kong SME:
| Account code | Account name | Purpose |
|---|---|---|
| 4000 | Local Sales Revenue | Hong Kong domestic transactions |
| 4100 | Export Revenue — Mainland China | Sales to mainland China |
| 4200 | Export Revenue — EU | Sales to the European Union |
| 4300 | Export Revenue — Other Regions | Sales to all other overseas markets |
| 4400 | Service Revenue — Local | Local services |
| 4500 | Service Revenue — Overseas | Cross-border services |
Step 2: Create the Fiscal Positions
Go to Accounting → Configuration → Fiscal Positions and build one position per transaction type.
Example: Mainland China Export
- Click Create
- Name it "Mainland China Export"
- Under the Account Mapping tab:
- Default account 4000 (Local Sales Revenue) → replacement 4100 (Export Revenue — Mainland China)
- Default account 4400 (Service Revenue — Local) → replacement 4500 (Service Revenue — Overseas)
- In Legal Notes: "Export sale — no consumption tax applicable under Hong Kong tax law"
Example: EU B2B Export
- Name it "EU B2B Export"
- Account mapping: 4000 → 4200
- Legal notes: "Reverse Charge — VAT to be accounted for by the recipient per EU Council Directive 2006/112/EC"
Step 3: Configure Tax Mappings (If Applicable)
Most Hong Kong transactions carry no tax, but you may still need tax mappings for a few situations:
- Withholding tax — some countries require withholding on payments made to Hong Kong suppliers
- Tax recorded for reference — recording the buyer's VAT liability (for example, mainland China's 13% VAT) purely for reconciliation purposes
- Agency-collected taxes — where you collect tax on a buyer's behalf through certain platforms
How Fiscal Positions Get Applied
Once your positions exist, Odoo gives you three ways to attach them to a transaction. They range from fully automatic to fully manual.
Method 1: Automatic Detection
The most efficient route — Odoo picks the right position from the customer's data.
- Go to Accounting → Configuration → Fiscal Positions
- Open a position (for example, "Mainland China Export")
- Enable Detect Automatically
- Set the conditions:
- Country: select "China"
- Or Country Group: select a group you have created (for example, "Southeast Asia")
A sensible automatic-detection setup for a Hong Kong business:
| Fiscal position | Detection criteria |
|---|---|
| Mainland China Export | Country = China |
| EU B2B Export | Country Group = EU + VAT Required |
| Overseas Export | Country Group = Non-HK, Non-China, Non-EU |
Detection order matters. Odoo tries to match positions in the order they appear in the list, so put the most specific conditions first. "Mainland China Export" must sit above "Overseas Export" — otherwise a mainland customer would be wrongly swept into the generic overseas position.
Method 2: Partner Default
Assign a default fiscal position to a specific customer or vendor.
- Go to Contacts and open the partner record
- Switch to the Sales & Purchase tab
- Pick the right position in the Fiscal Position field
This suits long-term mainland China clients, regular overseas distributors, and any partner with a special tax arrangement.
Method 3: Manual Override
Override the position directly on an individual invoice or bill.
- Create the invoice or bill
- Select the customer or vendor first
- Go to the Other Info tab
- Change the Fiscal Position field
Handy for genuine one-offs — for instance, a normally-local customer asking for a single shipment direct to an overseas address.
Three Real Hong Kong Scenarios
A Trading Company (Import/Export)
A Hong Kong trader sources from mainland China and sells into Europe and Southeast Asia. The setup:
- "Mainland China Supplier" — classifies import costs to a dedicated account
- "EU B2B Export" — classifies export revenue and attaches the Reverse Charge legal note
- "Southeast Asia Export" — classifies export revenue to a regional account
The result: every sale lands in the correct revenue account automatically, Profits Tax filing cleanly separates local from offshore income, and invoices carry the right legal disclaimers without anyone remembering to add them.
A Professional Services Firm (Consulting/IT)
A Hong Kong IT consultancy serves both local and overseas clients:
- Local clients use the default (Service Revenue — Local)
- "Overseas Service" classifies service revenue to the overseas account, supporting any offshore income exemption claim
The result: service revenue splits by geography on its own, offshore claims are backed by clean accounting records, and year-end adjustments shrink dramatically.
A Retail / E-commerce Seller (Cross-border)
A Hong Kong e-commerce seller trades locally and sells into the mainland via cross-border platforms:
- Local sales use the default
- "Cross-border E-commerce — China" records platform-mediated mainland revenue, noting any platform-collected tax arrangements
The result: local and cross-border revenue stay cleanly separated, making channel performance easy to track.
Practices Worth Adopting
Always select the customer first. When creating an invoice or bill, add the customer or vendor before any product lines. That ensures the right fiscal position applies from the outset and every subsequent tax and account calculates correctly.
Prefer automatic detection over manual selection. Use auto-detection wherever you can. Manual picking is error-prone, and the risk only grows with transaction volume.
Review your positions at least annually. Tax rules change. Once a year, confirm that account classifications still meet filing requirements, legal note wording is still accurate, and detection rules still cover all your common transaction types.
Test thoroughly before going live. Create sample invoices with test customers from different regions and verify that the correct position auto-detects, account mappings apply, legal notes appear on the invoice, and reports aggregate correctly by region.
Work with your tax advisor. Hong Kong's offshore income exemption claim has strict requirements. Fiscal position account classification is only the first step — the actual tax treatment should be guided by a qualified tax advisor.
Summary
For a Hong Kong business, the core value of Odoo fiscal positions is not tax-rate substitution — because Hong Kong charges no consumption tax — but automated revenue and expense classification. The points that matter:
- Account mapping is the primary function — routing transactions from different regions into the correct ledger accounts
- Automatic detection assigns the right position from the customer's location, cutting human error
- Legal notes ensure invoices carry the correct disclaimers (Reverse Charge, and so on)
- Profits Tax filing benefits from clean revenue classification, especially the local-vs-offshore distinction
Set up properly, fiscal positions mean your books are organised by region and transaction type from day one — which is exactly what cuts down the year-end audit and tax-filing scramble.
Where to Go From Here
Start by reviewing your existing chart of accounts for enough revenue and cost classifications. Then build fiscal positions for your primary trading markets, set automatic detection for your most common customer regions, assign defaults to long-term partners, and test with sample invoices before going live.
If you would rather have your chart of accounts and fiscal positions designed around how your Hong Kong business actually trades — and the offshore-income angle handled correctly — that is precisely the work our team does. Talk to APAA about setting up your Odoo tax classification.