BR-KSA-16 Warning — the invoice is accepted

Payment means code (BT-81) not in ZATCA's subset of UNTDID 4461

When an invoice states a payment means, the value must be a code from ZATCA's subset of UNTDID 4461, not a word such as cash or card. The last list ZATCA published has five codes: 10, 30, 42, 48 and 1. It is a warning, so the invoice is accepted.

The message text as the Authority sends it in English, unedited

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, card or bank transfer, or the internal key that the point of sale or the ERP uses for the method.
  • The note reason written into cbc:PaymentMeansCode instead of cbc: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, or 10.0 from 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. 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 to 42, a card payment on any network to 48, a sale on credit terms to 30, which ZATCA labels Credit, and 1 where none of them describes the case. Never pass a method's name or your internal key straight through.

  2. 2
    Keep the note reason in its own element

    On a credit or debit note, cac:PaymentMeans holds both: the code in cbc:PaymentMeansCode and the reason in cbc:InstructionNote. Write each to its own element. The reason, and what it should say, is covered in BR-KSA-17.

  3. 3
    Write the code as text

    Emit the code as a literal string from your table, 10 and not 10.0 or 010, without passing it through a numeric type or a formatter on the way.

  4. 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

Frequently asked questions

Which payment means codes does ZATCA accept? +
The last list ZATCA published has five: 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? +
No. It is a warning: the invoice is accepted and the warning recorded. If it was rejected, the code that did it is in errorMessages. On a credit or debit note, look at BR-KSA-17: a missing reason in this same block is an error. How to read the whole response is in ZATCA error codes explained.
Is a payment means required at all? +
The Data Dictionary marks BT-81 optional on every type of document, and this rule only speaks once the code exists. Notes are the practical exception: the reason for a credit or debit note lives inside 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? +
The list has means, not brands. A card payment is 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? +
The Data Dictionary describes BT-81 as how a payment is expected to be, or has been, settled, and it ties the payment terms field (KSA-22) to a mode of payment of credit. Both codes are in the list ZATCA published, so neither is the kind of value this rule is about; which one describes your arrangement is a choice about your own terms, and the rule does not make it for you.
You fixed this one — now avoid the next

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

← All ZATCA error codes