FinchContext
Run with

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


Build procedure

  1. 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.
  2. 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.
  3. Normalize.
    • VAT numbers (declarant and clients) → bare 10 digits where the schema's VATNumber field requires it (the BE prefix is implied for the country field).
    • Amounts → EUR, 2 decimals, dot separator, non-negative, no thousands separator.
    • Year → 4 digits.
  4. Compute the grand totals (sum of turnovers, sum of VAT, count of clients) per the calculation rules; recompute — never copy a printed grand total.
  5. Emit the ClientListingConsignment with one ClientListing per declarant, a Declarant header, one Client block per qualifying customer, and the ClientListing-level turnover/VAT/count totals. Follow the document structure and worked example.
  6. 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


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


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.