Build customer revenue data into the Annual Client Listing XML (Intervat)
Skill: Convert customer revenue data into the Intervat annual VAT client-listing XML
Region: Belgium (België / Belgique)
Category: VAT — Annual Client Listing (listing annuel des clients / jaarlijkse klantenlisting), filed via Intervat
Does: Takes a year's customer-revenue data and produces the Intervat ClientListingConsignment / ClientListing XML — the annual listing of Belgian VAT-registered customers to whom the declarant supplied more than €250 (excl. VAT) during the calendar year, with one Client record per customer (VAT number, turnover, VAT charged) plus declarant header and grand totals.
Standard: FPS Finances Intervat — ClientListingConsignment (namespace http://www.minfin.fgov.be/ClientListingConsignment + …/InputCommon), schema version aligned with the current Intervat release
This XML is the file you upload to the Intervat portal and sign there; the AI does not file it. The annual client listing is due by 31 March of the year following the reporting year. List only Belgian VAT-registered customers whose annual turnover (excl. VAT) exceeds €250; exclude private individuals and exempt-only counterparts. A nil listing (no qualifying clients) is filed with the nil flag; a replacement listing is filed for the same year via the amend flow. Thresholds, schema, and the deadline can change — verify against the current Intervat XSD and FOD Financiën / SPF Finances instructions before filing.
When this applies
- A Belgian VAT taxpayer must, once a year, list every Belgian VAT-registered client to whom total supplies (excl. VAT) over the calendar year exceeded €250. The listing is uploaded as Intervat XML.
- Out of scope: customers without a Belgian VAT number (foreign clients, private consumers), clients at or below the €250 threshold, and intra-Community sales (those go on the EC sales listing, a separate return). The small-business franchise taxpayer still files the client listing.
- If there are no qualifying clients, file a nil listing (
Nihil/ClientListingNihil). A correction replaces the prior listing for the same year.
Build procedure
- Read the source. Accept customer-revenue data as CSV/JSON (one row per customer or per invoice), spreadsheet export, or pasted figures. Identify the declarant VAT number, the reporting year, and per customer: VAT number, annual turnover excl. VAT, and total VAT charged.
- Filter and aggregate. Keep only customers with a Belgian VAT number and annual turnover > €250 (excl. VAT). If the source is per-invoice, sum turnover and VAT per customer first. If a customer's VAT number is missing or its country is unclear, stop and ask — do not guess or drop a record silently.
- Normalize.
- VAT numbers (declarant and clients) → bare 10 digits where the schema's
VATNumberfield requires it (theBEprefix is implied for the country field). - Amounts → EUR, 2 decimals, dot separator, non-negative, no thousands separator.
- Year → 4 digits.
- VAT numbers (declarant and clients) → bare 10 digits where the schema's
- Compute the grand totals (sum of turnovers, sum of VAT, count of clients) per the calculation rules; recompute — never copy a printed grand total.
- Emit the
ClientListingConsignmentwith oneClientListingper declarant, aDeclarantheader, oneClientblock per qualifying customer, and theClientListing-level turnover/VAT/count totals. Follow the document structure and worked example. - Validate against the checklist and the Intervat XSD before uploading.
Source → ClientListing field map
| From the source | → Target element / field |
|---|---|
| Reporting year | ns2:ClientListing/@SequenceNumber context + ns2:Period/ns2:Year |
| Declarant VAT number | ns2:Declarant/VATNumber |
| Declarant name | ns2:Declarant/Name |
| Declarant address (street, post, city, BE) | ns2:Declarant/Street, PostCode, City, CountryCode |
| Reporting year | ns2:ClientListing/ns2:Period/ns2:Year |
| Number of clients listed | ns2:ClientListing/@ClientsNbr |
| Sum of all turnovers | ns2:ClientListing/ns2:TurnOverSum |
| Sum of all VAT amounts | ns2:ClientListing/ns2:VATAmountSum |
| (per client) VAT number | ns2:Client/ns2:CompanyVATNumber/VATNumber |
| (per client) annual turnover excl. VAT | ns2:Client/ns2:TurnOver |
| (per client) total VAT charged | ns2:Client/ns2:VATAmount |
| Nil listing flag | ns2:ClientListing/ns2:Nihil (or omit clients) |
| Replacement of a prior listing | ns2:ReplacedClientListing/ns2:Year |
Every required output field appears above. Repeat ns2:Client once per qualifying customer.
Document structure
ClientListingConsignment (root; one upload, ≥1 listing)
├── @ClientListingsNbr (count of listings in the file)
└── ns2:ClientListing (one per declarant per year)
├── @SequenceNumber (1, 2, … within the file)
├── @ClientsNbr (number of Client blocks)
├── @TurnOverSum (grand total turnover, may also be element)
├── @VATAmountSum (grand total VAT)
├── ns2:ReplacedClientListing (optional — Year of the listing being replaced)
├── ns2:Declarant
│ ├── VATNumber (BE 10 digits)
│ ├── Name
│ ├── Street / PostCode / City
│ └── CountryCode (BE)
├── ns2:Period
│ └── ns2:Year (yyyy — the reporting year)
├── ns2:Client (repeatable — omit when Nihil)
│ ├── @SequenceNumber (1, 2, … within the listing)
│ ├── ns2:CompanyVATNumber/VATNumber (client BE VAT, 10 digits)
│ ├── ns2:TurnOver (annual turnover excl. VAT, > 250.00)
│ └── ns2:VATAmount (total VAT charged to the client)
├── ns2:Nihil (optional — true for a nil listing)
└── ns2:Comment (optional free text)
Mandatory: Declarant/VATNumber, Period/Year, and either ≥1 Client or the Nihil flag. The grand totals (TurnOverSum, VATAmountSum, ClientsNbr) must reconcile with the listed Client blocks.
Code tables
Listing type
| Value | Meaning |
|---|---|
| (clients present) | Normal listing — one Client per qualifying customer |
Nihil = true |
Nil listing — no qualifying clients this year, no Client blocks |
ReplacedClientListing/Year present |
Replacement — supersedes the previously filed listing for that year |
Inclusion threshold
| Rule | Value |
|---|---|
| Minimum annual turnover (excl. VAT) to list a client | > €250.00 |
| Client identifier required | Belgian VAT number (10 digits) — non-Belgian / non-registered clients excluded |
CountryCode
| Code | Meaning |
|---|---|
BE |
Belgium — declarant and all listed clients are Belgian VAT-registered |
Period
| Element | Values |
|---|---|
ns2:Period/ns2:Year |
4-digit reporting calendar year (e.g. 2025) |
Calculation rules
- Per-client turnover = Σ of that customer's net (excl. VAT) sales for the year, rounded to 2 decimals. Include a client only if this exceeds 250.00.
- Per-client VAT = Σ of VAT charged to that customer for the year, 2 decimals.
- TurnOverSum = Σ of every
Client/TurnOver, 2 decimals. - VATAmountSum = Σ of every
Client/VATAmount, 2 decimals. - ClientsNbr = count of
Clientblocks (0 for a nil listing). - Amounts are non-negative EUR, 2 decimals, dot separator, no thousands separator.
- Recompute
TurnOverSum,VATAmountSum, andClientsNbrfrom theClientblocks; never copy a printed grand total — flag any mismatch with the source.
Worked example (end-to-end)
Input — customer revenue export (year 2025)
Declarant: Voorbeeld Diensten BV, VAT BE 0888.222.333, Kerkstraat 12, 9000 Gent, BE
Reporting year: 2025
Customer A — Klant Industrie NV, VAT BE 0455.111.222 — turnover 50000.00, VAT 10500.00
Customer B — Bouwbedrijf Janssens, VAT BE 0623.444.555 — turnover 1200.00, VAT 252.00
Customer C — Kleine Klant (private individual, no VAT number) — turnover 800.00
Customer D — Mini Order BV, VAT BE 0701.888.999 — turnover 180.00, VAT 37.80
Filtering: Customer C has no VAT number → excluded. Customer D turnover 180.00 ≤ 250.00 → excluded. Customers A and B qualify.
After extraction + normalization (intermediate)
{
"declarant": { "vat": "0888222333", "name": "Voorbeeld Diensten BV",
"street": "Kerkstraat 12", "post": "9000", "city": "Gent", "country": "BE" },
"year": "2025",
"clients": [
{ "seq": 1, "vat": "0455111222", "turnover": 50000.00, "vat": 10500.00 },
{ "seq": 2, "vat": "0623444555", "turnover": 1200.00, "vat": 252.00 }
],
"totals": { "clientsNbr": 2, "turnOverSum": 51200.00, "vatAmountSum": 10752.00 }
}
Output — Intervat ClientListingConsignment XML
<?xml version="1.0" encoding="UTF-8"?>
<ns2:ClientListingConsignment xmlns="http://www.minfin.fgov.be/InputCommon"
xmlns:ns2="http://www.minfin.fgov.be/ClientListingConsignment"
ClientListingsNbr="1">
<ns2:ClientListing SequenceNumber="1" ClientsNbr="2"
TurnOverSum="51200.00" VATAmountSum="10752.00">
<ns2:Declarant>
<VATNumber>0888222333</VATNumber>
<Name>Voorbeeld Diensten BV</Name>
<Street>Kerkstraat 12</Street>
<PostCode>9000</PostCode>
<City>Gent</City>
<CountryCode>BE</CountryCode>
</ns2:Declarant>
<ns2:Period>
<ns2:Year>2025</ns2:Year>
</ns2:Period>
<ns2:Client SequenceNumber="1">
<ns2:CompanyVATNumber>
<VATNumber>0455111222</VATNumber>
</ns2:CompanyVATNumber>
<ns2:TurnOver>50000.00</ns2:TurnOver>
<ns2:VATAmount>10500.00</ns2:VATAmount>
</ns2:Client>
<ns2:Client SequenceNumber="2">
<ns2:CompanyVATNumber>
<VATNumber>0623444555</VATNumber>
</ns2:CompanyVATNumber>
<ns2:TurnOver>1200.00</ns2:TurnOver>
<ns2:VATAmount>252.00</ns2:VATAmount>
</ns2:Client>
</ns2:ClientListing>
</ns2:ClientListingConsignment>
Normalisations shown: VAT numbers BE 0888.222.333 / BE 0455.111.222 / BE 0623.444.555 → bare 0888222333 / 0455111222 / 0623444555; Customer C dropped (no VAT number); Customer D dropped (180.00 ≤ 250.00 threshold); amounts to 2dp dot-decimal; ClientsNbr recomputed = 2; TurnOverSum = 50000.00 + 1200.00 = 51200.00; VATAmountSum = 10500.00 + 252.00 = 10752.00. Upload to Intervat and sign there by 31 March 2026 for reporting year 2025.
Validation checklist
- Only Belgian VAT-registered clients with annual turnover > €250.00 (excl. VAT) are listed; AI asked about any record with a missing/ambiguous VAT number rather than guessing or silently dropping it
- Private individuals and clients ≤ €250.00 excluded; intra-Community sales kept off this listing
-
Declarant/VATNumberand everyClientVATNumberare bare 10 digits;CountryCode=BE -
Period/Yearis the 4-digit reporting calendar year - One
ns2:Clientper qualifying customer withTurnOverandVATAmount; per-client turnover summed across the year -
ClientsNbr= number ofClientblocks;TurnOverSum= Σ turnovers;VATAmountSum= Σ VAT — all recomputed and reconciled - Amounts non-negative, 2dp, dot separator, no thousands separator
- Nil listing filed with the
Nihilflag and noClientblocks when there are no qualifying clients; corrections filed as a replacement (ReplacedClientListing/Year) for the same year - File validated against the current Intervat ClientListing XSD, then uploaded and signed by the 31 March deadline
Last updated: 2026-06-13 — verify the current €250 turnover threshold, the ClientListingConsignment schema namespace/version, and the 31 March filing deadline against the current FOD Financiën / SPF Finances Intervat documentation before use.