kerneltics

Blog

ZATCA e-invoicing on Odoo: what integration actually involves, and where it goes wrong

Odoo · ZATCA · الفوترة الإلكترونية

You run Odoo and ZATCA has told you that you are in an integration wave. Here is what the two phases are, why B2B and B2C invoices follow different paths, what really happens inside Odoo when you connect it to the Fatoora platform, and the mistakes we keep fixing for other people.

The message usually arrives as a screenshot: a notice from the Zakat, Tax and Customs Authority saying the company is in a wave of the "integration phase", followed by one question. "We are on Odoo. What do we actually have to do, and can we do it ourselves?"

Short answer: yes, and the module that does it is maintained by Odoo itself. But "integration" is not a button. It is data preparation, a formal onboarding with the authority's platform, and a change in how your accounting team works. This is the walk-through we give every client, and what we end up repairing when someone did it in a hurry.

The two phases, and why the difference matters

E-invoicing in Saudi Arabia (ZATCA calls it Fatoora) means your invoices come out of a compliant electronic system rather than paper, Word or a spreadsheet. In the second phase they also go to the authority.

Phase 1, generation (from 4 December 2021)

Invoices have to be generated and stored electronically, carry the required fields including a QR code, and handwritten invoices stop. There is no connection to ZATCA yet. Most businesses on Odoo passed this phase without noticing.

Phase 2, integration (from 1 January 2023, in waves)

This is the real work. Your system has to connect to ZATCA's platform, produce invoices in a specific XML format, and add technical fields that were not required before. ZATCA runs it in waves, each defined by your VAT-taxable revenue in certain years, and states on its roll-out phases page that it notifies each wave at least six months before the integration date.

For scale: Wave 25, announced in July 2026, covers every business whose VAT-taxable revenue exceeded SAR 187,500 in any of 2022, 2023, 2024 or 2025, with a deadline of 1 February 2027. The threshold drops with each wave. If your reasoning is "we are small, it will not reach us", check the ZATCA site rather than waiting for the letter.

Tax invoice or simplified invoice? This split changes everything

ZATCA distinguishes two kinds of invoice, and each is integrated differently.

Tax invoices (business to business): clearance before the customer sees it

An invoice you issue to another company goes to ZATCA first. The authority validates it, applies its cryptographic stamp and returns it, and only then do you hand it to the customer. This is called clearance and it happens in real time. A tax invoice that was not cleared is not a valid invoice.

Simplified invoices (business to consumer): report within 24 hours

An invoice printed at the till or sent from your online shop does not wait for ZATCA. Your system stamps it, the customer gets it immediately, and your system reports it to the authority within 24 hours of issue. This is called reporting. Both models are described in ZATCA's detailed e-invoicing guideline.

What "integration" actually means inside Odoo

The modules

Odoo's Saudi localization is three modules: Saudi Arabia - Accounting (chart of accounts and taxes), Saudi Arabia - E-invoicing (the ZATCA connection) and Saudi Arabia - Point of Sale. All three are documented on Odoo's Saudi Arabia localization page.

For anyone weighing editions: the e-invoicing module, l10n_sa_edi, lives in Odoo's open-source repository under the LGPL licence, so it is part of the free Community edition. What you pay for in Enterprise is the fuller accounting application around it, not the ZATCA connection.

Your company data has to be complete, to the letter

ZATCA requires the company name (capped at 63 characters), the full national address with building number and plot identification (four digits each), a commercial registration number, the VAT number, and SAR as the currency. Odoo checks these before sending and stops the invoice if the building number, neighbourhood, region or VAT number is missing. An address that just says "Riyadh" does not pass.

Journals and the OTP from the Fatoora portal

Each sales journal in Odoo gets a serial number in its ZATCA tab. You click "Onboard Journal" and enter a one-time code from the Fatoora portal under your ZATCA account. The code expires after one hour, so have the journal ready first. This step issues the certificate that lets your system stamp invoices and tells ZATCA that this system belongs to you.

Simulation first, and production is one way

In Simulation mode you connect to ZATCA's simulation portal and run real invoices through it without them counting. Odoo's documentation is blunt: switching to Production is irreversible, and any invoice sent to the real Fatoora portal is accounted for. Do not switch until a tax invoice, a simplified invoice and a credit note have all gone through Simulation and come back accepted.

What happens when you confirm an invoice

Once integrated, confirming an invoice offers to send it to ZATCA right away, and anything you did not send goes out automatically at the end of the day. An invoice ZATCA rejected can be reset to draft and corrected. An invoice ZATCA accepted cannot be edited in any way; the only fix is a credit note and a new invoice. That is not an Odoo limitation. It is a ZATCA rule.

Things the system will not let you do after integration

ZATCA lists functions an e-invoicing system must not have once the integration phase starts. This is what changes for your team:

  • No editing or deleting an issued invoice. Cancelling means a linked credit note, then a new invoice.
  • No resetting the counter. Every invoice has a sequence number that never goes backwards.
  • Every invoice is chained to the previous one through its hash, so nothing can be slipped in between or reordered.
  • No changing the date or time in a way that puts false information on the invoice.
  • No anonymous access, and every action on invoices is logged.
  • No exporting the system's stamping key.

If a vendor says their system "quietly lets you edit after clearance", that alone is a reason to walk away.

The mistakes we fix most often

  • Going straight to production. Without a simulation run, the first rejected invoice is a real problem instead of a test.
  • Incomplete customer records. For a tax invoice to a Saudi company, Odoo requires the customer's building number and neighbourhood, not just a name and a VAT number. Clean the customer list before your wave.
  • Zero-rated tax with no reason. Any zero-percent tax in Odoo needs an exemption reason code, or the invoice does not go through.
  • The old habit of "reset to draft and fix". After integration it becomes a credit note and a new invoice, and the team has to be retrained on that.
  • Forgetting the tills and the branches. Simplified invoices have 24 hours. A branch offline for two days is not a technical issue, it is a breach.
  • Old customisations on the invoice. A change made to the invoice template two years ago can break the XML that goes to ZATCA. Review customisations first.
  • Rejected invoices nobody looks at. A rejection does not crash anything; it sits quietly in a list. Someone has to check it daily for the first few weeks.

A readiness checklist before your wave date

  • You know your wave and its date from the ZATCA site, not from hearsay.
  • Your company details in Odoo match your commercial registration, national address and VAT certificate.
  • Your company customers have a VAT number and a national address with building number and neighbourhood on file.
  • Every zero-rated tax has an exemption reason.
  • You have run a tax invoice, a simplified invoice from the till and a credit note through Simulation.
  • The team knows an accepted invoice cannot be edited, and knows what to do instead.
  • One named person checks rejected invoices every day.

The short version

Connecting Odoo to ZATCA is proven and the module is free. The real work is the cleanliness of your data and whether your team understands the new way of working. If you are still deciding whether Odoo is the right system at all, read our post on Odoo versus a custom system or our Odoo services page.

If the wave notice has landed and you want someone to look at your Odoo and tell you exactly what is missing, book a free 30-minute session and you will leave with a clear list.