Item net price (BT-146) must equal (Item Gross price (BT-148) - Allowance amount (BT-147)) when gross price is provided.
What does this mean?
Three figures sit on one price inside cac:InvoiceLine/cac:Price, all per unit and all exclusive of VAT. The item net price (BT-146) is cbc:PriceAmount. The item gross price (BT-148) is cac:AllowanceCharge/cbc:BaseAmount inside that price, and the item price discount (BT-147) is the cbc:Amount beside it. The rule is a subtraction: net equals gross minus discount.
It speaks only when the gross price is there. The message says so, and ZATCA's XML Implementation Standard gives the rule's context as cac:Price/cac:AllowanceCharge, the allowance block inside the price. A line whose price carries only cbc:PriceAmount gives it nothing to compare.
The discount it means is a price discount, not a line discount. ZATCA's Data Dictionary describes BT-147 as applying only when the discount is given per unit, at the price level and not the line level. A discount on the line as a whole is a different element, an allowance directly under cac:InvoiceLine (BT-136), and it enters the line net through BR-KSA-EN16931-11 instead.
It is an error: the invoice is rejected, and nothing is recorded at the Authority until it is corrected and sent again.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
- The whole line discount written as the price discount. Three units at 100.00 with 30.00 off the line give a gross of 100.00, a discount of 30.00 and a net of 90.00, while 100.00 minus 30.00 is 70.00.
- The net price left at the list price while the discount is declared beside it: gross 100.00, discount 10.00, net 100.00.
- A percentage written where an amount belongs: 10 meaning 10% of a 250.00 price, so 250.00 minus 10.00 is compared with a net of 225.00.
- A gross price that includes VAT beside a net price that does not. The Data Dictionary defines both as exclusive of VAT.
- The discount and the net each computed from a percentage and each rounded on its own: when the exact discount lands on half a halala, the two roundings can disagree by one.
How to fix it
3 steps, then send the invoice again.
-
1
Work per unit, then subtract
Take the unit price before the discount as BT-148 and the discount on one unit as BT-147, and write BT-146 as their difference, all three to two decimals and exclusive of VAT. Three units at 100.00 with 10% off:
cbc:BaseAmount100.00,cbc:Amount10.00,cbc:PriceAmount90.00. The line net is then 3 × 90.00 = 270.00, which is a separate check,BR-KSA-EN16931-11. -
2
Round once, and derive the rest
Round the discount to two decimals first, then subtract it from the gross price. Never round the net price along its own path: a figure derived by the subtraction cannot disagree with the subtraction.
-
3
Move a whole-line discount out of the price
If the discount belongs to the line rather than to each unit, say 25.00 off three units, which does not divide evenly into halalas, do not force it into a price discount. Declare it as a line allowance, a
cac:AllowanceChargedirectly undercac:InvoiceLinewithcbc:ChargeIndicatorset to false, whichBR-KSA-EN16931-11subtracts from quantity times net price.
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, because our documents never state a gross price. A line discount is taken off the unit price before signing, so cbc:PriceAmount carries the price actually charged, and the price holds that figure and nothing else: the payload builder passes the library a price amount and a unit code only, and the library writes a price-level allowance only when it is handed one. A document-level discount is spread into the lines' unit prices as well, and the few halalas that cannot be spread are declared at document level, never on a price. With no BT-148 in the file, the condition of this rule never arises. We read the output back to be sure: three units at 100.00 with 10% off leave as a unit price of 90.00, with no allowance and no base amount under the price. The other half, stated plainly: the signed XML carries the net price, not the list price and the discount; those two are printed on the invoice.
Related codes
BR-KSA-EN16931-11
BR-KSA-EN16931-06
BR-KSA-F-04
Rejects the invoice
Frequently asked questions
Is the price discount per unit or for the whole line? +
BR-KSA-EN16931-11 subtracts from quantity times net price.Should the ChargeIndicator on the price allowance be true or false? +
BR-KSA-EN16931-06, an error, says the indicator should be true. We read messages and severities, not the tests behind them, so we cannot tell you which one the validator enforces: see what your own response returns under BR-KSA-EN16931-06. This rule does the subtraction and nothing else.Can I leave the gross price out? +
cbc:PriceAmount still has to carry what was actually charged, and the line net still has to equal quantity times that price under BR-KSA-EN16931-11. That is how the documents we issue are built. Whether the discount itself has to appear in the XML is a different question, and not one this rule answers.Is a one-halala difference tolerated? +
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