← E-invoice Preflight

What does this e-invoice error code mean?

The preflight reports each defect with a rule code, the field it looked at, and a suggested fix, so you can go straight to the value that needs changing. This page is the full reference: every code the checker can emit, what it means, and what to do about it.

First, what these codes are not

INV- codes are this tool's own identifiers for its own checks. They are not EN 16931 BR- business rules, not Peppol validation artefact identifiers, and not the rejection codes a tax authority or submission network sends back. The preflight reads the file in front of it and reports arithmetic and structural observations before you submit; it never contacts a network, and it does not decide tax treatment or legal validity.

That distinction matters in both directions. A network validator may reject a document this tool passes, because it applies country and scheme rules this tool does not implement. It may also accept one this tool flags, because some of these checks are stricter than a network requires — the remittance and reference checks in particular are about getting paid, not about passing validation. When you contact your network or service provider, quote their code, not this one.

Document structure and required fields

The shape checks. These run first, because most later checks need these fields to exist before they can compare anything.
CodeWhat it meansFix
INV-001The document root is not a JSON object, or a required top-level field is missing. The required set is invoice number, issue date, currency, supplier, customer, lines, and totals.Add the named field. The report gives its path, so /totals means the totals object itself is absent.
INV-002The invoice number is empty or is not text.Provide a non-empty invoice number as a string.
INV-003The issue date is not an ISO calendar date. A date that looks right but does not exist, such as a 31st in a 30-day month, fails here too.Use YYYY-MM-DD.
INV-004The currency is not a three-letter uppercase code.Use an ISO-style code such as EUR or GBP.
INV-007The invoice carries no line items.Add at least one line.
INV-008A line is not an object, so its fields cannot be read.Give the line a description, quantity, unit price, and tax percentage.

Parties: supplier, customer, VAT identifiers, electronic addresses

Checks on who the invoice is from and to. The VAT and endpoint checks are typo catches computed from published checksum and format rules — never a registration or directory lookup, because nothing leaves your browser.
CodeWhat it meansFix
INV-005The supplier or customer identifier is missing.Add the party identifier from the source system.
INV-006The supplier or customer name is missing.Add the party name.
INV-022A VAT identifier uses a country prefix the checker does not recognise.Use a published VAT country prefix, or omit vat_id if the value is an internal identifier rather than a VAT number.
INV-023A VAT identifier fails that country's published checksum — almost always a transposed or dropped digit.Correct the digits. This is a checksum test, not a registration lookup: it cannot tell you whether a well-formed number is actually registered.
INV-039A party's electronic address is present but is not an object carrying both a scheme and an id.Provide endpoint.scheme (the EAS code) and endpoint.id, or omit the endpoint entirely.
INV-040A party's electronic address id is empty or is not text.Provide the id as text, or omit the endpoint.
INV-041The electronic address does not match the published shape for the scheme it declares — for example a GLN whose check digit does not compute.Correct the identifier. This is a format check, not a directory lookup.

Lines, totals, and arithmetic

These are the checks that catch the largest share of real defects, because they compare numbers that were produced at different times by different parts of an ERP export. Everything is rounded half-up to cents before comparison.

Arithmetic checks. Where a figure is wrong, the report names the value the checker computed, so you can paste it straight in if the lines are the side you trust.
CodeWhat it meansFix
INV-009A line quantity is not a positive number.Use a positive numeric quantity.
INV-010A line unit price is not a non-negative number.Use a non-negative numeric unit price.
INV-011A line tax percentage is not a valid number.Use the percentage from your authoritative source. The tool never chooses a tax rate for you.
INV-012A line's net is missing, or does not equal quantity × unit price at cent precision.Set the line net to the computed figure the report names, or correct the quantity and unit price.
INV-013The invoice net total is missing or is not a non-negative number.Provide a numeric net total.
INV-014The net total does not match the sum of the lines after header allowances and charges are applied.Set the net total to the computed figure, or correct the lines and adjustments. If this fires alongside INV-050–INV-052, fix the adjustments first.
INV-015The invoice tax total is missing or is not a non-negative number.Provide a numeric tax total.
INV-016The invoice gross total is missing or is not a non-negative number.Provide a numeric gross total.
INV-017Gross does not equal net plus tax.Set gross to the computed figure, or correct whichever of the three totals is wrong.
INV-018The tax total does not match what the line tax percentages add up to.Set the tax total to the computed figure, or correct the line inputs. On an invoice with more than one rate, read the mixed-rate worked example first — per-rate rounding is the usual cause.
INV-019Batch runs only: the same invoice number appears on more than one file in the batch.Use a unique invoice number, or remove the duplicate before submission.

