Payment means code (BT-81) in an invoice exist, then it must contain one of the values from subset of UNTDID 4461 code list
What does this mean?
The element is cac:PaymentMeans/cbc:PaymentMeansCode (BT-81): a code for how the payment is expected to be, or has been, settled. ZATCA's Data Dictionary marks it optional on every type of document. The rule's condition is that the code exists; once it does, the rule checks one thing, that the value belongs to the subset.
The subset as ZATCA last printed it was a table in its XML Implementation Standard: 10 In cash, 30 Credit, 42 Payment to bank account, 48 Bank card, and 1 Instrument not defined (Free text). The labels are ZATCA's own.
One thing to know before you build on that table. The tracked-changes edition of version 1.2 of the standard, dated 2023-05-19, shows it struck out. The clean version 1.2 now says only that the code comes from a subset of UN/CEFACT code list 4461, D.16B, and the Data Dictionary of the same date does not list the values either; its example for BT-81 is 30. We read each rule's message and severity, not the test behind it, so we cannot tell you whether the validator accepts anything beyond those five. They are the values ZATCA itself published, which makes them the safe choice.
The same cac:PaymentMeans block carries the reason for a credit or debit note: KSA-10 is its cbc:InstructionNote. That reason is required by BR-KSA-17, an error, and BR-49 from EN 16931, which the standard carries, requires a payment instruction to state its code. So in practice a note carries this block, and a code in it.
It is a warning: the document is accepted and the warning is recorded with it.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
-
The payment method's name sent instead of a code:
cash,cardor bank transfer, or the internal key that the point of sale or the ERP uses for the method. -
The note reason written into
cbc:PaymentMeansCodeinstead ofcbc:InstructionNote. The code fails here, and the note loses the reason BR-KSA-17 requires. - A code from the wider UNTDID 4461 list that is not among the five ZATCA published, carried over from a European template or a general code table.
-
The right code in a form that is not the code:
010, or10.0from a value that passed through a number type on its way into the XML.
How to fix it
4 steps, then send the invoice again.
-
1
Map your payment methods to codes explicitly
Keep a small table in the integration from your own payment methods to the published codes: cash to
10, a transfer to the seller's bank account to42, a card payment on any network to48, a sale on credit terms to30, which ZATCA labels Credit, and1where none of them describes the case. Never pass a method's name or your internal key straight through. -
2
Keep the note reason in its own element
On a credit or debit note,
cac:PaymentMeansholds both: the code incbc:PaymentMeansCodeand the reason incbc:InstructionNote. Write each to its own element. The reason, and what it should say, is covered in BR-KSA-17. -
3
Write the code as text
Emit the code as a literal string from your table,
10and not10.0or010, without passing it through a numeric type or a formatter on the way. -
4
Check before you widen the list
Because version 1.2 of the standard no longer prints the values, confirm on zatca.gov.sa before you map any method to a code outside the five ZATCA published.
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, because the value is a constant. Every document ZATCA Tools issues, invoices and notes alike, carries payment means code 10, written in the payload builder; no screen, API field or store integration sets it, so a code outside the list cannot reach the XML. On a credit or debit note the same block carries the note's reason as its instruction note, which is what BR-KSA-17 asks for. The other half, in the same honesty: 10 is the code ZATCA's table labels In cash, and it is written whatever way your buyer actually pays. A transfer or a card payment is not described in the signed document, and a payment recorded later on a receipt voucher does not change what was signed.
Related codes
BR-KSA-17
Rejects the invoice
BR-KSA-56
Warning
BR-KSA-F-06-C13
Frequently asked questions
Which payment means codes does ZATCA accept? +
10 In cash, 30 Credit, 42 Payment to bank account, 48 Bank card and 1 Instrument not defined (Free text). Version 1.2 of the XML Implementation Standard removed that table without printing another, and we cannot read the validator's test, so we cannot promise anything beyond those five. Stay within them.Was my invoice rejected because of this code? +
Is a payment means required at all? +
cac:PaymentMeans, so the block is there, and BR-49 from EN 16931, which the XML Implementation Standard carries, requires a payment instruction to state its code.Which code do I use for a card terminal? +
48, Bank card, whatever network carries it; the network is not a code, and if you want to keep it, keep it in your own records. This field takes the code alone.The buyer will pay by bank transfer next month. Is that 42 or 30? +
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