pain.008.001.02 — NbOfTxs and CtrlSum wrong at both levels
Eine SEPA-Lastschrift, die sich verzählt und verrechnet — und zwar auf beiden Ebenen zugleich: Der Stapel enthält tatsächlich 2 Einzüge über 300,00 EUR, doch NbOfTxs nennt 3 und CtrlSum 250,00 — im PmtInf und noch einmal im GrpHdr. Das sind vier Fehler, nicht zwei: Kontrollsummen werden im Zahlungsstapel UND im Datei-Header geprüft, denn eine Mehrstapel-Datei kann einen korrekten Header-Wert über zwei falschen Stapelsummen tragen. Das XML ist wohlgeformt und das offizielle XSD akzeptiert es: Für ein Schema sind NbOfTxs und CtrlSum bloß Zahlen.
pain.008.001.02 — Ungültig
Eine SEPA-Lastschrift, die sich verzählt und verrechnet — und zwar auf beiden Ebenen zugleich: Der Stapel enthält tatsächlich 2 Einzüge über 300,00 EUR, doch NbOfTxs nennt 3 und CtrlSum 250,00 — im PmtInf und noch einmal im GrpHdr. Das sind vier Fehler, nicht zwei: Kontrollsummen werden im Zahlungsstapel UND im Datei-Header geprüft, denn eine Mehrstapel-Datei kann einen korrekten Header-Wert über zwei falschen Stapelsummen tragen. Das XML ist wohlgeformt und das offizielle XSD akzeptiert es: Für ein Schema sind NbOfTxs und CtrlSum bloß Zahlen.
Was diese Datei zeigt
Eine SEPA-Lastschrift, die sich verzählt und verrechnet — und zwar auf beiden Ebenen zugleich: Der Stapel enthält tatsächlich 2 Einzüge über 300,00 EUR, doch NbOfTxs nennt 3 und CtrlSum 250,00 — im PmtInf und noch einmal im GrpHdr. Das sind vier Fehler, nicht zwei: Kontrollsummen werden im Zahlungsstapel UND im Datei-Header geprüft, denn eine Mehrstapel-Datei kann einen korrekten Header-Wert über zwei falschen Stapelsummen tragen. Das XML ist wohlgeformt und das offizielle XSD akzeptiert es: Für ein Schema sind NbOfTxs und CtrlSum bloß Zahlen.
| Transaktionen | 2 |
|---|---|
| Summe | 300,00 € |
| Verfahren | CORE |
| Datum in der Datei | 2026-03-10 |
Die enthaltenen Fehler
- CtrlSumPmtInf CtrlSum mismatch: a payment batch declares 250.00 but its transactions total 300.00.
- NbOfTxsPmtInf NbOfTxs mismatch: a payment batch declares 3 but contains 2 transactions.
- CtrlSumCtrlSum mismatch: header declares 250.00 but calculated total is 300.00.
- NbOfTxsNbOfTxs mismatch: header declares 3 but found 2 transactions.
Wörtlich aus dem Validator zitiert, nicht umformuliert.
Alle Parteien, IBANs und Beträge unten sind fiktiv. Die IBANs sind strukturell gültig — sie bestehen die Mod-97-Prüfung — gehören aber zu keinem realen Konto.
Dateiinhalt
<?xml version="1.0" encoding="UTF-8"?>
<!--
ValidateFin sample file — SEPA Direct Debit, pain.008.001.02, BROKEN ON PURPOSE.
Expected validation result: INVALID — both control totals lie, at both levels.
The batch really contains 2 collections adding up to 300.00 EUR, but NbOfTxs says 3
and CtrlSum says 250.00 — in the PmtInf AND in the GrpHdr. That is four errors, not
two: the totals are checked on the payment batch and again on the file header, and a
file with several batches can very well have a correct header total sitting on top of
two batches whose own totals are wrong.
This is the classic symptom of a payment file assembled in a loop where one record
was dropped after the header was written. The XML is well-formed and the official XSD
accepts it: NbOfTxs and CtrlSum are just numbers to a schema.
All parties and account numbers are fictitious.
Reference page: https://validatefin.com/en/resources/samples/sepa-pain008-invalid-totals
License: CC-BY-4.0
-->
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrDrctDbtInitn>
<GrpHdr>
<MsgId>SDD-BADTOTALS-20260302</MsgId>
<CreDtTm>2026-03-02T11:00:00</CreDtTm>
<NbOfTxs>3</NbOfTxs>
<CtrlSum>250.00</CtrlSum>
<InitgPty>
<Nm>Editions Lumiere SARL</Nm>
</InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId>PMT-SDD-BADTOTALS-001</PmtInfId>
<PmtMtd>DD</PmtMtd>
<NbOfTxs>3</NbOfTxs>
<CtrlSum>250.00</CtrlSum>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
<LclInstrm>
<Cd>CORE</Cd>
</LclInstrm>
<SeqTp>RCUR</SeqTp>
</PmtTpInf>
<ReqdColltnDt>2026-03-10</ReqdColltnDt>
<Cdtr>
<Nm>Editions Lumiere SARL</Nm>
<PstlAdr>
<TwnNm>Paris</TwnNm>
<Ctry>FR</Ctry>
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>FR7610107001011234567890129</IBAN>
</Id>
<Ccy>EUR</Ccy>
</CdtrAcct>
<CdtrAgt>
<FinInstnId>
<BIC>CCBPFRPP</BIC>
</FinInstnId>
</CdtrAgt>
<ChrgBr>SLEV</ChrgBr>
<CdtrSchmeId>
<Id>
<PrvtId>
<Othr>
<Id>FR72ZZZ123456</Id>
<SchmeNm>
<Prtry>SEPA</Prtry>
</SchmeNm>
</Othr>
</PrvtId>
</Id>
</CdtrSchmeId>
<DrctDbtTxInf>
<PmtId>
<EndToEndId>E2E-BADTOTALS-2026-0301</EndToEndId>
</PmtId>
<InstdAmt Ccy="EUR">180.00</InstdAmt>
<DrctDbtTx>
<MndtRltdInf>
<MndtId>MNDT-2024-000731</MndtId>
<DtOfSgntr>2024-09-12</DtOfSgntr>
<AmdmntInd>false</AmdmntInd>
</MndtRltdInf>
</DrctDbtTx>
<DbtrAgt>
<FinInstnId>
<BIC>PSSTFRPP</BIC>
</FinInstnId>
</DbtrAgt>
<Dbtr>
<Nm>Camille Rousseau</Nm>
<PstlAdr>
<TwnNm>Lyon</TwnNm>
<Ctry>FR</Ctry>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>FR1420041010050500013M02606</IBAN>
</Id>
</DbtrAcct>
<RmtInf>
<Ustrd>Abonnement annuel 2026 - facture AB-2026-0731</Ustrd>
</RmtInf>
</DrctDbtTxInf>
<DrctDbtTxInf>
<PmtId>
<EndToEndId>E2E-BADTOTALS-2026-0302</EndToEndId>
</PmtId>
<InstdAmt Ccy="EUR">120.00</InstdAmt>
<DrctDbtTx>
<MndtRltdInf>
<MndtId>MNDT-2025-001188</MndtId>
<DtOfSgntr>2025-01-20</DtOfSgntr>
<AmdmntInd>false</AmdmntInd>
</MndtRltdInf>
</DrctDbtTx>
<DbtrAgt>
<FinInstnId>
<BIC>GEBABEBB</BIC>
</FinInstnId>
</DbtrAgt>
<Dbtr>
<Nm>Bureau Verhoeven BVBA</Nm>
<PstlAdr>
<TwnNm>Gent</TwnNm>
<Ctry>BE</Ctry>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>BE68539007547034</IBAN>
</Id>
</DbtrAcct>
<RmtInf>
<Ustrd>Abonnement annuel 2026 - facture AB-2026-0788</Ustrd>
</RmtInf>
</DrctDbtTxInf>
</PmtInf>
</CstmrDrctDbtInitn>
</Document>
Woher wir wissen, dass diese Ergebnisse stimmen
Jede Datei dieser Bibliothek läuft bei jedem Build durch den eigenen Validator der Website. Das oben genannte erwartete Ergebnis wird von einem automatisierten Test geprüft: Passt eine Datei nicht mehr zu dem, was diese Seite behauptet, schlägt der Build fehl. Zwei geerbte Fixtures wurden so vor der Veröffentlichung repariert — drei IBANs scheiterten an der Mod-97-Prüfung, und mehrere Namen nutzten Zeichen außerhalb des SEPA-Basiszeichensatzes.
SEPA-Lastschrift (pain.008)
- pain.008.001.02 — valid CORE direct debit
- pain.008.001.08 — valid CORE direct debit, collected after 2026-11-15
- pain.008.001.02 — mandate signed after the collection
- pain.008.001.08 — valid B2B direct debit, RCUR sequence
- pain.008.001.02 — valid CORE direct debit, FRST sequence
- pain.008.001.08 — valid one-off direct debit, OOFF sequence
- pain.008.001.02 — mandate identifier (MndtId) missing