Tax treatment, exemptions, and per-rate breakdown

Tax checks. The tool reports structural facts about the tax you declared; it never decides what rate or exemption applies.
CodeWhat it meansFix
INV-035A 0% or exempt line carries no exemption reason.Add tax_reason or tax_reason_code on the line, or tax_exemption_reason on the invoice — or correct the tax percentage if the line was not meant to be zero-rated.
INV-036An exemption reason field is present but empty or not text.Provide it as text, or omit it if the line is neither 0% nor exempt.
INV-037The invoice mixes tax rates but carries no per-rate tax breakdown.Add tax_breakdown with one row per rate, or use a single rate. The worked example shows the arithmetic this check expects.
INV-038A tax breakdown row is not an object.Give each row a tax percentage, a taxable amount, and a tax amount.

Dates, invoice periods, and payment terms

Date checks. Impossible orderings are caught here — an end before a start, a due date before issue — because receiving systems commonly reject them outright.
CodeWhat it meansFix
INV-020The due date is not an ISO calendar date.Use YYYY-MM-DD.
INV-021The due date is earlier than the issue date.Set the due date to the issue date or later.
INV-042The invoice period is present but is not an object with both a start and an end.Use period.start and period.end as ISO dates, or omit the period.
INV-043The invoice period ends before it starts.Set the end to the start date or later.
INV-053Payment terms days is empty, or is not a positive whole number of days.Use a positive whole number such as 30, or omit payment.terms_days.
INV-054The due date does not equal the issue date plus the stated terms days. This usually means one of the two was edited by hand and the other was not.Set the due date to the computed date the report names, or correct the terms days.
INV-056Batch runs only: a credit note and the invoice it reverses, both in the batch, are in different currencies.Credit in the currency of the original invoice, or name the right original in the original-invoice reference.
INV-057Batch runs only: credit notes in the batch against one invoice add up to more than that invoice's gross total.Check the credit amounts and which invoice each credit note names; a credit cannot return more than was invoiced.
INV-058Batch runs only: the invoice a credit note names is in the batch, but a different seller issued it.Check the original-invoice reference and the credit note's supplier.

Payment: IBAN, BIC, means, and remittance

These checks are about getting paid rather than passing validation. A network may well accept an invoice that fails them; a buyer's accounts-payable system may still not be able to pay it.

Payment checks. The IBAN and BIC tests are computed locally from published checksum and country rules — no bank is contacted.
CodeWhat it meansFix
INV-024The payment IBAN is empty or is not text.Provide the IBAN as text, or omit payment.iban.
INV-025The IBAN fails its published country checksum — a transposed digit is the usual cause, and it is the defect most likely to cost you a payment.Correct the digits. This is a checksum test, not a bank lookup: a well-formed IBAN can still be the wrong account.
INV-026The payment BIC is empty or is not text.Provide the BIC as text, or omit payment.bic.
INV-027The BIC's country does not match the IBAN's country.Correct whichever is wrong so both agree, or omit the BIC.
INV-030The invoice names an IBAN but no remittance reference, so a buyer paying it has nothing to quote on the transfer.Add payment.remittance, or omit the IBAN if payment is not by transfer.
INV-031The remittance reference is empty or is not text.Provide it as text, or omit it.
INV-044The payment means code is empty or is not a documented UNCL 4461 code.Use a published code such as 30, 58, or 10, or omit payment.means.
INV-045The means is a credit transfer, SEPA transfer, or direct debit, but no IBAN is given.Add the IBAN, switch to a cash or card means, or omit the means.
INV-046The means is cash, cheque, or card, yet the invoice also names an IBAN — the two disagree about how you expect to be paid.Use a transfer means with the IBAN, or drop the IBAN.

