A VAT breakdown (BG-23) with VAT Category code (BT-118) 'Not subject to VAT' shall have a VAT exception reason code (BT-121)
What does this mean?
The place being checked is the document's VAT breakdown (BG-23): every cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory whose cbc:ID (BT-118) is O. Inside it, cbc:TaxExemptionReasonCode (BT-121) must be present and must not be empty once spaces are trimmed. The check runs per breakdown, on tax invoices, simplified invoices and their notes alike.
The executable test in the compiled schematron the Authority ships with its SDK asks about presence only. The test text printed beside the message has something worth flagging: it spells the code backwards, VAT-OOS-SA. That text is not what runs, and the code the Authority accepts is VATEX-SA-OOS — so copying the code from the test text passes this rule and then fails BR-KSA-CL-04. That rule's message mentions only Z and E, but its executable condition has a branch for category O that accepts nothing but VATEX-SA-OOS.
This category has a single code, and the table in paragraph 11.2.4 of the XML implementation standard says its text is free, provided by the taxpayer case by case. The code is fixed and the text is a description: what made this line fall outside the scope. Wherever the code is present, the text must sit beside it in cbc:TaxExemptionReason (BT-120), or BR-KSA-83 warns, and it runs from 1 to 1,000 characters, or BR-KSA-F-06-C16 warns.
O is neither E nor Z: zero-rated is a taxable supply at 0%, exempt is a supply within scope that the law exempts, and this one is what falls outside the scope of VAT altogether. The difference between the letters is covered in BR-KSA-18, and the rate on such a line is zero under BR-KSA-11, which is an error. Which of your supplies are out of scope is a regulatory question the invoice does not settle.
It is a warning: the invoice is cleared or reported, and the code comes back with the acceptance in warningMessages. The European specification is satisfied here by a code or a text, through rule BR-O-10; the Authority's copy drops it and puts this rule in its place, so text alone is no longer enough. Prepayment lines have a twin of this rule, BR-KSA-95.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
-
A system that treats
Oas no VAT, nothing to explain, and writes no code for a category where nothing is literally exempted. -
The text Not subject to VAT in
cbc:TaxExemptionReasonwith no code — which satisfies the European ruleBR-O-10and not this one. -
The code copied backwards,
VAT-OOS-SA, from the test text in the Authority's SDK: this rule passes andBR-KSA-CL-04warns. -
The reason written only on the line, in
cac:Item/cac:ClassifiedTaxCategory, while the rule reads nothing except the document-level VAT breakdown. - The code element written empty or holding spaces when the template does not know the value, and to this rule empty is the same as absent.
-
The letter
Ochosen for a line whose treatment was never settled, because it looks lighter than an exemption. The missing code is then the least of the document's problems.
How to fix it
3 steps, then send the invoice again.
-
1
Write VATEX-SA-OOS and a text describing the case
Inside every
cac:TaxSubtotal/cac:TaxCategorywhose category isO, straight aftercbc:Percent:<cbc:TaxExemptionReasonCode>VATEX-SA-OOS</cbc:TaxExemptionReasonCode>, then<cbc:TaxExemptionReason>…</cbc:TaxExemptionReason>with a text saying why the line falls outside the scope, thencac:TaxScheme. The code exactly as it is:VATEXfirst, thenSA, thenOOS. -
2
Keep the rate at zero in both places
The VAT breakdown has category
Oand rate0, and so does the line beside it incac:ClassifiedTaxCategory: a non-zero rate on an out-of-scope line is an error that rejects the invoice under BR-KSA-11, which is more serious than this warning. -
3
Confirm that O is the right letter
Before adding the code, ask whether the line really is out of scope, or exempt under one of the three exempt codes, or zero-rated. All three are 0% and all three sit differently in your return. The call belongs to your tax adviser and zatca.gov.sa, not to us, and not to a system that picks the letter because the VAT amount is zero.
This code does not block acceptance, so the invoice you have is compliant. Correct the data so the warnings disappear from future invoices.
Does ZATCA Tools prevent it?
Yes. Category O has a single code, so there is nothing to guess: every VAT breakdown with category O leaves ZATCA Tools with the code VATEX-SA-OOS and the text Outside scope of VAT: from the invoice form, from the API even when the line carries no tax_reason_code, and on a note that inherits its invoice's category. A code of another category on an O line is refused by the API before signing with invalid_lines. We have issued documents with out-of-scope lines on the Authority's sandbox and they were accepted without a warning. The Shopify integration never issues an out-of-scope line at all. One limit, stated plainly: our text is fixed, and there is no field where the merchant writes a description of the case as the standard allows.
Related codes
BR-KSA-CL-04
Warning
BR-KSA-83
Warning
BR-KSA-11
Rejects the invoice
BR-KSA-69
Warning
BR-KSA-23
Warning
BR-KSA-18
Rejects the invoice
Frequently asked questions
Was my invoice rejected because of this code? +
What text do I write with VATEX-SA-OOS? +
I copied the code VAT-OOS-SA from the Authority's SDK and got BR-KSA-CL-04 — why? +
VATEX-SA-OOS, the only one the category O branch of BR-KSA-CL-04 accepts.What is the difference between O and E when both are 0%? +
E is a supply within the scope of VAT that the law exempts, and it has three specific codes. O is what falls outside the scope altogether, with one code and free text. The four letters are covered in BR-KSA-18, and which one applies to your supply is a question for your adviser.Does it apply to credit and debit notes? +
ZATCA Tools builds the signature, the PIH, the counter and the encoding for you, and validates your data before it is sent. Start free, with no credit card.
Start for free