Skip to main content

Document Types

GoRoute supports the full range of Peppol BIS 3.0 document types. This guide covers each document type, its purpose, and when to use it.

Supported Documentsโ€‹

Primary Documentsโ€‹

Document TypeUBL TypeProcess IDUse Case
InvoiceInvoice-2BIS Billing 3.0Standard invoices
Credit NoteCreditNote-2BIS Billing 3.0Refunds, corrections
Self-Billing InvoiceInvoice-2BIS Billing 3.0Buyer-issued invoices

Ordering Documentsโ€‹

Document TypeUBL TypeProcess IDUse Case
OrderOrder-2BIS Ordering 3.0Purchase orders
Order ResponseOrderResponse-2BIS Ordering 3.0Order confirmations
Order ChangeOrderChange-2BIS Ordering 3.0Order modifications

Catalogue Documentsโ€‹

Document TypeUBL TypeProcess IDUse Case
CatalogueCatalogue-2BIS Catalogue 3.0Product catalogs
Catalogue ResponseApplicationResponse-2BIS Catalogue 3.0Catalog confirmations

Logistics Documentsโ€‹

Document TypeUBL TypeProcess IDUse Case
Despatch AdviceDespatchAdvice-2BIS Despatch 3.0Shipping notifications
Invoice ResponseApplicationResponse-2BIS MLR 3.0Invoice status updates
A Despatch Advice is not the same thing as a delivery note

The Despatch Advice above is a Peppol document: structured UBL, transmitted over the network to the buyer's system so their software knows a shipment is coming.

A delivery note is the printed slip that travels in the box. GoRoute can issue one, but it is not a Peppol document at all โ€” it is never transmitted, never reported and never validated against a BIS rule set. The same is true of a pro forma invoice, which is likewise not one of the document types on this page. See Pro Forma Invoices & Delivery Notes.

Invoice (Most Common)โ€‹

The Invoice is the most frequently used document type on Peppol.

Required Fieldsโ€‹

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">

<!-- Profile and Customization -->
<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>

<!-- Invoice Identification -->
<cbc:ID>INV-2024-001</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:DueDate>2024-02-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<!-- Seller Information -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Supplier BV</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Buyer Information -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0106">87654321</cbc:EndpointID>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Customer BV</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>

<!-- Tax Summary -->
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">21.00</cbc:TaxAmount>
</cac:TaxTotal>

<!-- Totals -->
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">121.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

<!-- Invoice Lines -->
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consulting Services</cbc:Name>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">100.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>

Invoice Type Codesโ€‹

CodeDescriptionUse Case
380Commercial InvoiceStandard invoice
381Credit NoteCorrections/refunds
384Corrected InvoiceInvoice with corrections
389Self-billed InvoiceBuyer issues invoice
751Invoice InformationFor reference only
These are the international codes. Some national systems differ โ€” Nigeria reverses two of them

The codes above are the UNCL1001 international list, which is what Peppol uses. A national tax system may publish its own list, and where it does, its list is the one that governs a filing in that country.

Nigeria differs on exactly the two codes you are most likely to use. On the Nigeria Revenue Service's own invoice-type list, 381 is the commercial invoice and 380 is the credit note โ€” the reverse of the table above. Carrying 380 from a Peppol integration into a Nigerian one files a credit note, which Nigeria then rejects for want of a reference to the invoice being amended.

Before you send to Nigeria, read the invoice-type row of the Nigeria country guide.

Credit Noteโ€‹

Credit Notes are used to correct or cancel invoices.

When to Useโ€‹

  • Customer returned goods
  • Pricing error on original invoice
  • Service not delivered
  • Discount applied after invoicing

Exampleโ€‹

<CreditNote xmlns="urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2">
<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>CN-2024-001</cbc:ID>
<cbc:IssueDate>2024-01-20</cbc:IssueDate>
<cbc:CreditNoteTypeCode>381</cbc:CreditNoteTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<!-- Reference to original invoice -->
<cac:BillingReference>
<cac:InvoiceDocumentReference>
<cbc:ID>INV-2024-001</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
</cac:InvoiceDocumentReference>
</cac:BillingReference>

