Only one tax total (BG-22) without tax subtotals (BG-23) must be provided when tax currency code is provided .
What does this mean?
When the accounting currency (BT-6) is declared, the schema wants two TaxTotal blocks: the first with the breakdown — a TaxSubtotal per tax category, in the invoice currency — and the second with no breakdown at all, carrying the total VAT amount in SAR and nothing else.
The rule counts the blocks that hold no breakdown: there must be exactly one. Zero breaks it (the SAR block is missing), and two break it (a duplicate, or a breakdown copied where it does not belong).
What triggers the rule is the BT-6 declaration itself, not the currency being foreign: an invoice in SAR that declares SAR as its accounting currency is subject to the same condition.
Its severity in the validation schema is a warning: the invoice is accepted and the warning is recorded — but the pre-submission checkers in many solutions show it before sending with the look of a blocking error, which is why people stop at it.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
- Hand-built XML that declares the accounting currency and then emits a single, detailed tax total block and leaves it at that — the most common shape of this code is the missing SAR block.
- Copying the breakdown into both blocks to be safe — which leaves the count of breakdown-free blocks at zero.
- A template that repeats the SAR block twice, or collapses the whole structure into a single block carrying the amount and the breakdown in two currencies.
- An invoice in a foreign currency (an international store selling in dollars, for instance) whose system added the SAR declaration as required, while the tax structure stayed on the single-block shape.
How to fix it
3 steps, then send the invoice again.
-
1
Emit both blocks in the required structure
The first: a
TaxTotalholding the tax amount and aTaxSubtotalper category in the invoice currency. The second: aTaxTotalholding the amount alone with the currency identifierSAR— with noTaxSubtotalinside it, because being empty of them is literally what is required, not something missing from it. -
2
Put the correct SAR amount in the empty block
It is the total VAT of the invoice converted into SAR at the exchange rate your business uses. If the invoice is in SAR to begin with, it is the same total with no conversion — and both blocks carry the same figure.
-
3
Review the breakdown categories while you are there
Every
TaxSubtotalin the detailed block carries one of the four adopted category codes — category errors have a code of their own, BR-KSA-18, so going over them now saves you a later round of rejection.
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. Every invoice from ZATCA Tools is issued in SAR with the accounting currency declared and the required double structure generated automatically — tax blocks are never built by hand on any path.
Related codes
BR-KSA-EN16931-02
BR-KSA-CL-02
BR-KSA-18
Rejects the invoice
Frequently asked questions
My invoice is in SAR already — why am I seeing this? +
Was my invoice rejected because of this code? +
I sell in a foreign currency — what exchange rate do I convert the SAR amount at? +
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