An Invoice line (BG-25) where the VAT category code (BT-151) is "Not subject to VAT", an invoiced item VAT rate (BT-152) shall be 0 (zero), if exist.
What does this mean?
The message names the category by its description rather than its letter: "Not subject to VAT". In the closed list BR-KSA-18 enforces — S, Z, E and O — that description belongs to O alone: out of scope. Z for zero-rated and E for exempt are separate descriptions, also at 0%, but this rule as written does not speak about them.
The field being checked is the invoiced item VAT rate (BT-152), which is cbc:Percent inside cac:ClassifiedTaxCategory on the line — with the letter beside it in cbc:ID as BT-151. A number and a letter in one element, and this rule says one of them governs the other.
There is a clause in the message worth reading closely: "if exist". The rule does not make the rate mandatory; it constrains its value where the rate is written. The safer of the two readings is to write 0 explicitly: it satisfies this condition and leaves no empty field for another check to read.
It has a document-level twin in BR-KSA-12, a warning, which says the same thing about a document level allowance rate (BT-96) when its category is not subject to VAT. At the opposite bound sits BR-KSA-84, an error: a standard-rated S line may carry only 5 or 15. The rate in this specification is never a free number — the letter fixes it.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
-
A rate hard-wired to
15in the mapping while the category is read per line: every out-of-scope line then leaves with the right letter and the wrong number. - The rate taken from establishment settings or from a single document rate while the category comes from the item row — two sources for two numbers that have to agree.
- Treating out of scope as a label printed on the page while the line figures stay as they were in a system set to the standard rate.
- Copying a standard-rated line, changing only the category letter on it, and leaving the rate underneath.
- The belief that the rate does no harm as long as the VAT amount is zero. The validator reads both fields, and a zero amount at a 15% rate is a contradiction on the document, not a shortcut.
How to fix it
3 steps, then send the invoice again.
-
1
Derive the rate from the letter, in one direction only
Make the category letter the single input in your system and derive the rate from it through a table:
Sto 15 (or 5 where that applies), andZ,EandOto 0. Once the number is derived it cannot disagree with the letter, and this code stops being possible in your output. -
2
Confirm the letter itself is the right one
Before you zero the rate, ask whether the line really is out of scope rather than zero-rated or exempt. All three are 0% and all three are treated differently in your VAT return; the difference between them is covered in BR-KSA-18. Which one applies to your supply is a regulatory question for zatca.gov.sa, not for us.
-
3
Send an exemption reason with the non-standard category
The Authority publishes a list of reason codes (VATEX) that go on the tax breakdown together with their text, and
BR-KSA-23states that explicitly for the exempt category. Take the code and its wording from the Authority's own list on zatca.gov.sa: the text a validator matches is theirs, not your translation of it.
Once corrected, send the invoice again. A rejected invoice was never recorded with the Authority, so it needs no credit note — send the corrected invoice itself.
Does ZATCA Tools prevent it?
Yes, by the shape of the table rather than by a later review. The four categories in ZATCA Tools are one table holding a rate per letter, with O at zero, and a line takes its letter and its rate from the same call in the payload builder, so the number cannot disagree with the letter. A line arriving with an unrecognised category does not leave as a contradictory pair either: it is treated as standard-rated at the standard rate, which is the safe direction — a line wrongly charged VAT is a correctable overpayment, while a line wrongly zeroed is under-declared VAT. There is no screen and no API field anywhere in the product where a line rate can be typed.
Related codes
BR-KSA-18
Rejects the invoice
BR-KSA-12
BR-KSA-84
Frequently asked questions
Does the rule cover zero-rated and exempt lines too? +
O. But the rate on zero-rated and exempt lines is zero in any case, so writing zero on all three is correct whether this rule or another one checks it.Can I omit the rate field instead of setting it to zero? +
0 and stay out of the question.The line VAT amount is already zero, so what harm does the rate do? +
ZATCA Tools builds the signature, the PIH, the counter and the encoding for you, and validates your data before it is sent. Completely free for now, and no credit card.
Start for free