Odoo ZATCA Phase 2 E-Invoicing: Setup Guide

ERPSeptember 24, 20267 min read

Phase 2 of Saudi e-invoicing — the integration phase — means your invoicing system must talk to ZATCA's Fatoora platform directly: invoices are generated as structured XML, cryptographically stamped, and either cleared by ZATCA before you send them or reported to it within 24 hours. Odoo does this natively. This guide covers what the rules require, the Odoo module and settings involved, the onboarding steps, and how to read the errors when an invoice is refused. Facts about ZATCA are as of September 2026.

Short answer: install Odoo's Saudi localization with the Saudi Arabia - E-invoicing module, complete every ZATCA field on your company record (address with district and building number, VAT number, CR number), then onboard each sales journal with a 6-digit OTP from the Fatoora portal — first in Sandbox, then Simulation, then Production. Confirm an invoice, click Process now, and check that the response is 200 – Action Successful.

Does my business have to comply, and by when?

Phase 1 (generating and storing invoices electronically) has applied since 4 December 2021. Phase 2 started on 1 January 2023 and is being rolled out in waves; ZATCA says it notifies each wave at least six months before its integration date (roll-out phases).

WaveWho is includedIntegration deadline
Wave 24VAT-able revenue above SAR 375,000 in 2022, 2023 or 202430 June 2026
Wave 25VAT-able revenue above SAR 187,500 in 2022, 2023, 2024 or 20251 February 2027

Wave 25 was announced on 24 July 2026 (ZATCA announcement). The wave you belong to is in the notification ZATCA sends you, so check that first rather than relying on thresholds alone.

What Phase 2 actually requires

ZATCA's detailed e-invoicing guideline sets two flows:

Standard tax invoiceSimplified tax invoice
Typical useB2B — the buyer is VAT-registeredB2C — retail and walk-in customers
ZATCA modelClearance: ZATCA must clear the invoice before you share itReporting: share it immediately, report it within 24 hours
FormatXML, or PDF/A-3 with the XML embeddedXML sent to Fatoora; a QR code on the printed invoice
Credit and debit notesFollow the same flow as the invoice they adjustSame

Your system also needs a cryptographic stamp identifier (CSID) issued through the Fatoora portal. In Odoo this is what the journal onboarding step obtains for you.

Which Odoo module handles ZATCA?

Odoo's Saudi Arabia localization documentation lists the modules:

ModuleTechnical namePurpose
Saudi Arabia - Accountingl10n_saChart of accounts, 15% VAT and Phase 1 QR code
Saudi Arabia - E-invoicingl10n_sa_ediZATCA Phase 2 API integration
Saudi Arabia - E-invoicing (Simplified)l10n_sa_edi_posE-invoicing from Point of Sale
Saudi Arabia - Point of Salel10n_sa_posCompliance fields on POS invoices

The e-invoicing module lives in Odoo's open-source repository under the LGPL-3 licence (it is present in the 16.0, 17.0 and 19.0 branches), so ZATCA integration is not an Enterprise-only feature.

Step 1: complete the company record

ZATCA rejects onboarding and invoices when company data is incomplete. On the company record, fill in:

  • Company name — at most 63 characters.
  • Full address, including district, building number and plot identification.
  • Identification scheme and number (for example the Commercial Registration Number).
  • VAT number, and currency set to SAR.

Branches use the parent's VAT number with the branch CR number in the identification scheme. Customer contacts need the same care: a B2B invoice to a customer with no VAT number or address is a common rejection.

Two more rules from Odoo's documentation: invoices must be in Arabic (bilingual is allowed — enable the Gulf Cooperation Council Format option in the accounting settings), and a line carrying a global discount must have the 15% tax applied.

Step 2: onboard each sales journal

Onboarding happens per journal, in three modes you move through in order:

ModeWhat it is forWhere the OTP comes from
SandboxShared test environment; use VAT number 399999999900003Pre-filled by Odoo
Simulation (Pre-Production)Your own test on a duplicate of your database; invoices are not legally validFatoora Simulation portal
ProductionLive invoicingFatoora portal, production environment

For each mode: set ZATCA API mode under Accounting → Configuration → Settings, open the sales journal, go to the ZATCA tab, click Onboard and enter the OTP.

