Migrating to Odoo from Excel in Saudi Arabia: A ZATCA-Ready Plan

Moving from Excel, paper or old software to Odoo in Saudi Arabia? Plan around your ZATCA Phase 2 wave, cut over at the start of a VAT period, archive records in Arabic inside the Kingdom and rehearse in ZATCA Simulation first.

Published 2026-10-11 · METCH

Start from your ZATCA dates: Phase 2 wave and VAT period

Saudi companies usually come to Odoo from Excel spreadsheets kept by the accountant, paper books and receipt pads, or an older accounting package. One caution for VAT-registered businesses: ZATCA has banned handwritten invoices since 4 December 2021, and once your Phase 2 date has passed every invoice must be generated as XML and cleared or reported through Fatoora, which a spreadsheet or receipt pad cannot do. If you still invoice that way, move invoicing into Odoo first.

Phase 2 is no longer a future step for most businesses. ZATCA's Wave 24 deadline, for VAT-able revenue above SAR 375,000 in 2022, 2023 or 2024, passed on 30 June 2026. Wave 25 (above SAR 187,500 in any year from 2022 to 2025) must integrate with Fatoora by 1 February 2027. If your deadline has passed, the first invoice Odoo issues after the cut-off must go through Fatoora; if not, rehearse the whole migration once before it.

Set the cut-off on the first day of a VAT period. Odoo advises against switching mid-period, because the return would then combine figures from two systems. ZATCA's guideline sets monthly periods where annual revenue exceeds SAR 40,000,000, quarterly otherwise. A Wave 25 business filing for calendar quarters could go live on 1 January 2027, a month before its deadline and, with a calendar fiscal year, at the year end Odoo calls easiest.

If your fiscal year is Hijri, its Gregorian dates move each year, so enable Fiscal Years in Accounting settings and define each year's start and end.

What moves into Odoo, and what to archive in Arabic inside the Kingdom

Odoo's accounting guide covers master data and opening positions only, not years of transactions. Bring in these, each with its Saudi detail:

  • Chart of accounts, with standard Saudi accounts renamed or recoded, never deleted
  • Customers and suppliers, with VAT number, identification number and national address
  • Products, each with the right sales tax
  • The opening trial balance at the cut-off date
  • Open invoices and bills at the amount still due, noting which invoices were already cleared or reported to ZATCA
  • Stock from a physical count, plus bank and cash balances

Archive the full history instead. ZATCA's Guideline for Tax Invoicing and Records says VAT records must be kept for at least 6 years from the end of the related tax period, longer for capital assets and 15 years for real estate, in Arabic, and that residents must keep electronic records on a computer or server inside the Kingdom. It adds that the Commercial Books Law applies as well, requiring merchants to keep books, correspondence and documents for at least 10 years. Before switching the old system off, export the general ledger, trial balances, VAT returns and invoice copies for at least the last 10 years, and 15 for real estate records.

Weigh the residency rule when choosing hosting too. Odoo Online uses the hosting region closest to you; the Middle East & Southern Asia region runs production in India and Saudi Arabia, but its backups replicate in Europe and Canada and their locations cannot be restricted. Review the options with your adviser.

Cleaning customer and product data for ZATCA fields

Fix old data in the spreadsheet, where it is cheapest. Saudi-specific checks:

  • VAT numbers: 15 digits, beginning and ending with 3. Use them, or the unified national number starting with 7, which the 2025 Commercial Register Law made the establishment's registration number, to catch the same Jeddah customer entered in Arabic and again in English; older sheets may hold the previous CR numbers. Merge before import.
  • Contacts: Odoo's Saudi documentation applies the company's ZATCA fields to contacts, so fill in the identification scheme, district, building number and Plot Identification, the national address's additional number.
  • Language: set each customer's Language, and enable the Gulf Cooperation Council Format in Accounting settings, and in Point of Sale settings for receipts, so every tax invoice also carries the Arabic ZATCA requires.
  • Taxes: set each product's sales tax to standard 15%, zero-rated (exports, qualifying medicines and medical equipment, investment metals of 99% purity) or exempt (residential rent, interest and other financial services). Confirm the mapping with your adviser.
  • Dates: convert Hijri dates to Gregorian YYYY-MM-DD; a Hijri year imported as it is becomes a date in the 1400s.

On each Odoo list, use Actions › Import records with Odoo's .xlsx or .csv template, then Test and Import. Keep your old codes in an External ID column, such as cust_JED_0042 for a branch-coded customer, so re-importing a corrected file updates records instead of duplicating them. Load categories before products. Imports cannot be undone, so run them first in the Simulation copy described below.

Opening balances: a worked SAR example for a Riyadh contractor

