### What is CESOP? **CESOP** (Central Electronic System of Payment information) is an **EU-wide reporting framework** introduced to help tax authorities **detect VAT fraud in cross-border e-commerce**. Under CESOP, **payment service providers (PSPs)**β€”such as banks, payment institutions, e-money institutions, and card acquirersβ€”must **report information about cross-border payments** they process for merchants and payees. The system became **mandatory from 1 January 2024**. --- ### Purpose of CESOP CESOP was created to: - improve detection of **VAT fraud**, especially in online sales - increase **transparency of cross-border payments** - enable tax authorities to **cross-check payment data with VAT declarations** - close gaps where merchants sell across borders without properly declaring VAT ### What must be reported? PSPs must report, **per calendar quarter**, information about payees who: - receive **more than 25 cross-border payments** - from payers located in **EU Member States ### The Challenge of CESOP Compliance in 2025 Since January 2024, Payment Service Providers (PSPs) across the EU have been navigating the complex landscape of CESOP (Central Electronic System of Payment information) reporting. As we enter 2025, many organizations are still encountering validation errors that lead to rejected submissions, compliance delays, and operational overhead. After working extensively with CESOP implementations and analyzing validation patterns across multiple quarterly submissions, I've compiled this comprehensive guide to help PSPs understand, prevent, and resolve the most common CESOP errors. Based on the CESOP XSD User Guide v4.00 and Known Error List v1.18, here's the comprehensive list of all CESOP error codes: ## πŸ“Š CESOP Error Categories Overview |Category|Error Range|Impact|Count|Action| |---|---|---|---|---| |πŸ“‹ Message Header|10xxx|πŸ”΄ Full Rejection|11|Resubmit new message| |πŸ“„ Document Spec|20xxx|πŸ”΄ Full Rejection|10|Fix & resubmit new| |🏒 PSP/Representative|30xxx|πŸ”΄ Full Rejection|1|Update PSP data| |πŸ’° Reported Payee|40xxx|🟑 Partial Rejection|9|Submit correction| |πŸ”„ Transaction|45xxx|🟑 Partial Rejection|7|Submit correction| |βš™οΈ Technical|50xxx|πŸ”΄ Full Rejection|8|Fix technical issues| |**TOTAL**|||**47**|| --- ## πŸ”₯ Top 10 Most Common CESOP Errors |Rank|Error|Description|Frequency|Quick Fix| |---|---|---|---|---| |πŸ₯‡ 1|**40010**|Not cross-border payment|25%|Verify IBAN/BIC country extraction| |πŸ₯ˆ 2|**45050**|Duplicate transaction ID|18%|Generate unique IDs (PSP+Q+seq)| |πŸ₯‰ 3|**40030**|Invalid IBAN|15%|Validate checksum & length| |4|**20010**|Duplicate DocRefID|12%|Use unique UUID v4 per payee| |5|**45060**|Zero amount|10%|Exclude zero-value transactions| |6|**40050**|Missing transaction|8%|Include at least 1 transaction| |7|**10010**|Duplicate MessageRefID|5%|Generate new UUID v4| |8|**20100**|Invalid BIC|4%|Validate ISO 9362 format| |9|**45030**|Wrong DateTime|2%|Check date format & period| |10|Others|Various errors|1%|Check specific error docs| --- ## πŸ”΄ Full Rejection Errors - Must Resubmit ### Message Header Errors (10xxx) |Code|Error|Why It Happens|Fix It| |---|---|---|---| |10010|MessageRefID duplicate|UUID already used|Generate new UUID v4| |10020|Wrong timestamp|Future date or bad format|Use YYYY-MM-DDThh:mm:ss.SSSZ| |10030|Period before 2024|Quarter/year < Q1 2024|Use Q1 2024 or later| |10040|Wrong CorrMessageRefID|Invalid correlation|Use correct MessageRefID| |10050|Bad MessageRefID format|Not UUID v4|Generate proper UUID| |10070|Initial has corrections|New message with CESOP101|Use CESOP100 for new data| |10080|Correction has new data|Correction with CESOP100|Use CESOP101 for corrections| ### Document Errors (20xxx) |Code|Error|Why It Happens|Fix It| |---|---|---|---| |20010|DocRefID duplicate in file|Same UUID for multiple payees|Unique UUID per payee| |20020|DocRefID duplicate in system|UUID already used before|Generate new UUID v4| |20060|Missing CorrDocRefId|Correction without reference|Include original DocRefId| |20070|CorrDocRefId invalid|References deleted payee|Use last accepted DocRefId| |20100|Invalid PSP BIC|Wrong BIC format|Validate: 8-11 chars, ISO 9362| |20110|Missing ReportedPayee|No payees in message|Include at least one payee| ### PSP Errors (30xxx) |Code|Error|Why It Happens|Fix It| |---|---|---|---| |30010|Representative = PSP|Same ID for both|Use different IDs or omit Rep| --- ## 🟑 Partial Rejection Errors - Submit Correction ### Payee Errors (40xxx) |Code|Error|Impact|Solution| |---|---|---|---| |**40010**|❌ Not cross-border|**Payer & payee same country**|**Fix country extraction logic**| |40020|Wrong IBAN format|Invalid structure|Validate: CC + 2 digits + max 30 chars| |40030|IBAN not valid|Bad checksum or length|Verify mod 97 & country length| |40050|Missing transaction|No transactions for payee|Include at least 1 transaction| |40060|Account discrepancy|Mismatched attributes|Align type & country code| |40070|Invalid Rep BIC|Bad BIC format|Validate ISO 9362 standard| |40100|Bad account pair|Wrong multiple accounts|Use only: IBAN+BIC, OBAN+BIC, Other+BIC| ### Transaction Errors (45xxx) |Code|Error|Impact|Solution| |---|---|---|---| |45040|Duplicate TxnID in file|Same ID multiple times|Unique ID per transaction| |45050|Duplicate TxnID in system|ID already exists|Generate globally unique IDs| |45060|Zero amount|Amount = 0.00|Exclude or fix source data| |45030|Wrong DateTime|Invalid or out of period|Validate format & quarter| |45020|Multiple periods|Mixed quarters in file|One quarter per file| --- ## 🎯 Error 40010 Deep Dive - Cross-Border Detection **The #1 CESOP Error - 25% of all rejections** ### What Triggers Error 40010? |Scenario|Payer Country|Payee Country|Result|Error?| |---|---|---|---|---| |True cross-border|LT (Lithuania)|DE (Germany)|βœ… Valid|No| |True cross-border|DE (Germany)|UK (non-EU)|βœ… Valid|No| |Domestic payment|LT (Lithuania)|LT (Lithuania)|❌ Invalid|**YES - 40010**| |Bad data|LT (Lithuania)|NULL/Empty|❌ Invalid|**YES - 40010**| |Wrong extraction|LT (Lithuania)|LT (from bad IBAN)|❌ Invalid|**YES - 40010**| ### How to Extract Payee Country |Priority|Source|Example|Extraction| |---|---|---|---| |1️⃣ First|IBAN|LT12345678901234567890|First 2 chars: **LT**| |2️⃣ Second|BIC (if no IBAN)|HABALT22XXX|Chars 5-6: **LT**| |3️⃣ Third|Representative BIC|SWEDESS1XXX|Chars 5-6: **SE**| --- ## πŸ“‹ Error Resolution Strategy Table |Error Type|MessageRefID|MessageTypeIndic|Include Data|CorrMessageRefId|CorrDocRefId| |---|---|---|---|---|---| |**Full Rejection**|πŸ†• New UUID|CESOP100|All data|❌ No|❌ No| |**Partial Rejection**|πŸ†• New UUID|CESOP101|Only rejected payees|βœ… Original MessageRefID|βœ… Per payee| |**Voluntary Correction**|πŸ†• New UUID|CESOP101|Changed payees only|βœ… Original MessageRefID|βœ… Per payee| |**Add New Data**|πŸ†• New UUID|CESOP100|New payees only|❌ No|❌ No| --- ## ⚠️ Known Issues & Workarounds (KEL v1.19) |Issue|Affected Versions|Error Impact|Workaround|Status| |---|---|---|---|---| |Nicaragua IBAN (28 vs 32 chars)|v4.00-4.03|40030|Use OBAN or Other type|Fix in v1.7.0| |Transaction ID >60 chars truncated|All versions|45050|Keep IDs ≀60 characters|Fix in v1.6.2 HF1| |Same payee without account|Up to v1.6.1|20150/99999|Always provide account ID|Fixed in v1.6.2| |Transactions in deletions|v4.00-4.02|Data corruption|Never include in CESOP3|Fixed in v1.6.2| --- ## πŸ› οΈ SQL Quick Fixes ### Fix 40010 - Cross-Border Detection ```sql -- βœ… CORRECT: Proper cross-border logic SELECT t.* FROM transactions t WHERE -- Payer in EU t.payer_country_code IN (SELECT code FROM eu_countries) AND -- Payee in different country t.payer_country_code != COALESCE( SUBSTRING(t.payee_iban, 1, 2), SUBSTRING(t.payee_bic, 5, 2), SUBSTRING(t.representative_bic, 5, 2) ) ``` ### Fix 45050 - Unique Transaction IDs ```sql -- βœ… CORRECT: Generate unique IDs SELECT CONCAT( psp_id, '-', 'Q', quarter, '-', year, '-', LPAD(txn_sequence::text, 8, '0') ) AS transaction_identifier FROM transactions ``` ### Fix 45060 - Exclude Zero Amounts ```sql -- βœ… CORRECT: Filter out zeros SELECT * FROM transactions WHERE ABS(amount) > 0.01 -- Exclude zero and near-zero ``` --- ## βœ… Pre-Submission Checklist |Check|Status|What to Verify| |---|---|---| |πŸ” Validation|⬜|Run CESOP VM v1.7.0| |πŸ†” UUIDs|⬜|All UUIDs unique & valid v4 format| |πŸ“ File Size|⬜|Uncompressed < 1GB| |🌐 Cross-Border|⬜|All payments truly cross-border| |πŸ”’ Amounts|⬜|No zero amounts| |🏦 IBANs|⬜|Valid checksum & length per country| |πŸ“… Dates|⬜|All in correct reporting quarter| |🎯 Threshold|⬜|>25 payments per payee per quarter| |πŸ“ Encoding|⬜|UTF-8| |πŸ“Š Period|⬜|Q1-Q4 2024 or later| --- ## πŸ“ˆ Error Severity Impact |Severity|Error Codes|Files Affected|Recovery Time|Business Impact| |---|---|---|---|---| |πŸ”΄ **Critical**|10xxx, 20xxx, 30xxx, 50xxx|100% rejected|2-5 days|High - Complete resubmission| |🟑 **Medium**|40xxx, 45xxx|Partial (~30%)|1-2 days|Medium - Correction required| |🟒 **Low**|Warnings (none in CESOP)|0%|0 days|None - Informational| --- ## πŸ”— Essential Resources |Resource|Version|Purpose|Link| |---|---|---|---| |XSD User Guide|v6.00|Schema documentation|EC CESOP Portal| |Validation Module|v1.7.0|Pre-validate XML|EC Downloads| |Known Error List|v1.19|Official bugs & workarounds|BZSt Website| |CIRCABC Forum|Live|Community Q&A|CIRCABC Portal| --- ## πŸ’‘ Key Takeaways βœ… **Full Rejection (10-30xxx, 50xxx)**: Entire file rejected β†’ Generate NEW message βœ… **Partial Rejection (40-45xxx)**: Some payees rejected β†’ Submit CORRECTION βœ… **Error 40010** is #1 most common β†’ Focus on cross-border logic βœ… **UUID v4** required for all IDs β†’ Use proper generation βœ… **Pre-validate** with CESOP VM β†’ Catch errors before submission βœ… **Monitor KEL** monthly β†’ Stay updated on known issues --- **Questions? Share your CESOP challenges in the comments!** πŸ’¬ **#CESOP #FinTech #Compliance #VAT #PaymentServices #DevOps** ### **MESSAGE HEADER ERRORS (10xxx)** |Error Code|Description|Category| |---|---|---| |**10010**|MessageRefID is not unique|Duplicate Message| |**10020**|The 'Timestamp' element refers to a wrong value|Timestamp validation| |**10030**|The period is before 01/01/2024|Period validation| |**10040**|Wrong CorrMessageRefID|Correlation error| |**10050**|Wrong format of the MessageRefID|Format validation| |**10060**|Wrong format of the CorrMessageRefID|Format validation| |**10070**|An initial Payment Data message can only contain new data|Message type error| |**10080**|A correction message can only contain corrections and/or deletions|Message type error| |**10090**|Wrong MessageType|Message type validation| |**10100**|The reporting period cannot be updated|Period validation| |**10110**|CorrMessageRefId wrongly used in MessageSpec|Correlation error| ### **DOCUMENT SPECIFICATION ERRORS (20xxx)** |Error Code|Description|Category| |---|---|---| |**20010**|DocRefID is not unique within the message|Duplicate DocRef| |**20020**|DocRefID is not unique within the system|Duplicate DocRef| |**20030**|Wrong DocRefID format|Format validation| |**20040**|Wrong CorrDocRefId value|Correlation error| |**20050**|CorrDocRefId for new data|Correlation error| |**20060**|Missing CorrDocRefId|Missing field| |**20070**|CorrDocRefId no longer valid|Correlation error| |**20100**|Invalid PSP's BIC format|BIC validation| |**20110**|Missing ReportedPayee|Missing required element| |**20150**|Same payee reported under two different ReportedPayee elements (XSD v4.03)|Duplicate payee| ### **REPORTING PSP / REPRESENTATIVE ERRORS (30xxx)** |Error Code|Description|Category| |---|---|---| |**30010**|Business identifier of the Representative is equal to the Business Identifier of the Reporting PSP|PSP/Representative conflict| ### **REPORTED PAYEE ERRORS (40xxx)** |Error Code|Description|Category| |---|---|---| |**40010**|The reported transaction does not represent cross-border payment|**Cross-border validation**| |**40020**|Wrong IBAN format|IBAN validation| |**40030**|IBAN is not valid|IBAN validation| |**40040**|ReportedPayee listed in the No Payment Data for the requested period message|Payee conflict| |**40050**|The 'ReportedTransaction' element is missing|Missing transaction| |**40060**|Discrepancy in the 'AccountIdentifier' attributes|Account validation| |**40070**|Invalid Representative's BIC format|BIC validation| |**40080**|Discrepancy between 'AccountIdentifier' and 'Representative'|Account/Representative conflict| |**40100**|Invalid account identifier pair (XSD v4.03 - multiple accounts)|Account pairing validation| ### **REPORTED TRANSACTION ERRORS (45xxx)** |Error Code|Description|Category| |---|---|---| |**45010**|Wrong value of the 'IsRefund' element in the 'AmountCurrency' element|Refund validation| |**45020**|The Payment Data message contains information for multiple periods|Period consistency| |**45030**|The 'DateTime' element refers to a wrong value|Date validation| |**45040**|The 'TransactionIdentifier' element is not unique within the Payment Data message|Duplicate transaction ID| |**45050**|The 'TransactionIdentifier' element is not unique within the system|Duplicate transaction ID| |**45060**|Zero value for 'Amount' element|Amount validation| |**45080**|Same transaction date provided more than once|Duplicate date| ### **TECHNICAL ERRORS (50xxx)** |Error Code|Description|Category| |---|---|---| |**50010**|The XML message is not well formed|XML parsing| |**50020**|Failed Decryption|Encryption error| |**50030**|Failed Decompression|Compression error| |**50040**|Failed Signature Check|Security error| |**50050**|Failed Threat Scan|Security scan| |**50060**|Failed Virus Scan|Security scan| |**50070**|Message size exceeded|File size limit| |**50080**|Too many errors detected|Error threshold| ### **CUSTOM/OTHER ERRORS (99xxx)** | Error Code | Description | Category | | ---------- | --------------------------------------------------- | --------------- | | **99000** | Same payees detected (deprecated in v1.6.2) | Duplicate payee | | **99999** | Custom error / Same payee reported (XSD v4.00-4.02) | Generic error | ---