If you run Odoo across multiple Asian markets — say, a manufacturing operation in Thailand, a sales subsidiary in Japan, and a procurement office in China — you’ve probably discovered the same thing in three different ways. The standard invoice digitization feature works beautifully on the AWS bills and the European supplier invoices. It struggles, breaks, or quietly produces wrong drafts on almost everything else.
Most teams blame their local situation. The Thai team blames the WHT certificates. The Japan team blames the registration number on qualified invoices. The China team blames the structured e-invoice format. They’re all correct, and they’re all describing the same underlying problem from different angles.
This post is for the engineering, finance, and operations leaders running Odoo across more than one Asian market — or evaluating Odoo for a multi-country rollout. We’ll walk through the localization gap pattern, what it actually looks like in five representative markets, and the country-pluggable architecture we’ve found works to close the gap once and reuse the fix everywhere.
The detail-level posts for individual markets are linked at the end. This is the umbrella view.
The hidden cost compounds across countries
In a single market, the inefficiency from manual AP entry is annoying but bearable. A Thai SME processing 150 vendor bills a month loses around 17 hours of clerk time to entry and correction. A Japanese SME of similar size loses about the same. A Chinese SME running input VAT verification manually loses a bit more. Each individually justifies an automation investment, but barely.
The math changes when these numbers stack across a multi-country group. A regional company with three subsidiaries — Thailand, Japan, China — at 150 bills/month each is now looking at 50+ hours of regional finance team time burned every month on something that should be a software problem. Each subsidiary has its own AP system practices, its own master data quirks, its own local accountant interpretations. Month-end consolidation depends on all three closing on time. One country slipping by two days delays the whole group reporting cycle.
Multi-country operators don’t need three separate point solutions. They need one architecture that handles the shared parts (OCR, AI extraction, ERP integration, approval workflow) once, and isolates the country-specific parts (regulatory fields, tax logic, validation against local authorities) into pluggable modules. We’ll get to what that looks like.
What Odoo’s built-in digitization actually does
Credit where it’s due. Odoo 17 introduced AI-based invoice digitization that uses OCR plus machine learning to extract:
- Vendor name and address
- Invoice number and date
- Total amount, subtotal, tax amount
- Line items (description, quantity, unit price)
- Currency
Odoo 18 improved layout recognition and tightened integration with the Documents module. For a clean PDF invoice from a European or US vendor — English text, standard fields in standard positions — it produces a reasonable draft that an AP clerk can confirm and post in under a minute.
For an Asian SME, this covers maybe 20–30% of incoming bills cleanly. Typically the digital invoices from international SaaS vendors: AWS, Google Workspace, Meta Ads, and the like. Everything else degrades, and several categories fail outright. The way they fail differs by country.
The localization gap pattern, country by country
Asia is not one market. The phrase "Asian invoices" obscures more than it reveals — Thailand’s regulatory requirements have nothing in common with China’s, which have nothing in common with Japan’s. Below is a representative sample of where Odoo’s standard OCR breaks for each major market we operate in.
Thailand
The two big gaps are the tax invoice (ใบกำกับภาษี) field structure and the withholding tax certificate (50 ทวิ) workflow.
A full Thai tax invoice requires a 13-digit Tax ID, a branch designation (สำนักงานใหญ่ or สาขาที่ XXXXX), and the words "ใบกำกับภาษี" prominently displayed. Odoo’s OCR, trained on Latin-script invoices, often misses the Tax ID, confuses the branch code with random numerics, and treats Thai text as noise.
The bigger gap is WHT. When you receive a service invoice in Thailand, you’re typically required to withhold 1%, 2%, 3%, or 5% of the pre-VAT amount and issue a 50 ทวิ certificate. Odoo standard has no native WHT certificate model — you need l10n_th or a custom module. The built-in OCR has no awareness of any of this, so the WHT calculation, certificate generation, and ภ.ง.ด. 3 / 53 monthly filing linkage are entirely manual.
→ Deep dive: Why Odoo’s Built-in Invoice OCR Fails on Thai Tax Documents — and What to Do About It
Japan
Since the qualified invoice system (インボイス制度) launched in October 2023, every Japanese B2B invoice is supposed to carry a registration number (登録番号, T + 13 digits), a tax-rate-by-line breakdown, and explicit separation of the reduced 8% rate from the standard 10% rate.
Two gaps stack on top of each other. First, Odoo’s OCR doesn’t reliably extract the 登録番号 — it gets confused with the older 法人番号 (corporate number) on multi-section invoices. Second, even when extracted correctly, the number must be verified against the National Tax Agency’s public database to confirm it’s still active on the invoice date. Failed verification means no input consumption tax credit. Odoo standard has no integration with the NTA system.
Japan also has its own withholding tax (源泉徴収) on specific service categories — lawyers, tax accountants, designers, freelance writers — at 10.21% (or 20.42% above ¥1M). Different mechanism from Thai WHT, with annual 法定調書 / 支払調書 reporting obligations that Odoo doesn’t model. And electronic preservation requirements under 電子帳簿保存法 (mandatory since January 2024) impose archival rules that the standard OCR pipeline ignores.
→ Deep dive: Why Odoo’s Invoice OCR Doesn’t Work for Japanese Qualified Invoices
China
China’s gaps cluster around three issues: invoice authenticity verification, taxpayer-type distinction, and the fully digitalized e-invoice format (全电发票).
Every special VAT invoice (增值税专用发票) from a general taxpayer must be verified against the State Taxation Administration’s national platform before input VAT can be claimed. If the invoice is fake, voided, or doesn’t match the STA system records, no input credit and no tax-deductible expense. Odoo has zero native integration with this system. Worse, general taxpayers also need to perform 抵扣勾选 (deduction confirmation) on the comprehensive service platform — a separate compliance step that ERP systems don’t touch.
Odoo’s standard res.partner has no field for general taxpayer (一般纳税人) vs small-scale taxpayer (小规模纳税人) — a distinction that determines whether you can claim input VAT at all. And the fully digitalized e-invoice (全电发票), which by 2025–2026 is the default in most provinces, is structured XML data that Odoo’s standard digitization ignores in favor of running OCR on the rendered PDF.
→ Deep dive: Why Odoo’s Standard OCR Can’t Handle Chinese VAT Invoices (Including 全电发票)
India (brief)
India added GST e-invoicing in phases starting 2020, mandating it for B2B transactions above progressively lower thresholds — currently down to ₹5 crore turnover. Every B2B invoice generates an Invoice Reference Number (IRN) and QR code through the Invoice Registration Portal. The QR code contains the digitally signed invoice JSON.
Odoo’s built-in OCR doesn’t decode the QR code or validate the IRN against the IRP. It also doesn’t natively handle the multi-state GST split (CGST/SGST for intra-state, IGST for inter-state) that determines the correct account.tax records. GSTIN structure validation (15 characters with state code, PAN, entity code, checksum) needs to live in the validation layer.
Indonesia (brief)
Indonesia mandates e-Faktur for VAT-registered businesses. Each tax invoice carries a 16-digit Faktur Pajak number issued by DJP (the tax authority), and PKP-to-PKP transactions require validation through the e-Faktur application or DJP’s Coretax system. Withholding tax under PPh 23 (2% on services) and PPh 26 (20% on payments to non-residents) layers on top of VAT. Odoo’s standard OCR doesn’t validate Faktur Pajak numbers or compute PPh withholding by counterparty status.
Malaysia and Vietnam (brief)
Malaysia rolled out MyInvois in 2024 — phased mandatory e-invoicing through LHDN, with structured JSON/XML format. Vendors above the revenue threshold must clear invoices through the MyInvois portal. Vietnam has had mandatory e-invoicing since July 2022, with structured XML and direct connection to the General Department of Taxation.
In both cases, the structured invoice data is there if you parse it. Standard Odoo OCR doesn’t parse it.
The pattern beneath the country specifics
If you read the country sections back to back, four things show up everywhere:
- Local tax ID structure that the OCR doesn’t reliably extract or validate (Thai 13-digit + branch, Japanese 登録番号 with NTA verification, Chinese 18-digit unified social credit code, Indian GSTIN, Indonesian NPWP, Malaysian TIN).
- Country-specific tax mechanism that Odoo standard doesn’t model (Thai WHT certificates, Japanese 源泉徴収 + 法定調書, Chinese input VAT verification + 抵扣勾选, Indian GST multi-state, Indonesian PPh).
- Structured e-invoice format that the standard OCR runs through OCR instead of parsing as data (Thai e-Tax Invoice, Japanese JP-PINT, Chinese 全电发票, Indian IRN, Indonesian e-Faktur, Malaysian MyInvois, Vietnamese e-Invoice).
- Multilingual document streams that drop OCR confidence — most Asian SMEs handle invoices in their local language plus English plus one or two regional languages on a routine basis.
The implication is that any architecture that fixes this for one market should be reusable across markets, with country-specific extension points isolated from the core pipeline.
A country-pluggable architecture
Here’s the pattern. Keep Odoo as the system of record. Put a thin AI middleware between document sources and Odoo’s API. Inside the middleware, factor out everything country-specific into pluggable adapters — and keep the OCR, AI extraction, and orchestration layers shared.
flowchart TD
A["Vendor Bill Source<br/>Email / Scan / Upload / e-Invoice XML"] --> B["Document Ingestion<br/>FastAPI Middleware"]
B --> C{"Document Type"}
C -->|"Structured XML / OFD"| D["XML Parser<br/>e-Tax / JP-PINT / 全电发票 / IRN / e-Faktur / MyInvois"]
C -->|"PDF / Image"| E["OCR + Layout Engine<br/>Multilingual"]
E --> F["AI Extraction<br/>Claude Sonnet"]
D --> G["Country Adapter<br/>TH / JP / CN / IN / ID / MY / VN"]
F --> G
G --> H["Validation Layer<br/>Tax ID / e-Invoice Authority / Vendor Master"]
H --> I["Country Tax Logic<br/>WHT / Input VAT / GST / PPh"]
I --> J{"Confidence Threshold"}
J -->|"High"| K["Draft account.move<br/>Auto-create"]
J -->|"Low"| L["Human Review Queue"]
L --> K
K --> M["AP Approval Gate"]
M --> N["Posted Bill in Odoo<br/>+ Country-Specific Compliance Records"]
A few design choices worth surfacing:
The middleware sits outside Odoo, not inside. A FastAPI service that talks to Odoo via XML-RPC or REST gives you independence — you can upgrade the AI stack, swap LLM providers, or extend to additional countries without touching the ERP layer. We’ve tried building this as Odoo custom modules and the upgrade pain isn’t worth the integration tightness.
OCR and AI extraction are separate stages. OCR (Tesseract, PaddleOCR, or a commercial engine) gives you raw text plus layout. The AI layer (Claude Sonnet primary, Ollama fallback for sensitive-data scenarios) does the structured extraction. Treating these as separate stages lets you debug failures cleanly: was it a vision problem (OCR missed text) or a reasoning problem (AI extracted wrong field)?
The country adapter is the single point of localization. When you add a new country — say you expand into Vietnam — you write a Vietnam adapter that knows the e-Invoice XML schema, the Vietnamese VAT rate codes, the local tax ID validation, the 5-digit invoice template code structure. The adapter plugs into the same orchestration. The OCR, AI, approval workflow, and Odoo integration don’t change.
Tax authority verification happens before draft creation. Wherever a country’s regulator offers an API (Japan’s NTA, China’s STA, India’s IRP, Indonesia’s DJP Coretax, Malaysia’s MyInvois LHDN portal), the adapter calls it. Failed verification routes to a queue, not a broken draft.
Country-specific tax logic lives in the adapter, not the prompt. Service-type-to-WHT-rate mappings, GST CGST/SGST split decisions, PPh 23/26 selection — these are regulatory rules. You don’t ask the LLM to figure them out. You have the LLM classify (with confidence), then deterministic country logic does the calculation.
The human approval gate is non-negotiable, everywhere. No country adapter posts a bill without a finance person clicking approve. This is a control matter (varying by jurisdiction — J-SOX in Japan, internal control regulations in China, BoT-supervised expectations in Thailand) and a trust-building matter. AP teams adopt AI faster when they remain the final authority.
ROI for multi-country operators
Single-country numbers are in the deep-dive posts. Here’s how it stacks at a regional level.
A representative regional operator: Thailand subsidiary processing 150 bills/month, Japan subsidiary 100 bills/month, China subsidiary 200 bills/month. Local AP staff fully-loaded cost varies (Thailand THB 30–50k, Japan ¥300–350k, China RMB 12–18k), but the pattern is consistent.
Before: ~50–55 hours/month of regional AP time on entry, country-specific verification (NTA, STA), WHT/PPh calculations, and exception handling. Plus 2–3 days of monthly close lag for the slowest country, dragging the whole group’s consolidation timeline.
After: ~10–12 hours/month of review and exception handling across all three countries. Country-specific compliance steps (NTA verification, STA verification, WHT certificate generation) automated within the adapter. Group consolidation closes 2–3 days faster because no single subsidiary is the bottleneck.
The harder-to-quantify benefits are larger. AP staff redeploy to vendor master cleanup, cash flow forecasting, and intercompany reconciliation — the work that actually moves the business forward. Compliance audit trails are uniform across countries (same structured logs, same approval gates) which makes external audits dramatically less painful for groups working with Big 4 firms across markets.
Implementation realities
A few things that will shape your rollout decisions:
Country sequencing matters. Don’t try to deploy across all your markets simultaneously. Pick one country to lead — usually the one with the highest invoice volume and the simplest regulatory profile (Thailand or Singapore tend to be good first), get straight-through processing to 90%+, then port the orchestration to the next market while writing the new country adapter. The shared infrastructure compounds; each country after the first is faster than the one before.
Data residency varies. Some markets allow cloud-hosted AI inference on accounting data with reasonable safeguards (Singapore, Hong Kong, Thailand under PDPA conditions). Some markets effectively require local inference (China under PIPL + DSL, Vietnam under PDPD). Some require local data hosting but tolerate cross-border AI calls under specific conditions (Japan APPI, Indonesia PDP). The architecture supports both — Claude Sonnet for cleaner extraction, Ollama for local inference where required — but you need to make the decision per country, not globally.
Master data harmonization is the silent killer. A regional company with three subsidiaries usually has three different vendor masters with overlapping but inconsistent vendor records. The same supplier appears as three entities with three Tax IDs (one per country) and three different account codings. The AI middleware doesn’t fix this for you — it’ll faithfully match invoices to whichever vendor record exists in each country’s res.partner. Plan for a regional master data harmonization workstream alongside the AP automation rollout.
Phased adapter development. A reasonable rollout plan: country 1 (live in 8–12 weeks including master data cleanup), country 2 (4–6 weeks since orchestration is shared), country 3+ (3–4 weeks each). The adapter pattern is what makes this possible.
Where this sits in the broader Odoo + AI conversation
Odoo S.A. is investing heavily in AI features in version 19 and beyond — invoice digitization will keep getting better, and there will be agentic AI features layered on top of it. Some Asian localizations will improve as a side effect. None of this changes the fundamental dynamic for multi-country operators.
The reason a country-pluggable middleware approach makes sense isn’t that Odoo will never improve in this direction. It’s that the regulatory and linguistic specifics of seven or eight Asian markets are unlikely to be Odoo S.A.’s top priority on any short-to-medium time horizon. The platform is building for the median European customer first, and rightly so given where its volume is. If you operate in Asia, the gap is real today and will narrow slowly.
The country-pluggable middleware gets you to the destination now, in your specific multi-country regulatory and linguistic context, without waiting for the Odoo roadmap to catch up.
Talk to us
If you’re running Odoo (or evaluating it) across multiple Asian markets, and the localization gap pattern described here matches what your regional finance team is dealing with, we offer a free 30-minute multi-country Odoo + AI assessment. We’ll walk through your current footprint, identify which countries and which document categories are highest-leverage for automation, and give you an honest read on what’s worth doing in-house vs. with help.
Simplico has been deploying Odoo and ERPNext across Thai, Japanese, Chinese, and English-speaking markets for over a decade. We work in production with multilingual documents, multi-jurisdiction tax logic, and multi-country group consolidation in real factories, trading companies, and service businesses — not in slide decks.
[Book a 30-minute assessment →]
Country-specific deep dives
For finance, operations, or IT teams working in a single market, the country-specific posts go into the regulatory detail at the level needed for an in-house implementation:
- Thailand: Why Odoo’s Built-in Invoice OCR Fails on Thai Tax Documents — and What to Do About It — covers ใบกำกับภาษี structure, the 50 ทวิ workflow, e-Tax Invoice, and the Thai branch concept.
- Japan: Why Odoo’s Invoice OCR Doesn’t Work for Japanese Qualified Invoices — covers 登録番号 verification against the NTA, 8% / 10% line splits, 源泉徴収 + 法定調書, JP-PINT, and 電帳法 archival requirements.
- China: Why Odoo’s Standard OCR Can’t Handle Chinese VAT Invoices (Including 全电发票) — covers 一般纳税人 vs 小规模纳税人 distinction, STA invoice verification, 抵扣勾选, and 全电发票 structured data.
Posts for India, Indonesia, Malaysia, and Vietnam are in the pipeline.
Latest Posts
- Your Calipers Are Already Talking — Is Anyone Listening? May 9, 2026
- The Simplico Engineering Library: A Field Guide to Production Software, AI, and Security in 2026 May 5, 2026
- The Accounting Software Your Firm Uses Is Built for Your Clients, Not for You April 28, 2026
- Choosing Hardware for Local LLMs in 2026: A Practical Sizing Guide April 28, 2026
- Why Your Finance Team Spends 40% of Their Week on Work AI Can Now Do April 27, 2026
- How We Built a Real Security Operations Center With Open-Source Tools April 25, 2026
