Skip to content

Back to Blogengineering6 min read

Odoo and ZATCA Phase 2: E-Invoicing Compliance for Saudi Businesses

Wave 24 closed in June 2026 and Wave 25 pulls in every business above SAR 187,500. Here is how ZATCA Phase 2 works, what Odoo does natively, and the setup steps that trip most companies up.

Mazen Salah

Odoo and ZATCA Phase 2: E-Invoicing Compliance for Saudi Businesses

Saudi Arabia's e-invoicing programme is no longer something only large companies worry about. ZATCA's Phase 2 integration waves have been working down the revenue ladder since 2023: Wave 24 covered every VAT-registered business with revenue above SAR 375,000 and had to be integrated by 30 June 2026, and the Wave 25 criteria published in July 2026 halve that threshold to SAR 187,500, with an integration deadline of 1 February 2027. If your company invoices at all, you are either already in scope or about to be.

Odoo handles ZATCA natively, but "natively" hides a list of configuration steps, certificates and layout rules that decide whether your invoices clear or bounce. This guide walks through the programme, what Odoo does out of the box, and where the work actually is.

Phase 1 vs Phase 2 in one minute

  • Phase 1 (Generation), live since December 2021, required invoices to be generated electronically with mandatory fields and a QR code on simplified (B2C) invoices. No connection to ZATCA.
  • Phase 2 (Integration) connects your invoicing system to ZATCA's Fatoora platform. Standard (B2B) tax invoices must be sent for clearance before they are shared with the customer; simplified (B2C) invoices are reported within 24 hours. Invoices are XML (UBL 2.1) with a cryptographic stamp, a hash chain and a UUID, and ZATCA stamps cleared B2B invoices with its own signature.

Phase 2 is rolled out in waves. ZATCA announces each wave's criteria at least six months before its integration date and notifies the taxpayers it targets.

What Odoo provides out of the box

Odoo Enterprise ships an official Saudi localisation in three modules:

  • l10n_sa — the Saudi chart of accounts, VAT taxes and fiscal positions.
  • l10n_sa_edi — Phase 2 e-invoicing: XML generation, signing, the hash chain, clearance and reporting calls to Fatoora, and storage of the returned status, UUID and QR code on each invoice.
  • l10n_sa_edi_pos — the same for simplified invoices coming from Odoo Point of Sale.

With these installed and configured, Odoo submits B2B invoices for clearance when you confirm them, reports B2C invoices in the background, prints the mandatory QR on PDFs and blocks invoices that fail validation. Credit and debit notes follow the same path with the required reason codes.

Community edition does not include these modules. Companies on Community either upgrade to Enterprise for invoicing or rely on third-party ZATCA connectors, which we generally advise against for anything beyond a very small operation — the official module tracks ZATCA's changes; a marketplace add-on may not.

The setup that actually takes the time

1. Company and fiscal data

Legal name in Arabic and English, VAT number, commercial registration, full national address including building number and additional number. ZATCA validates these against its records; a mismatch is the most common reason a compliance check fails.

2. Onboarding certificates

Each invoicing device or system needs a compliance CSID and then a production CSID. In Odoo this is done per journal: you generate an OTP in the Fatoora portal, enter it in the journal's ZATCA settings, and Odoo requests the certificate. Compliance mode requires submitting sample standard and simplified invoices, credit notes and debit notes before ZATCA issues production credentials. Plan a day with someone who has portal access.

3. Journals and invoice types

Separate sales journals for B2B (standard) and B2C (simplified) keep clearance and reporting flows clean, and POS orders need their own journal linked to the POS module. Each journal has its own certificate chain.

4. Taxes and edge cases

Zero-rated exports, exempt supplies, out-of-scope items, prepayments and self-billed invoices all need correct tax codes and, in some cases, the right VAT category codes in the XML. This is where accountants and implementers must sit together.

5. Layouts

The printed invoice must be bilingual for many customers, show the QR, and carry the ZATCA-required fields. Odoo's default Saudi layout covers the mandatory items; most companies customise it for branding. Keep the QR untouched.

6. Testing in the sandbox

ZATCA provides a sandbox and Odoo supports a testing mode. Run every invoice type you issue — including refunds against cleared invoices — before switching to production. A rejected invoice in production is a support ticket; in the sandbox it is a Tuesday.

Common failure modes we fix

  • Hash-chain breaks after someone deletes or edits a submitted invoice outside the normal flow.
  • Clock drift on self-hosted servers causing signature timestamps to be rejected.
  • Address mismatches between the Fatoora registration and the Odoo company record.
  • Custom invoice layouts that moved or shrank the QR below readable size.
  • Upgrades from Odoo 15 or 16 where the localisation modules changed shape.

Most of these are discovered in the first week after go-live. A short hypercare period with the implementer on call avoids the scramble.

If you are on Wave 25

Your integration deadline is 1 February 2027. Working backwards: leave a month for hypercare, a month for testing, and a month for configuration and certificates. That means starting no later than October 2026 if you are already on Odoo, and earlier if you are migrating from another system at the same time. Combining the migration and the ZATCA integration in one project is efficient, but only if the scope is fixed.

Key takeaways

  • Phase 2 is rolling down the revenue ladder; Wave 25's SAR 187,500 threshold puts most active Saudi businesses in scope by February 2027.
  • Odoo Enterprise handles ZATCA clearance and reporting natively through the official l10n_sa_edi modules.
  • The effort is in company data, certificates per journal, tax edge cases and layouts — not in the code.
  • Test every invoice type in the sandbox and keep an implementer on call for the first weeks.

SummationWorks configures and supports ZATCA-compliant Odoo for Saudi companies, from certificates to custom invoice layouts. See our Odoo and ERP services, estimate your project with the Odoo implementation cost guide, or get in touch before your wave's deadline.

About the author

Mazen Salah

Founder & Lead Engineer

Mazen Salah founded SummationWorks in 2019 to help startups and growing businesses ship real software. He leads engineering across the company's web, mobile, and AI work, building products with Next.js, Flutter, Laravel, and Node.

More about us

Have a project in mind?

Let's turn your idea into production-grade software.