OTPs expire after 60 minutes. And once the API mode is Production and an invoice has been submitted, the database cannot go back to Sandbox or Simulation — test in a duplicate first. Each sales journal is onboarded separately, and a journal you stop using should have its CSID revoked in the Fatoora portal.

Step 3: submit and read ZATCA's response

Confirm an invoice, click Process now on the blue banner, and read the response in the chatter:

CodeMeaningWhat to do
200AcceptedNothing
202Accepted with warningsFix the cause now — warnings may become rejections later
400RejectedRead the rule in the message, correct the data, resubmit
401UnauthorizedCheck the certificate and credentials (re-onboard if needed)
429, 500, 503, 504Not receivedResend

A typical rejection reads BR-KSA-F-13 … Please recheck Other Seller/Buyer ID: the identification number on the customer or company is wrong or missing.

Get Odoo set up with ZATCA by TECFY

Online store orders: Salla and Zid

If you sell on Salla or Zid, the invoices created from store orders must go to ZATCA too. With the TECFY Odoo Connector for Salla or for Zid, the split is simple: Odoo signs and submits, the connector asks Odoo to submit each invoice it posts and each credit note it creates for a cancellation or return. Automatic submission needs Odoo 19.3 or later and the Automatically Send Invoices to ZATCA switch (how it works). The connector re-reads pending statuses every hour and lists anything not accepted on dedicated error screens.

Two connector-side causes to know: a credit note is rejected if its ZATCA return reason is not configured, and ZATCA will not accept a credit note against an invoice it never accepted (credit note errors).

Checklist before go-live

  1. Your wave and deadline confirmed from ZATCA's notification.
  2. Saudi localization and l10n_sa_edi installed; POS module too if you sell in store.
  3. Company, branch and customer records complete.
  4. Arabic invoice layout enabled.
  5. Every sales journal onboarded in Sandbox, then Simulation on a duplicate database.
  6. A test batch covering a B2B invoice, a B2C invoice and a credit note — all returning 200.
  7. Production onboarding done during a quiet period, with someone watching the first day's responses.

Getting it done

TECFY is a certified Odoo Silver Partner. Our Odoo implementation package is 3,999 SAR and includes configuration of your chart of accounts and inventory, three training sessions and a year of support; if your Odoo is already running, the Odoo support team can take on ZATCA configuration and rejection fixes. TECFY is a software company, not an accounting firm — VAT treatment decisions stay with your accountant.

Budgeting the whole project? Read Odoo implementation prices in Saudi Arabia and which Odoo hosting to choose.

Frequently asked questions

Does Odoo support ZATCA Phase 2?

Yes. Odoo's Saudi localization includes the Saudi Arabia - E-invoicing module (l10n_sa_edi), which integrates with ZATCA's Fatoora platform through its API. It ships in the Odoo source under the LGPL-3 licence, so it is available in Community as well as Enterprise.

Do I need Odoo Enterprise for ZATCA e-invoicing?

No. The ZATCA module is part of Odoo's open-source code, so Community databases can use it too. Enterprise adds hosting on Odoo Online, the upgrade service and Odoo's own support, which matter more over time than the module itself.

When does my business have to integrate with ZATCA?

ZATCA selects taxpayers in waves and notifies each wave at least six months before its integration date. Wave 25, announced on 24 July 2026, covers taxpayers whose VAT-able revenue exceeded SAR 187,500 in 2022, 2023, 2024 or 2025, with a deadline of 1 February 2027.

What is the difference between clearance and reporting?

Standard tax invoices (usually B2B) must be cleared by ZATCA before you share them with the buyer. Simplified tax invoices (usually B2C) are shared first and reported to Fatoora in XML within 24 hours of being generated.

Why does ZATCA reject my Odoo invoices?

Most rejections come from incomplete data: missing company or customer address fields, VAT or identification numbers, or tax details. Odoo shows ZATCA's response code and message in the invoice chatter; correct the data in Odoo and resubmit.

Can Salla or Zid orders be submitted to ZATCA automatically?

Yes, through Odoo. With the TECFY Odoo Connector on Odoo 19.3 or later and automatic submission switched on, every invoice and credit note the connector creates in Odoo is submitted to ZATCA using Odoo's own ZATCA setup.

Ready to get started with TECFY?

Get in touch

Related articles

↑↓to navigate
Need help?