The quiet migration error is double counting: load the receivables balance and the open invoices behind it, and customers owe you twice. Odoo's fix is a clearing account. Take a hypothetical Riyadh contractor whose old books show SAR 1,240,000 receivable across 18 progress invoices, including SAR 160,000 of retention held by clients.

  • Opening trial balance: one entry through Odoo's Template for Misc. Operations, with the full SAR 1,240,000, retention account included, posted to AR Clearing instead of receivables.
  • Open items: each progress invoice's unpaid amount, and each retention balance as a separate item, one line each against AR Clearing, so retention can be tracked until released.
  • Result: receivables show SAR 1,240,000, AR Clearing nets to 0, and its type then changes to Off-Balance Sheet.

Before posting, run Odoo's four checks, shown here with the example's figures:

  • Receivables SAR 1,240,000 = open invoices 1,080,000 + retention 160,000 − credit notes 0
  • Payables SAR 410,000 = open bills 425,000 − refunds 15,000
  • Inventory accounts SAR 96,500 = cost × counted quantity, loaded with the Template for Inventory Adjustments
  • Trial balance: total debits equal total credits

Open items carry no tax lines, so the 15% VAT accounts are not hit again. Odoo's Saudi documentation says VAT is commonly charged on the full invoice amount even when the client holds retention, so that VAT would normally sit in the old system's returns already. The treatment depends on the contract, so confirm retention with your tax adviser.

Rehearse in ZATCA Simulation, then go live in Production

Odoo recommends practising the transition in a test database, and its Saudi documentation describes the ZATCA rehearsal: duplicate your live database, set the ZATCA API mode to Simulation (Pre-Production) in Accounting settings, and onboard each sales journal with an OTP from the Fatoora Simulation Portal. In that copy:

  • Run every import and post the opening entries.
  • Confirm a few B2B and B2C invoices, including one for a business customer with an incomplete address to see how the error is flagged, and read ZATCA's reply in the chatter: green accepted, yellow accepted with warnings, red rejected.
  • Confirm the imported open invoices. An invoice confirmed in an onboarded sales journal is queued for ZATCA like a new one, so agree with your partner which journal they go into.

Then onboard the live database in Production close to go-live. Once an invoice is submitted there, you cannot return to Sandbox or Simulation, the only modes where a submitted invoice can be reset to draft.

Our rule of thumb for the overlap: keep entering transactions in the old books, without issuing invoices from them, until a period closes with matching trial balance and VAT figures. Train cashiers to scan the QR code on receipts with ZATCA's app, and accountants to fix warnings, which may later become rejections.

Book a free consultation with METCH, an official Odoo partner based in Riyadh: our team will check your ZATCA Phase 2 readiness, help choose the cut-off date and map out the Simulation rehearsal.

Frequently asked questions

Do we have to keep the old system running for years, or is an export enough?

An export can be enough if it keeps what the rules require. ZATCA's guideline requires VAT records for at least 6 years from the end of the tax period, longer for capital assets and 15 years for real estate, in Arabic and inside the Kingdom; the Commercial Books Law requires books, correspondence and documents for at least 10 years. Export ledgers, trial balances, VAT returns, invoices and any e-invoice XML files to a server in the Kingdom, and agree the format with your tax adviser.

Do we have to send our old invoices to ZATCA again when we move to Odoo?

No. Those invoices were issued by your old system, and if it was integrated with Fatoora they were already cleared or reported, so they are not issued again. In Odoo they come in only as accounting open items: one line per invoice with the amount still due, against a receivables clearing account, so you can collect them. Which journal they are confirmed in still matters, as the rehearsal step above explains. Confirm the treatment with your tax adviser.

Should quarterly VAT filers run a full quarter in parallel?

Not necessarily. Odoo recommends working in parallel with your old workflow but sets no length. A full quarter lets you compare a complete VAT return from both systems, at the cost of entering every transaction twice for three months. A lighter option is one month-end close with matching trial balance, receivables, payables and VAT figures, then a line-by-line check of the first Odoo return before filing. Either way, issue invoices from one ZATCA-integrated system only, normally Odoo.

Do we need to onboard Odoo with ZATCA before the cut-off date?

Yes, if your Phase 2 date has passed, because the first invoice Odoo issues must go through Fatoora. In Odoo, each sales journal is onboarded separately with a one-time password from the Fatoora portal, valid for 60 minutes. Rehearse in Simulation on a duplicate database, then onboard the live database in Production close to go-live, since Production cannot be switched back once an invoice is submitted. If your date is still ahead, ZATCA says it informs later waves at least six months before their integration date.

Need help with this?

METCH is a certified Odoo partner in Saudi Arabia — book a free consultation.

Get a proposal