Settlement amounts, document type, and references

Checks on what is still owed, what kind of document this is, and the references a buyer's accounts-payable system matches against.
CodeWhat it meansFix
INV-028The prepaid amount is present but is not a non-negative number.Provide a numeric prepaid amount, or omit totals.prepaid.
INV-029The amount due is present but is not a non-negative number.Provide a numeric amount due, or omit totals.due.
INV-032The document type is not a known invoice, credit note, or debit note.Use invoice, credit_note, or debit_note, or omit the field.
INV-033A credit or debit note does not name the invoice it reverses.Add original_invoice with the number being credited or debited.
INV-034A credit or debit note names itself as the invoice it reverses — usually a template that copied the invoice number into both fields.Point original_invoice at the original document, not at this one.
INV-047The buyer reference is present but empty, not text, or a placeholder.Add the cost-centre or buyer text the buyer asked for, or omit buyer_reference.
INV-048The purchase-order reference is present but empty, not text, or a placeholder.Add the buyer's purchase-order number, or omit order_reference.
INV-049The purchase-order reference repeats the invoice number, which is what an export does when the buyer's PO was never captured. Accounts payable cannot match it.Set it to the buyer's actual purchase-order number, or omit it.

Header allowances and charges

Document-level discounts and surcharges — the ones applied after the lines are summed.
CodeWhat it meansFix
INV-050The adjustments field is present but is empty or is not a list of rows.Provide a list of allowance or charge rows, or omit adjustments.
INV-051An allowance or charge base is missing or invalid, so its amount cannot be checked against its percentage.Provide a non-negative base, or omit both base and percent and state the amount directly.
INV-052An allowance or charge reason is longer than the 100-character field receiving systems commonly provide.Shorten the reason so it survives the receiving system, or drop the row.

Read failures

Reported when the file could not be parsed at all, so no other check could run against it.
CodeWhat it meansFix
INV-READThe invoice could not be read — malformed JSON, XML that is not UBL or CII, or a PDF with no embedded invoice XML to unwrap.Resolve the read error and run the preflight again. For a PDF, confirm it is a Factur-X, ZUGFeRD, or XRechnung file that actually carries an XML attachment.

Common questions

What does an INV rule code from the e-invoice preflight mean?

Each INV code names one specific defect the preflight found in the invoice you gave it, so that a report can point at a single field rather than saying the document is bad. INV-012 means a line's net does not equal quantity times unit price. INV-017 means gross does not equal net plus tax. INV-018 means the tax total does not match what the line tax percentages add up to. INV-025 means an IBAN fails its published country checksum. INV-045 means a credit-transfer or SEPA payment means was given without an IBAN. These are the tool's own identifiers for its own checks, not codes issued by a tax authority or a submission network.

Are these the same codes my e-invoicing network sends back on a rejection?

No. INV codes are internal to this preflight and are not EN 16931 BR- rule identifiers, Peppol validation artefact codes, or any authority's rejection codes. The preflight runs before submission and reports arithmetic and structural observations about the file in front of it. A network's own validator may accept a document this tool flags, or reject one it passes. Use the INV code to find and fix the underlying field; quote your network's code, not this one, when you contact them.

Why did the preflight flag my invoice when the totals look right?

The most common cause is cent rounding applied at a different stage than the checker applies it. The preflight rounds half-up to cents and compares the rounded figures, so a line net carried at full floating precision in an ERP export can disagree with the printed total by a cent and raise INV-012, INV-014 or INV-018. The second most common cause is a field that is present but empty rather than absent — an empty string is not a missing field, and several checks treat the two differently. The report names the JSON path of the value it compared, which is the fastest way to see which of the two it is.

This page is a reference for the tool's own checks. It is not tax or legal advice, and it does not tell you whether a document is legally valid or will be accepted by any network.

Open the preflight and drop a JSON, UBL, CII, or Factur-X file to see which of these fire on your own invoice. Nothing you provide is uploaded.