La struttura completa di una fattura UBL spiegata passo dopo passo: dall'intestazione e le parti alle righe fattura e i totali IVA.
Una fattura UBL è composta da un insieme fisso di blocchi. Che si invino fatture tramite la piattaforma eConnect, tramite la PSB API o si costruisca un'integrazione propria, è estremamente utile sapere quali componenti contiene una fattura UBL e in quale ordine sono disposti. Questo articolo illustra la struttura dall'inizio alla fine.
Una UBL Invoice (versione 2.1) è composta da quattro aree principali, sempre in questo ordine:
All'interno di ogni area principale, gli elementi seguono un ordine XML fisso. Tale ordine è prescritto dallo standard UBL. Se si inverte l'ordine, la fattura viene rifiutata in fase di validazione.
Ogni fattura inizia con alcuni elementi obbligatori che identificano la fattura nel suo insieme:
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>F-2026-00042</cbc:ID>
<cbc:IssueDate>2026-03-08</cbc:IssueDate>
<cbc:DueDate>2026-04-07</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
Il CustomizationID comunica al destinatario quale profilo segue la fattura (ad esempio NLCIUS o BIS Billing V3). Il ProfileID identifica il processo aziendale. L'InvoiceTypeCode indica se si tratta di una fattura regolare (380), di una variante di nota di credito (381) o di una fattura self-billing (389).
Suggerimento: eConnect riconosce automaticamente il profilo sulla base del CustomizationID. Non è necessario configurare nulla.
Dopo l'identificazione seguono i riferimenti opzionali. Il più comune è il numero d'ordine (OrderReference), ma è possibile fare riferimento anche a un contratto, progetto o fattura precedentemente inviata:
<cac:OrderReference>
<cbc:ID>PO-2026-1234</cbc:ID>
</cac:OrderReference>
<cac:ContractDocumentReference>
<cbc:ID>CT-2025-5678</cbc:ID>
</cac:ContractDocumentReference>
Per le organizzazioni riceventi che elaborano le fatture automaticamente (si pensi a grandi aziende e pubbliche amministrazioni) il numero d'ordine è spesso obbligatorio. Senza numero d'ordine, la fattura non viene accettata.
Molte fatture contengono un PDF come allegato visivo. Questo viene incluso come file codificato in base64 nell'elemento AdditionalDocumentReference (EmbeddedDocumentBinaryObject). eConnect può aggiungere automaticamente questo allegato durante l'invio.
Se un PDF incorporato viene mostrato nella piattaforma eConnect come PDF della fattura (la visualizzazione fattura nel dashboard) dipende dal valore di rilevamento esatto in quel blocco:
cbc:DocumentDescription = CommercialInvoice (camelCase, senza spazio), oppureDocumentType = PrimaryImageIl testo "Commercial Invoice" significa la stessa cosa, ma il rilevamento della piattaforma segue esclusivamente il valore letterale esatto sopra indicato. Senza quel tag, il PDF conta come un allegato normale invece che come visualizzazione fattura. Vedere Stati — fattura in entrata solo XML o anche PDF?.
Una fattura UBL prevede almeno due parti e, opzionalmente, una terza e una quarta.
Il mittente della fattura. I dati obbligatori sono il nome, l'indirizzo e almeno un numero di identificazione fiscale (partita IVA o numero di registro). Nei Paesi Bassi, il numero KvK è l'ID Peppol primario:
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Kerkstraat 1</cbc:StreetName>
<cbc:CityName>Woerden</cbc:CityName>
<cbc:PostalZone>3441 AB</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>NL</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>NL123456789B01</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Voorbeeldbedrijf B.V.</cbc:RegistrationName>
<cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
Il destinatario della fattura. La struttura è identica a quella del fornitore. L'EndpointID è l'indirizzo Peppol verso cui la fattura viene instradata.
In alcuni casi sono presenti parti aggiuntive:
Questo blocco descrive come deve essere pagata la fattura. Contiene il metodo di pagamento (bonifico, addebito diretto), il numero di conto bancario e opzionalmente un riferimento di pagamento:
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>RF71 2348 2367</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>NL91ABNA0417164300</cbc:ID>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
Il codice 30 indica bonifico bancario, 49 addebito diretto automatico, 58 addebito diretto SEPA. L'elenco completo dei codici è definito in UNCL4461.
Un campo di testo libero che descrive le condizioni di pagamento. Alcuni sistemi lo utilizzano anche per lo sconto per pagamento anticipato (skonto).
Opzionale. Contiene la data di consegna e l'indirizzo di consegna, rilevante per le forniture di beni.
Prima dei totali IVA vengono inseriti eventuali sconti o maggiorazioni a livello di fattura. Ogni elemento ha un indicatore (true = maggiorazione, false = sconto), un importo e una categoria IVA:
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Korting</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
AllowanceCharge può comparire anche all'interno dell'elemento Price di una riga fattura, per mostrare la differenza tra il prezzo lordo e il prezzo unitario netto. A livello di prezzo si applica una restrizione: sono consentiti esclusivamente sconti (ChargeIndicator=false), non maggiorazioni. Inoltre, la regola di validazione BR-28 prescrive che il prezzo lordo non possa essere negativo. Maggiori dettagli si trovano nell'articolo su maggiorazioni e sconti.
L'IVA viene riepilogata per aliquota. Ogni aliquota ottiene un proprio TaxSubtotal con la base imponibile e l'importo IVA calcolato:
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">200.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
La categoria IVA S indica l'aliquota standard. Altri codici di uso frequente sono Z (aliquota zero), E (esente), AE (inversione contabile nazionale), K (intracomunitario) e G (esportazione).
Il blocco conclusivo della fattura. Qui figurano tutti gli importi che insieme compongono l'importo da pagare:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">242.00</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
<cbc:PayableAmount currencyID="EUR">242.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Il calcolo è: LineExtensionAmount (somma di tutti gli importi riga) meno AllowanceTotalAmount (sconti) più ChargeTotalAmount (maggiorazioni) = TaxExclusiveAmount. A questo si aggiunge l'IVA = TaxInclusiveAmount. Meno eventuali anticipi (PrepaidAmount) = PayableAmount. Questo calcolo deve essere esattamente corretto, altrimenti la validazione fallisce.
Ogni fattura ha almeno una riga. Una riga contiene un numero progressivo, la quantità fatturata, l'importo della riga, una descrizione dell'articolo e le informazioni IVA:
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consultancy-uren maart 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">25.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
Una riga fattura può anche contenere uno sconto o una maggiorazione (tramite un elemento AllowanceCharge annidato), fare riferimento a una riga d'ordine e contenere dati aggiuntivi sull'articolo come numeri articolo o informazioni contabili.
Tecnico: il campo
AccountingCostsulla riga fattura viene spesso utilizzato per inserire un centro di costo o una dimensione. I sistemi riceventi come AFAS, Unit4 e SAP possono leggere questo campo per la registrazione contabile automatica. Un'applicazione speciale è il Referentiegrootboekschema (RGS): inserendo un numero di riferimento RGS nell'AccountingCost, il software contabile ricevente può registrare automaticamente l'importo sul conto contabile corretto. La PSB trasporta l'elementoAccountingCostinvariato nell'UBL.
La forza di una fattura UBL risiede nella coerenza interna. I totali IVA devono corrispondere esattamente all'IVA per riga. I totali fattura devono essere esattamente la somma degli importi riga meno gli sconti più le maggiorazioni. Se c'è una differenza anche di un centesimo, la fattura viene rifiutata in fase di validazione.
eConnect valida automaticamente ogni fattura al momento dell'invio e fornisce un chiaro messaggio di errore in caso di discrepanze. Ove possibile, piccole deviazioni (come un campo mancante che può essere dedotto dal contesto) vengono riparate automaticamente.
eConnect fornisce un messaggio di errore chiaro che indica quale elemento non è corretto. Le cause più comuni sono errori di calcolo nei totali IVA, campi obbligatori mancanti o codici non validi. Le piccole deviazioni (come un campo mancante deducibile) vengono corrette automaticamente dove possibile.
Dipende da come fattura. Se crea fatture nella piattaforma eConnect, tutti gli elementi obbligatori vengono compilati automaticamente. Quando invia tramite API, deve fornire i campi richiesti Lei stesso, ma eConnect valida tutto e fornisce un feedback chiaro su dati mancanti o errati.
Sì. Ogni riga di fattura ha la propria categoria IVA e percentuale. Nel blocco TaxTotal, le aliquote vengono automaticamente raggruppate in TaxSubtotal separati. In questo modo può combinare su una singola fattura righe con il 21%, 9%, 0% o IVA esente.
Desidera comprendere meglio una parte specifica della fattura? Gli articoli seguenti approfondiscono gli scenari più comuni.
Suggerimento: utilizzi il Validatore eConnect gratuito per controllare la Sua fattura prima dell'invio. Il validatore non controlla solo la struttura dello schema, ma anche tutte le regole di calcolo e le code list.
Validi la Sua fattura