Odoo Sales Reports in Saudi Arabia: Matching POS, VAT and ZATCA Figures

With Odoo's Saudi POS module, every shop sale becomes an invoice for ZATCA. See which Odoo sales figure matches your invoices, how to tie sales to the VAT return, and what a Saudi owner's dashboard should track.

Published 2026-10-17 · METCH

Which Odoo sales figure ZATCA sees, and which is only orders

For the Odoo sales figure that matches what ZATCA receives, open Invoice Analysis, not Sales Analysis. Once the Saudi POS e-invoicing module (l10n_sa_edi_pos) is installed, as Odoo's Saudi documentation requires, Odoo invoices every POS order. Shop sales and B2B sales then sit in one report, built from the same invoices you clear or report to ZATCA. Elsewhere, POS orders are invoiced only on request.

Where each figure lives in Odoo 19 and 20:

  • Accounting (or Invoicing) > Reporting > Management > Invoice Analysis: posted customer invoices less credit notes. This is your turnover.
  • Sales > Reporting > Sales: Sales Analysis, built on quotations and sales orders, for bookings and what is not yet invoiced. Only Sales Administrators see this menu; in Odoo 20 every salesperson also gets a small dashboard above the Quotations and Orders lists, comparing a chosen period with the previous one; its sales amount includes VAT.
  • Point of Sale > Reporting > Orders, Sales Details and Session Report: shop sales by point of sale, cashier, product and session.
  • Website > Reporting > Online Sales: confirmed eCommerce orders by default, for Sales Administrators only. Abandoned carts: Website > eCommerce > Orders > Abandoned Carts in Odoo 19, or the Abandoned filter on eCommerce Orders in Odoo 20.

Watch the measure: Sales Analysis opens on Qty Ordered, not money, so switch the measure to Untaxed Total. An order of SAR 10,000 before VAT shows as SAR 11,500 under Total, and that SAR 1,500 is VAT you collect for ZATCA, not revenue.

POS in Saudi Arabia: every order invoiced, simplified or standard, one journal per branch

With l10n_sa_edi_pos, a Saudi company's POS invoices every order. A walk-in customer gets a simplified tax invoice, which must be reported to ZATCA within 24 hours. A sale to a customer set up as a company produces a standard tax invoice, which ZATCA clears before it reaches the buyer.

Reading shop sales:

  • Point of Sale > Reporting > Sales Details prints totals by product, tax and payment method for the dates and shops you choose; Session Report covers one session.
  • For trends, Point of Sale > Reporting > Orders opens POS Analysis. Group by Point of Sale and use the Subtotal w/o Tax measure; Total Price includes 15% VAT.
  • Grouping POS Analysis by Payment Method credits a split-payment order wholly to its first method; use Point of Sale > Orders > Payments instead.
  • With Sales and Point of Sale both installed, Odoo adds POS lines to Sales Analysis. Never add the POS report on top; to split them, set a Sales Team in each POS's settings and group by Sales Team.

For a Riyadh head office with shops in Jeddah and Dammam, create each branch in the Branches tab of the company form, with the parent's VAT number and the branch's own CR number. A branch can use the parent's sales journal or its own ZATCA-onboarded one. Give each shop's POS its own onboarded journal under Default Journals (Invoices in Odoo 19, Orders in Odoo 20), then group Invoice Analysis by Journal (Custom Group > Journal) to separate shop and B2B invoices, branch by branch.

How to tie Odoo sales to your Saudi VAT return

In the Kingdom, sales run from order to e-invoice to VAT return, and each link can move a number:

  • An order is not a tax event. Sales Analysis counts it on its Order Date, which Odoo resets when the order is confirmed; the return counts the invoice.
  • Posted is not accepted. Before you close a period, check that no invoice is still waiting for ZATCA clearance or reporting, or was rejected.
  • A credit note must reference the original invoice: Odoo's Saudi module will not send one without a ZATCA Reason and a link to the original invoice or its number in Customer Reference. Odoo posts it on its own date, so a March sale returned in April lowers April's figures, not March's.

To tie out a period, run Invoice Analysis with the Invoiced and Customers filters on the return's dates, grouped by Journal, with Untaxed Amount and Total as measures. On Enterprise, compare it with the Saudi VAT Return under Accounting > Accounting > Closing > Tax Returns, whose sales lines split standard-rated, zero-rated domestic, export and exempt sales. On Community, use the return filed on ZATCA's portal.

On every business customer, fill the VAT number and national address, including the Building Number field the Saudi module adds, the district (sent from the second street line) and the postal code: standard tax invoices carry the buyer's details.

Odoo 20 adds a Tax Incl. / Tax Excl. switch on orders and invoices, handy when you quote consumers VAT-inclusive prices; keep management reports untaxed.

Margins and ABC rankings by branch or project