<!-- ... rest of credit note ... -->
</CreditNote>

Document Identifiersโ€‹

Each document type has specific identifiers:

Document Type URIsโ€‹

DOCUMENT_TYPES = {
"invoice": "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"credit_note": "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2",
"order": "urn:oasis:names:specification:ubl:schema:xsd:Order-2",
"order_response": "urn:oasis:names:specification:ubl:schema:xsd:OrderResponse-2",
"despatch_advice": "urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2",
"catalogue": "urn:oasis:names:specification:ubl:schema:xsd:Catalogue-2"
}

Process Identifiersโ€‹

PROCESS_IDS = {
"billing": "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0",
"ordering": "urn:fdc:peppol.eu:2017:poacc:ordering:01:1.0",
"catalogue": "urn:fdc:peppol.eu:2017:poacc:catalogue:01:1.0",
"despatch": "urn:fdc:peppol.eu:2017:poacc:despatch:01:1.0",
"mlr": "urn:fdc:peppol.eu:2017:poacc:mlr:01:1.0"
}

Sending Documents via APIโ€‹

Send an Invoiceโ€‹

import requests

# Send a Peppol invoice โ€” the UBL XML goes in `document` as a string
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/documents",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"receiver_scheme": "0106",
"receiver_id": "12345678",
"document": invoice_xml
}
)

result = response.json()
print(f"Transaction ID: {result['transaction_id']}")
print(f"Status: {result['status']}")

Send a Credit Noteโ€‹

# Send a credit note referencing an invoice
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/documents",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"receiver_scheme": "0106",
"receiver_id": "12345678",
"document_type": (
"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote"
"##urn:cen.eu:en16931:2017#compliant#"
"urn:fdc:peppol.eu:2017:poacc:billing:3.0::2.1"
),
"document": credit_note_xml
}
)

Validation Rulesโ€‹

All documents are validated before sending:

Layer 1: XSD Validationโ€‹

# UBL 2.1 schema validation
# Checks document structure

Layer 2: Business Rulesโ€‹

# Mathematical calculations
# - Line totals match item ร— quantity ร— price
# - Tax amounts are correct
# - Invoice total = sum of lines + tax

Layer 3: Schematron Rulesโ€‹

# EN16931 European Standard
# Peppol BIS 3.0 specific rules
# Country-specific rules (XRechnung, etc.)
Pre-Validation

Use the validation endpoint before sending to catch errors early:

response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/documents/validate",
headers={"X-API-Key": "your_api_key"},
json={"document": invoice_xml}
)

Document Capabilitiesโ€‹

When you register on Peppol, you declare which document types you can receive:

# Register a participant for invoice and credit note reception
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/participants",
headers={"X-API-Key": "your_api_key"},
json={
"scheme": "0106",
"identifier": "12345678",
"display_name": "Example BV",
"country": "NL",
"document_types": [
"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice",
"urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2::CreditNote"
]
}
)

participant_id = response.json()["id"]

Check whether the registration is published in the SMP with GET /api/v1/participants/{participant_id}/smp-status.

Attachmentsโ€‹

Peppol documents can include attachments:

<cac:AdditionalDocumentReference>
<cbc:ID>Supporting Document</cbc:ID>
<cac:Attachment>
<cbc:EmbeddedDocumentBinaryObject
mimeCode="application/pdf"
filename="contract.pdf">
<!-- Base64 encoded content -->
JVBERi0xLjQKJeLjz9MKMyAw...
</cbc:EmbeddedDocumentBinaryObject>
</cac:Attachment>
</cac:AdditionalDocumentReference>

Supported MIME Typesโ€‹

MIME TypeExtension
application/pdf.pdf
image/png.png
image/jpeg.jpeg/.jpg
text/csv.csv
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xlsx

GoRoute sets no size limit on an attachment. The limits that do exist, and what the receiving access point may do about a large file, are on the Attachments page.

Next Stepsโ€‹