This article is currently available in English only. Translation coming soon.
Odoo Saudi Arabia Localization 2026: ZATCA Phase 2 & Fatoora Setup
Saudi Arabia's Zakat, Tax and Customs Authority (ZATCA) operates one of the most rigorous e-invoicing programs in the world. The Fatoora platform, launched in December 2021, requires every VAT-registered business to issue electronic invoices through ZATCA-cleared systems. Phase 2 (the integration phase) became mandatory for all VAT-registered taxpayers by mid-2024, with continuing wave-based onboarding through 2026 covering remaining taxpayers and new entities. Odoo's l10n_sa_edi module provides native ZATCA Phase 2 integration, making Saudi Arabia one of the strongest country-specific localizations in the platform.
Key Takeaways
- ZATCA administers VAT (15%), Zakat (2.5% of zakatable base), corporate tax (20% on non-Saudi shareholders' share), and excise tax
- Fatoora platform mandates Phase 2 e-invoicing with cryptographic signatures and real-time clearance for B2B
- Odoo
l10n_sa_ediprovides native ZATCA Phase 2 integration including XAdES signing and CSID management- Phase 2 waves continue through 2026 for newly VAT-registered businesses; threshold-based onboarding
- Standard invoices (B2B) require clearance before issuance; simplified invoices (B2C) require reporting within 24 hours
- Arabic mandatory on invoice; bilingual (Arabic + English) common practice
- Statutory reports: VAT return monthly/quarterly, Zakat annual via EXEM portal
Saudi Arabia Tax Framework Overview
ZATCA enforces three primary taxes relevant to Odoo:
- VAT: 15% standard rate (raised from 5% in July 2020); zero-rated for exports, international transport, qualifying medicines and medical equipment; exempt for financial services and residential leases
- Zakat: 2.5% of the zakatable base for Saudi/GCC-owned shares of companies (paid in lieu of corporate tax)
- Corporate Tax: 20% on non-Saudi shareholders' share of profits in mixed-ownership companies, plus full 20% for non-GCC owned companies
The Fatoora e-invoicing program operates in two phases:
- Phase 1 (Generation): Effective 4 December 2021. All VAT-registered taxpayers must issue e-invoices in a structured format (XML or PDF/A-3 with embedded XML). Manual handwritten/typed invoices banned.
- Phase 2 (Integration): Effective 1 January 2023 in waves based on annual revenue. Mandates real-time integration with ZATCA's Fatoora platform: clearance for B2B standard invoices, reporting within 24 hours for B2C simplified invoices.
By 2026, Phase 2 continues onboarding smaller taxpayers and newly VAT-registered entities through ZATCA's wave announcements (typically every 3-6 months).
Required Odoo Localization Modules
| Module | Purpose | Edition |
|---|---|---|
l10n_sa | Saudi chart of accounts and VAT taxes | Community |
l10n_sa_edi | ZATCA Phase 2 e-invoicing (clearance + reporting) | Enterprise |
l10n_sa_edi_pos | POS-specific simplified invoice handling | Enterprise |
l10n_sa_hr_payroll | GOSI, ZATCA payroll compliance | Enterprise / Custom |
account_reports | VAT return template | Enterprise |
The l10n_sa_edi module in Odoo Enterprise provides one of the most complete ZATCA Phase 2 implementations available in any ERP, including:
- Compliance Cryptographic Stamp Identifier (CSID) provisioning
- XAdES-B-LT signing
- QR code generation per ZATCA specification
- Clearance API integration for standard invoices
- Reporting API integration for simplified invoices
- Universally Unique Identifier (UUID) and ICV (Invoice Counter Value) management
- Previous Invoice Hash (PIH) chaining
Chart of Accounts Setup
The Saudi chart of accounts follows IFRS as adopted by SOCPA (Saudi Organization for Chartered Public Accountants). The l10n_sa module installs:
- 1xxx: Assets (cash, receivables, inventory, fixed assets)
- 2xxx: Liabilities (payables, VAT payable/recoverable, Zakat payable, withholding tax payable)
- 3xxx: Equity
- 4xxx: Revenue
- 5xxx: Cost of revenue
- 6xxx-7xxx: Operating expenses
- 8xxx-9xxx: Other income/expenses
Configure the company record with:
- VAT registration number (15 digits)
- Commercial Registration (CR) number
- ZATCA Group VAT number if part of a tax group
- Building number, street, district, city, postal code (separately, per ZATCA address requirements)
Saudi ZATCA invoices require structured address fields; combining them into a single field causes validation failures.
VAT Configuration
Configure VAT tax records:
| Tax Name | Rate | Type | Notes |
|---|---|---|---|
| VAT 15% Sales (Standard) | 15% | Sales | Standard supplies |
| VAT 0% Sales (Exports) | 0% | Sales | Outside KSA / GCC implementing states |
| VAT 0% Sales (Medicines) | 0% | Sales | Qualifying medicines & medical equipment |
| VAT Exempt Sales | 0% | Sales | Financial services, residential lease |
| VAT 15% Purchase | 15% | Purchase | Standard input |
| VAT Reverse Charge | 15% | Purchase | Imports of services from outside KSA |
<record id="account_tax_sa_15_sale" model="account.tax">
<field name="name">VAT 15% Sales</field>
<field name="amount">15</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="l10n_sa_zatca_tax_category">S</field>
<field name="invoice_repartition_line_ids" eval="[
(0,0,{'factor_percent': 100, 'repartition_type': 'base'}),
(0,0,{'factor_percent': 100, 'repartition_type': 'tax', 'account_id': ref('vat_payable_account')})
]"/>
</record>
The l10n_sa_zatca_tax_category field maps to ZATCA's UN/EDIFACT tax category codes (S=standard, Z=zero-rated, E=exempt, O=out-of-scope).
ZATCA Phase 2 Integration
The Phase 2 onboarding process in Odoo:
- Generate CSR: From Odoo's
l10n_sa_edisettings, generate a Certificate Signing Request with company details - OTP from Fatoora portal: Log into ZATCA's Fatoora portal, generate a one-time password, enter into Odoo
- Compliance CSID: Odoo exchanges the CSR + OTP for a Compliance CSID (sandbox certificate)
- Compliance simulation: Send 6 sample invoices (3 standard, 3 simplified, plus credit/debit notes) through the compliance API
- Production CSID: After successful compliance, request the production CSID
- Live operation: Standard invoices route through the Clearance API (real-time clearance before customer delivery); simplified invoices through the Reporting API (within 24 hours)
Each invoice cryptographically references the previous one through the PIH (Previous Invoice Hash), creating a tamper-evident chain. The ICV is a sequential counter incremented per invoice.
The QR code embedded in invoices contains TLV-encoded fields: seller name, VAT number, timestamp, total with VAT, VAT amount, hash, signature, and public key.
Bilingual Invoice Requirements
ZATCA requires Arabic on the invoice. Common patterns:
- Field labels in both Arabic and English
- Item descriptions in Arabic (with optional English alongside)
- Numerical values in standard Arabic-Indic or Western digits
Odoo invoice templates can be customized via QWeb to render dual-language layouts. Right-to-left (RTL) page layout for Arabic-primary invoices needs CSS adjustments.
Withholding Tax
Saudi Arabia applies WHT on payments to non-residents:
| Payment Type | Rate |
|---|---|
| Royalties | 15% |
| Management/Technical/Consulting fees | 5%-15% |
| Dividends | 5% |
| Interest (loans) | 5% |
| Insurance/reinsurance premiums | 5% |
| Telecommunications | 5% |
Configure WHT taxes in Odoo as purchase taxes negatively impacting the payable. Monthly WHT returns are filed via the ERAD portal.
Payroll Considerations
Saudi payroll components:
| Item | Saudi National | Non-Saudi | Notes |
|---|---|---|---|
| GOSI Pension | 9% (employee) + 9% (employer) | N/A | Saudi nationals only |
| GOSI Occupational Hazards | N/A | 2% (employer) | All employees |
| GOSI SANED (unemployment insurance) | 0.75% (employee) + 0.75% (employer) | N/A | Saudi nationals |
| Housing Allowance | N/A | N/A | Common practice; 25% of basic salary typical |
| Income Tax | None | None | No personal income tax in Saudi Arabia |
Wages Protection System (WPS) compliance is mandatory — employee salaries must be paid through SAMA-licensed banks with payroll files matching MOL records.
Reporting Requirements
A Saudi Odoo deployment must produce:
- VAT Return: Monthly (annual turnover > SAR 40M) or quarterly (otherwise)
- VAT Audit File (FAF): ZATCA-prescribed XML extract on demand
- Zakat Return: Annual, filed via ZATCA online portal
- Withholding Tax Return: Monthly, via ERAD portal
- GOSI Wage File: Monthly, via GOSI online
- Country-by-Country Report: For multinationals meeting threshold
Implementation Checklist
- Confirm VAT registration, CR number, and Fatoora portal access
- Install
l10n_saandl10n_sa_edi; configure TRN, CR, structured address - Generate CSR from Odoo, obtain OTP from Fatoora portal
- Run Phase 2 compliance simulation with 6 sample invoices
- Obtain production CSID; configure live clearance/reporting endpoints
- Configure VAT 15% and special-rate taxes; map to ZATCA categories
- Customize bilingual (Arabic + English) invoice layouts
- Set up GOSI-compliant payroll for Saudi and non-Saudi employees
- Build VAT return report aligned to ZATCA template
- Schedule monthly VAT and WHT filings; annual Zakat
Common Pitfalls
CSID expiry not monitored: CSIDs have validity periods. Expired CSIDs cause clearance failures and invoice backlog.
Address fields combined: ZATCA requires structured address (building number, street, district, city, postal code). Free-text address blocks fail XML validation.
Standard vs simplified misclassification: B2B invoices must be cleared (real-time); B2C simplified invoices reported within 24 hours. Routing all to clearance overwhelms the seller's API quota.
Missing PIH chain integrity: If the previous invoice hash is broken (e.g., manual data manipulation in DB), all subsequent invoices fail validation. Treat the e-invoice tables as append-only.
Arabic font rendering: PDF/A-3 outputs without proper Arabic font embedding produce illegible exports. Use embedded fonts in the Odoo PDF generation pipeline.
ECOSIRE delivers Odoo localization for Saudi Arabia, including ZATCA Phase 2 integration, bilingual invoice templates, and GOSI payroll. Contact us for implementation or explore our Odoo customization services.
Frequently Asked Questions
Does Odoo Community support ZATCA Phase 2?
Native ZATCA Phase 2 (l10n_sa_edi) is in Odoo Enterprise. Community deployments require either upgrading to Enterprise or building a custom Phase 2 connector. Given the cryptographic complexity (XAdES signing, CSID management, hash chaining), most clients choose Enterprise — the cost of Enterprise is far below the cost of building and maintaining a compliant Phase 2 module from scratch.
What happens if a B2B invoice fails clearance?
If the Clearance API returns a rejection (validation errors, signature issues, etc.), the seller cannot legally issue the invoice to the buyer. Odoo's l10n_sa_edi puts such invoices in an error state with detailed error codes from ZATCA. The seller must fix the issue (correct data, regenerate signature, retry submission) before delivery.
Are simplified invoices (B2C) issued in real-time?
No, simplified invoices are reported within 24 hours of issuance. The seller can issue and deliver the invoice immediately (with QR code), and the reporting to ZATCA happens asynchronously. Most retail/POS scenarios use simplified invoices to avoid latency at checkout.
Can we issue credit notes through ZATCA?
Yes. Credit notes (and debit notes) are issued through the same Phase 2 flow as their invoice type (clearance for B2B-equivalent, reporting for B2C). They must reference the original invoice's UUID and ICV. The amount adjustments propagate through the next VAT return.
How do we handle Zakat calculation in Odoo?
Zakat is computed annually on the zakatable base (typically equity-related items: capital, retained earnings, certain provisions, less long-term investments and fixed assets). Odoo doesn't compute Zakat automatically — standard practice is a year-end worksheet pulling balance sheet figures from Odoo trial balance, applying SOCPA/ZATCA Zakat rules, and posting a manual provision journal. The Zakat return is filed via ZATCA's portal.
تحریر
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
Odoo ERP کے ساتھ اپنے کاروبار کو تبدیل کریں
آپ کے کاموں کو ہموار کرنے کے لیے ماہر Odoo کا نفاذ، حسب ضرورت، اور معاونت۔
متعلقہ مضامین
How to Add a Custom Button to an Odoo Form View (2026)
Add custom action buttons to Odoo 19 form views: Python action method, view inheritance, conditional visibility, confirmation dialogs. Production-tested.
How to Add a Custom Field in Odoo Without Studio (2026)
Add custom fields via custom module in Odoo 19: model inheritance, view extension, computed fields, store/non-store decisions. Code-first, version-controlled.
How to Add a Custom Report in Odoo Using External Layout
Build a branded PDF report in Odoo 19 using web.external_layout: QWeb template, paperformat, action binding. With print logo + footer overrides.