Margins need a reliable product Cost. In Odoo 19, turn on Sales > Configuration > Settings > Pricing > Margins; in Odoo 20 the margin module installs automatically with Sales, so just show the optional Margin and Margin (%) columns on order lines. Either way, Sales Analysis gains a Margin measure, calculated on the untaxed line subtotal. Know which cost each report uses:

  • A sales order line stores the product cost when the product is added to the line. With FIFO or average costing on the product category, Odoo then updates it from the valuation of the stock actually delivered.
  • Invoice Analysis margin uses the product's current cost when you run the report. Picture a Jeddah building-materials distributor whose rebar cost rose this year: last year's invoice margins shrink in Invoice Analysis although nothing changed in those sales. For history, trust the order-line margin in Sales Analysis.
  • Odoo 20 lets salespeople edit the margin on an order line, recalculating the unit price, until the line is invoiced. In Odoo 19 the margin is read-only.

Odoo has no built-in ABC analysis. Group the pivot by Customer or Product, click the Untaxed Total header to sort, then download to Excel and add a cumulative-percentage column.

For branch margins, select the parent and its branches in the company switcher and group by Company. For cost centres that are not branches, such as contracting projects or facility-management contracts, use Analytic Distribution Models with a mandatory analytic plan, so no invoice slips through untagged.

The Saudi owner's scorecard and dashboard: VAT periods, shop vs B2B, ZATCA backlog

Seven measures cover most Saudi owners' questions:

  • Net sales: Invoice Analysis with the Invoiced and Customers filters, Untaxed Amount.
  • Margin %: Margin divided by Untaxed Total (Subtotal w/o Tax in POS); neither report sums a percentage.
  • Uninvoiced orders: Sales Analysis, Sales Orders filter, Untaxed Total minus Untaxed Amount Invoiced (the To Invoice filter skips undelivered goods billed on delivery).
  • Shop vs B2B: Invoice Analysis by Journal, with one invoice journal per POS.
  • ZATCA backlog, daily: customer invoices by Electronic invoicing status (optional column, Odoo 19) or ZATCA State (Odoo 20); chase To Send, rejected or failed ones.
  • Sales per VAT period: Invoice Analysis by month or quarter, as you file (monthly above SAR 40 million of annual taxable supplies).
  • Ramadan and Eid vs last year: Ramadan comes about 11 days earlier each year and Odoo's date filters are Gregorian, so save one custom filter covering both seasons as a Favorite, grouped by Year. Hijri months need a spreadsheet mapping or a custom module.

Community's Dashboards app has Sales, Product, eCommerce and Invoicing dashboards, plus Point of Sale with POS HR. The Sales one is for Sales Administrators; grant it to your sales group rather than promoting everyone. A Saudi build, say a copy of the Sales dashboard filtered by branch and VAT period, needs Odoo Spreadsheet (Enterprise).

Book a free consultation with METCH, an official Odoo Ready Partner based in Riyadh. Bring your latest VAT return and a POS session report, and we will trace both to Invoice Analysis.

Frequently asked questions

How do I give my accountant a monthly sales file that matches ZATCA and the VAT return?

Open Accounting > Reporting > Management > Invoice Analysis, apply the Invoiced and Customers filters and the month's dates, and switch to the pivot. Put Month and Journal in the rows, so simplified POS invoices and standard tax invoices sit apart if each POS has its own invoice journal. Select Untaxed Amount and Total as measures so the 15% VAT is visible, then download the .xlsx file and save the view as a Favorite. Credit notes appear as negative lines in the month they were issued.

Can I see sales per branch in Odoo when all branches share one VAT number?

Yes. Create each branch in the Branches tab of the company form, entering the parent's VAT number and the branch's own Commercial Registration Number. A branch can use the parent's sales journal or its own ZATCA-onboarded journal, with its own certificate and invoice chain. Select the parent and its branches in the company switcher, open Invoice Analysis and group by Company, or by Journal. The VAT return remains one return for the VAT number, so the branch totals should add up to its sales lines.

Where is the daily POS sales report in Odoo for a shop in Saudi Arabia?

For one day across several shops, Point of Sale > Reporting > Sales Details prints totals by product, tax and payment method for the dates and points of sale you choose. For one closed shift, use Session Report. For trends, Orders in the same menu opens POS Analysis: group by Point of Sale with the Subtotal w/o Tax measure. Avoid grouping it by Payment Method when customers split payments. Because the Saudi POS module invoices every order, the same sales also appear in Invoice Analysis.

Is Odoo accounting software approved by ZATCA?

ZATCA does not approve specific software. Its Solution Providers Directory lists providers that passed its qualification process, but ZATCA states the list is not an approval of their solutions and that any taxpayer meeting the requirements is compliant. Compliance comes from onboarding your own Odoo database with ZATCA; Odoo's Saudi modules handle Phase 2 clearance and reporting, including at the POS. Wave 25 (VAT-able revenue above SAR 187,500 in any year from 2022 to 2025) must integrate with Fatoora by 1 February 2027; check your ZATCA notification.

Need help with this?

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

Get a proposal