What a ZIP check returns, before you pay for one. This report is real, not a mock-up: Mutabiq produced it from a ZIP of its own test invoices and one file that is not an invoice. No customer's file was used.
Produced with rule pack 2.2.0, with 2026-09-28 as the date the date rules judged against. Mutabiq's test suite runs the same files through the current version and fails if the result differs from this page.
Download this result as a CSV file or a JSON file, written by the same code as the results page's export buttons.
A ZIP check shows this report on every plan, the Free plan's monthly ZIP included, and every plan can print it or save it as PDF. The CSV and JSON downloads are included from Starter up. Compare the plans.
On your own reports the CSV also carries the time of the check and a run id, which opens the check in your organisation's history. A sample was never a stored check, so those two columns are empty here.
Sample report, built from Mutabiq's own test invoices. No customer data.
Batch report
4 files checked. Passed: 2 files, not passed: 2 files.
1 entry skipped: neither an XML invoice nor a PDF. It was not checked and not counted.
Positions in the archive are numbered from 0, not from 1: the file headed File 1 sits at position 0. The position is the number stored with that file's findings, so it is the one that identifies the file outside this report.
Files that did not pass are listed first. Files that passed are collapsed; open one to see its report.
File:
mutabiq-sample-batch.zip
Source:
ZIP archive
Not checked by this pre-validation
A pass means the document satisfied the published checks in this rule pack. Mutabiq does not verify, and this report says nothing about:
the cryptographic stamp and the signature: whether either is present, valid, or made with the right key;
the CSID and the certificate the invoice was signed with;
the previous invoice hash chain and the continuity of the invoice counter (ICV) across your documents;
the invoice hash the QR code carries in tag 6: whether it matches this document;
clearance or reporting status with the authority: whether the Fatoora platform has accepted this document.
bad-31-tax-exclusive-mismatch.xml — file 1 of 4 Not passed
Position 11 errorInvoice number: MTB-G01Issue date: 2026-09-01Document type: Standard invoiceSeller VAT registration number: 300000000000003Invoice counter (ICV): 1
Not passed
At least one error was raised, so this invoice would be rejected as it stands. If you issued it, fix the errors below before submitting it; if you received it, send this report to the supplier. This is pre-validation against published ZATCA requirements, not an approval by the authority.
3 findings
1 error, 2 warnings, no advisories
Rule pack version: 2.2.0
ZATCA SDK: 3.4.8
This rule pack checks 96 of the 242 rule codes in ZATCA's SDK 3.4.8 rule files. What is not checked
Tax-inclusive total does not equal the total before VAT plus the VAT
The three figures usually come from different places, so check which one is out rather than adjusting the total to fit. A frequent cause is VAT computed per line and rounded there, while the breakdown is computed per category: ZATCA adds first and rounds once, so per-line rounding can differ by a hundredth or two. Another is a document-level discount applied after the VAT was computed. Note that this rule reads the VAT breakdown entries, so a document whose totals are right but whose breakdown is incomplete fails here too.
Why this is raised
The cbc:TaxInclusiveAmount in cac:LegalMonetaryTotal is not the cbc:TaxExclusiveAmount plus the sum of the VAT breakdown amounts. EN 16931 rule BR-CO-15, which ZATCA runs, adds the tax-exclusive total to the cbc:TaxAmount of every cac:TaxSubtotal, rounds the result to two decimals and requires an exact match.
Location:Invoice total with VATLegalMonetaryTotal › then TaxInclusiveAmountXPath//*[local-name()='LegalMonetaryTotal']/*[local-name()='TaxInclusiveAmount']
Tax-exclusive total does not match the lines, charges and allowances
Start by checking that the amounts entering this sum are the ones ZATCA expects: cbc:LineExtensionAmount for the lines, cbc:ChargeTotalAmount for document charges, cbc:AllowanceTotalAmount for document discounts. Then check the number of decimal places your system writes. If any amount carries three or more decimals, write it to two - the strict branch above compares those digits exactly, and a third decimal that rounds away in your reports does not round away here.
Why this is raised
The cbc:TaxExclusiveAmount in cac:LegalMonetaryTotal is not the line total plus the charge total less the allowance total. EN 16931 rule BR-CO-13, which ZATCA runs, checks whichever of those two optional totals your document carries, rounds the result to two decimals and requires an exact match. One case is stricter than the rest and catches people out: when the document has neither a charge total nor an allowance total, ZATCA requires the tax-exclusive amount to equal the line total with no rounding applied at all - so a line total written as 100.001 against a tax-exclusive amount of 100.00 fails, where in every other branch it would have been rounded first.
Location:Invoice total without VATLegalMonetaryTotal › then TaxExclusiveAmountXPath//*[local-name()='LegalMonetaryTotal']/*[local-name()='TaxExclusiveAmount']
If the files come from one device, the counter is not being advanced or is being reset: look for a counter kept per user session or per process rather than once for the device, a value reset by a restart, a reissue or a year end, a document exported twice into two files, and a copy of one file placed in the archive twice. If they come from different devices, nothing is wrong, and the clearest way to read the report is to upload each device's documents in an archive of its own.
Why this is raised
Two or more members of the uploaded archive carry the same invoice counter value (KSA-16) under the same seller VAT registration number, and this note is on each of them. ZATCA's E-Invoicing Detailed Guideline (Annex 2 of the E-Invoicing Resolution) describes the counter as a tamper-resistant sequence that cannot be reset and increments for each invoice or note issued; the XML Implementation Standard itself requires only that the counter is present and written in digits. In Mutabiq's reading, the counter belongs to the e-invoicing solution that issues the documents, so two solutions of one seller can carry the same numbers, while one solution cannot repeat one. If these files come from different devices, this is expected. This is reported as a risk rather than as a rejection: ZATCA's published rules read one document at a time and check only that a counter is present, so no assertion sees the repeat. While a value is repeated, Mutabiq does not judge the previous invoice hash link into it or out of it, because there is no single document before or after it.
Location:Invoice counter (ICV)AdditionalDocumentReference › then UUIDXPath//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']
bad-04-vat-number-14-digits.xml — file 2 of 4 Not passed
Position 41 errorInvoice number: MTB-G01Issue date: 2026-09-01Document type: Standard invoiceSeller VAT registration number: 30000000000003Invoice counter (ICV): 1
Not passed
At least one error was raised, so this invoice would be rejected as it stands. If you issued it, fix the errors below before submitting it; if you received it, send this report to the supplier. This is pre-validation against published ZATCA requirements, not an approval by the authority.
1 finding
1 error, no warnings, no advisories
Rule pack version: 2.2.0
ZATCA SDK: 3.4.8
This rule pack checks 96 of the 242 rule codes in ZATCA's SDK 3.4.8 rule files. What is not checked
Send the 15 digits alone: no spaces, no dashes, no VAT or SA prefix, and no group separators. The common causes are a number stored with formatting for display and exported as stored, a value padded or truncated to a fixed column width, and the commercial registration number being mapped into this field by mistake - it is a different number and usually 10 digits. Correct it in the company record or the mapping, not in the exported file.
Why this is raised
The seller VAT registration number (BT-31), in cbc:CompanyID under the seller's VAT tax scheme, is not exactly 15 digits. ZATCA rejects it under BR-KSA-40, which requires 15 digits and nothing else - too few, too many, or any character that is not a digit all fail the same test.
Location:Seller VAT registration numberAccountingSupplierParty › then PartyTaxScheme › then CompanyIDXPath//*[local-name()='AccountingSupplierParty']//*[local-name()='PartyTaxScheme']/*[local-name()='CompanyID']
Passed (2)
good-01-standard-388.xml — file 3 of 4 Passed
Position 0No errorsInvoice number: MTB-G01Issue date: 2026-09-01Document type: Standard invoiceSeller VAT registration number: 300000000000003Invoice counter (ICV): 1
Passed
No errors were raised by the checks in this rule pack. This is pre-validation against published ZATCA requirements, not an approval by the authority.
1 finding
no errors, 1 warning, no advisories
Rule pack version: 2.2.0
ZATCA SDK: 3.4.8
This rule pack checks 96 of the 242 rule codes in ZATCA's SDK 3.4.8 rule files. What is not checked
If the files come from one device, the counter is not being advanced or is being reset: look for a counter kept per user session or per process rather than once for the device, a value reset by a restart, a reissue or a year end, a document exported twice into two files, and a copy of one file placed in the archive twice. If they come from different devices, nothing is wrong, and the clearest way to read the report is to upload each device's documents in an archive of its own.
Why this is raised
Two or more members of the uploaded archive carry the same invoice counter value (KSA-16) under the same seller VAT registration number, and this note is on each of them. ZATCA's E-Invoicing Detailed Guideline (Annex 2 of the E-Invoicing Resolution) describes the counter as a tamper-resistant sequence that cannot be reset and increments for each invoice or note issued; the XML Implementation Standard itself requires only that the counter is present and written in digits. In Mutabiq's reading, the counter belongs to the e-invoicing solution that issues the documents, so two solutions of one seller can carry the same numbers, while one solution cannot repeat one. If these files come from different devices, this is expected. This is reported as a risk rather than as a rejection: ZATCA's published rules read one document at a time and check only that a counter is present, so no assertion sees the repeat. While a value is repeated, Mutabiq does not judge the previous invoice hash link into it or out of it, because there is no single document before or after it.
Location:Invoice counter (ICV)AdditionalDocumentReference › then UUIDXPath//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']
good-23-seller-address-incomplete.xml — file 4 of 4 Passed
Position 3No errorsInvoice number: MTB-G01Issue date: 2026-09-01Document type: Standard invoiceSeller VAT registration number: 300000000000003Invoice counter (ICV): 1
Passed
No errors were raised by the checks in this rule pack. This is pre-validation against published ZATCA requirements, not an approval by the authority.
2 findings
no errors, 2 warnings, no advisories
Rule pack version: 2.2.0
ZATCA SDK: 3.4.8
This rule pack checks 96 of the 242 rule codes in ZATCA's SDK 3.4.8 rule files. What is not checked
The neighbourhood, or district, is part of the Saudi National Address and has no counterpart in the address formats most systems ship with, so it is either not captured at all or folded into the street line. Check the company or branch record for a district field; if there is none, adding a custom field and mapping it to cbc:CitySubdivisionName is the correct fix, and splitting it back out of the street text is not.
Why this is raised
The seller's postal address carries no cbc:CitySubdivisionName element, which ZATCA's message calls the Neighborhood (KSA-3). BR-KSA-09 asks for six fields on the seller's postal address, cac:AccountingSupplierParty/cac:Party/cac:PostalAddress: street name (BT-35, cbc:StreetName), building number (KSA-17, cbc:BuildingNumber), city (BT-37, cbc:CityName), postal code (BT-38, cbc:PostalZone), neighbourhood (KSA-3, cbc:CitySubdivisionName) and country code (BT-40, cac:Country/cbc:IdentificationCode). This is reported as a risk and not as a rejection. Under the SDK release the pack read before 2.0.0 (3.0.8), this was the one assertion ZATCA flagged as a warning rather than as an error; SDK 3.4.8, which the pack reads now, flags most of its assertions as warnings, and BR-KSA-09 stays among them: the platform records the shortfall and does not refuse the document for it, so this note does not turn the report to FAIL on its own. SDK 3.0.8 also asked for the additional number (KSA-23, cbc:PlotIdentification); SDK 3.4.8 does not (KSA:1216). The Data Dictionary marks the address subfields mandatory, and that does not change the flag the checker carries. The check is presence only - an empty element satisfies it - and it stops at the first field missing in ZATCA's own order (street name, building number, city, postal code, neighbourhood, country code), so more than one of the six may be absent and only the first is named here. It applies to standard and simplified invoices alike.
Location:Seller postal addressAccountingSupplierParty › then Party › then PostalAddressXPath//*[local-name()='AccountingSupplierParty']/*[local-name()='Party']/*[local-name()='PostalAddress']
If the files come from one device, the counter is not being advanced or is being reset: look for a counter kept per user session or per process rather than once for the device, a value reset by a restart, a reissue or a year end, a document exported twice into two files, and a copy of one file placed in the archive twice. If they come from different devices, nothing is wrong, and the clearest way to read the report is to upload each device's documents in an archive of its own.
Why this is raised
Two or more members of the uploaded archive carry the same invoice counter value (KSA-16) under the same seller VAT registration number, and this note is on each of them. ZATCA's E-Invoicing Detailed Guideline (Annex 2 of the E-Invoicing Resolution) describes the counter as a tamper-resistant sequence that cannot be reset and increments for each invoice or note issued; the XML Implementation Standard itself requires only that the counter is present and written in digits. In Mutabiq's reading, the counter belongs to the e-invoicing solution that issues the documents, so two solutions of one seller can carry the same numbers, while one solution cannot repeat one. If these files come from different devices, this is expected. This is reported as a risk rather than as a rejection: ZATCA's published rules read one document at a time and check only that a counter is present, so no assertion sees the repeat. While a value is repeated, Mutabiq does not judge the previous invoice hash link into it or out of it, because there is no single document before or after it.
Location:Invoice counter (ICV)AdditionalDocumentReference › then UUIDXPath//*[local-name()='AdditionalDocumentReference']/*[local-name()='UUID']