Odoo ZATCA Phase 2 E-Invoicing: Setup Guide
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).
| Wave | Who is included | Integration deadline |
|---|---|---|
| Wave 24 | VAT-able revenue above SAR 375,000 in 2022, 2023 or 2024 | 30 June 2026 |
| Wave 25 | VAT-able revenue above SAR 187,500 in 2022, 2023, 2024 or 2025 | 1 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 invoice | Simplified tax invoice | |
|---|---|---|
| Typical use | B2B — the buyer is VAT-registered | B2C — retail and walk-in customers |
| ZATCA model | Clearance: ZATCA must clear the invoice before you share it | Reporting: share it immediately, report it within 24 hours |
| Format | XML, or PDF/A-3 with the XML embedded | XML sent to Fatoora; a QR code on the printed invoice |
| Credit and debit notes | Follow the same flow as the invoice they adjust | Same |
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:
| Module | Technical name | Purpose |
|---|---|---|
| Saudi Arabia - Accounting | l10n_sa | Chart of accounts, 15% VAT and Phase 1 QR code |
| Saudi Arabia - E-invoicing | l10n_sa_edi | ZATCA Phase 2 API integration |
| Saudi Arabia - E-invoicing (Simplified) | l10n_sa_edi_pos | E-invoicing from Point of Sale |
| Saudi Arabia - Point of Sale | l10n_sa_pos | Compliance 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:
| Mode | What it is for | Where the OTP comes from |
|---|---|---|
| Sandbox | Shared test environment; use VAT number 399999999900003 | Pre-filled by Odoo |
| Simulation (Pre-Production) | Your own test on a duplicate of your database; invoices are not legally valid | Fatoora Simulation portal |
| Production | Live invoicing | Fatoora 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:
| Code | Meaning | What to do |
|---|---|---|
| 200 | Accepted | Nothing |
| 202 | Accepted with warnings | Fix the cause now — warnings may become rejections later |
| 400 | Rejected | Read the rule in the message, correct the data, resubmit |
| 401 | Unauthorized | Check the certificate and credentials (re-onboard if needed) |
| 429, 500, 503, 504 | Not received | Resend |
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.
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
- Your wave and deadline confirmed from ZATCA's notification.
- Saudi localization and
l10n_sa_ediinstalled; POS module too if you sell in store. - Company, branch and customer records complete.
- Arabic invoice layout enabled.
- Every sales journal onboarded in Sandbox, then Simulation on a duplicate database.
- A test batch covering a B2B invoice, a B2C invoice and a credit note — all returning 200.
- 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 touchRelated articles
Odoo ERP Cost in Saudi Arabia: A Practical 2026 Breakdown
What Odoo ERP really costs in Saudi Arabia — licences, implementation, ZATCA e-invoicing, training and support — plus a cost table and a simple way to estimate your total.
ERPOdoo Implementation Prices in Saudi Arabia (2026)
What Odoo costs in Saudi Arabia in 2026: Odoo's official plans, TECFY's 3,999 SAR implementation package line by line, and the items that add cost.
ERPOdoo Online vs Odoo.sh vs On-Premise
Odoo Online, Odoo.sh or your own server? Compare custom modules, plans, upgrades, hosting costs and store connectors, and choose the right Odoo hosting.