Overview
ZATCA Phase 2 introduced two parallel flows: clearance for standard tax invoices (B2B) and reporting for simplified tax invoices (B2C). The common path is straightforward; the edge cases are where most ERPs and POSes fail in production. This guide is a practitioner's catalogue of those edge cases — self-billing, reverse charge, exports, refunds, partial returns, returnable packaging, and the timing of when an invoice is considered "issued".
Who this applies to
- Every taxpayer using the simplified invoice / B2C flow.
- ERPs, POS vendors, billing platforms.
Edge case 1: Self-billing
When the buyer issues the invoice on behalf of the seller (common in agriculture and freelancers). Three rules:
- A written self-billing agreement must exist with each supplier.
- The invoice must be marked with the self-billing indicator (
InvoiceTypeCode0211000). - The supplier's VAT number, not the buyer's, is the issuer for ZATCA purposes; but the buyer's CSID signs.
<cbc:InvoiceTypeCode name="0211000">388</cbc:InvoiceTypeCode>
<!-- name attribute: 02=self-billed, 1=tax invoice -->
Edge case 2: Reverse charge
For B2B services received from non-resident suppliers, the Saudi buyer self-assesses VAT under reverse charge.
- Issue a self-assessed invoice with tax category code "O" (Services outside scope of tax — RC) and zero VAT rate at the line level.
- Record the reverse-charge VAT in a parallel internal journal.
- Reverse-charge invoices follow the clearance flow if you're a wave-included taxpayer.
Edge case 3: Exports (zero-rated)
Goods exported outside KSA are zero-rated. Watch for:
- Tax category code "Z" (Zero-rated).
- Customs export declaration number stored in
AdditionalDocumentReference. - Proof-of-export must be retained 6 years.
<cac:ClassifiedTaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
Edge case 4: B2C receipt timing
A simplified invoice must be issued at the moment of sale. ZATCA reporting can lag up to 24 hours but the on-device receipt time and the reported time must match within reasonable drift (NTP-synchronised devices). Common errors:
- Receipt printed but reporting deferred to end-of-day batch — fine if within 24h.
- POS terminal offline for 26 hours and you batch-report — that batch contains late entries; ZATCA flags them.
Edge case 5: Foreign currency
If the invoice is in USD but VAT must be reported in SAR:
<cbc:DocumentCurrencyCode>USD</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>SAR</cbc:TaxCurrencyCode>
<cac:TaxExchangeRate>
<cbc:SourceCurrencyCode>USD</cbc:SourceCurrencyCode>
<cbc:TargetCurrencyCode>SAR</cbc:TargetCurrencyCode>
<cbc:CalculationRate>3.7500</cbc:CalculationRate>
</cac:TaxExchangeRate>
The exchange rate must come from a published, reproducible source (SAMA reference rate is preferred).
Edge case 6: Partial returns and credit notes
A credit note for a partial return:
- Reference the original invoice's
cbc:IDandcbc:UUIDincac:BillingReference. - Tax category and rate must match the original line.
- ICV continues to increment (credit notes are still invoices for the counter).
- PIH points to the immediately preceding invoice (not the original).
<cac:BillingReference>
<cac:InvoiceDocumentReference>
<cbc:ID>INV-2026-00187</cbc:ID>
<cbc:UUID>3cf5ee18-ee25-44ea-a444-2c37ba7f28be</cbc:UUID>
</cac:InvoiceDocumentReference>
</cac:BillingReference>
<cbc:InvoiceTypeCode name="0200000">381</cbc:InvoiceTypeCode>
Edge case 7: Returnable packaging
VAT applies to the goods value not the deposit on returnable packaging. Two-line invoice approach:
- Line 1: goods, 15% VAT.
- Line 2: packaging deposit, code "O" (out-of-scope), refunded on return.
When packaging is returned, issue a credit note for the deposit line only — not the goods.
Edge case 8: Tips and service charges
- Service charge (e.g., 10% in restaurants): VAT applies.
- Voluntary tip via card: out-of-scope (no VAT).
- Voluntary tip in cash and not passed through the till: not on invoice at all.
Edge case 9: Bundled services with mixed VAT rates
If a single line item bundles a zero-rated good with a standard-rated service, split it into separate lines and apply the correct VAT to each. Never apportion at the line level; ZATCA validation rejects mixed rates.
Edge case 10: Issued vs. delivered
For ZATCA the invoice is "issued" when:
- B2B: when the cleared XML has been returned by ZATCA with status SUCCESS.
- B2C: when the receipt is printed and reportable.
If your delivery slip predates the cleared invoice, that is fine; if you delivered without an invoice and later issued one, you risk a finding.
Common gotchas
- Reverse charge invoices treated as out-of-scope on the wrong tax category code.
- Credit note PIH pointing at the original invoice rather than the immediately preceding one.
- Foreign-currency invoices submitting both currencies but no exchange-rate element.
- POS terminals using device-local time without NTP, drifting outside reasonable tolerance.
Verification
- Test suite covering all edge cases above.
- ICV/PIH chain audit including credit notes.
- NTP synchronisation evidenced on every POS device.
- 6-year archive index by VAT period for quick auditor retrieval.
Conclusion
The B2C path looks simple until you ship to production. Catalogue the edge cases up front, write a regression test for each, and your ZATCA integration becomes boring — which is the highest praise an integration can earn.
Comments
0 total · 0 threads