Skip to main content

Globalization

GoRoute supports sending invoices across the global Peppol network with proper localization for different countries, languages, and currencies. This guide covers how to handle international invoicing requirements.

Multi-Currency Support​

Supported Currencies​

Peppol BIS Billing 3.0 supports all ISO 4217 currency codes. Common currencies include:

CodeCurrencySymbol
EUREuro€
USDUS Dollar$
GBPBritish PoundΒ£
SEKSwedish Kronakr
NOKNorwegian Kronekr
DKKDanish Kronekr
CHFSwiss FrancCHF
PLNPolish ZlotyzΕ‚
SGDSingapore DollarS$
AUDAustralian DollarA$

Setting Invoice Currency​

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<!-- Document currency (for line amounts and totals) -->
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<!-- Tax currency if different from document currency -->
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>

<!-- ... -->
</Invoice>

Multi-Currency Invoices​

When the tax reporting currency differs from the invoice currency:

<cbc:DocumentCurrencyCode>USD</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>

<cac:TaxTotal>
<!-- Tax in document currency (USD) -->
<cbc:TaxAmount currencyID="USD">1200.00</cbc:TaxAmount>
</cac:TaxTotal>

<cac:TaxTotal>
<!-- Tax in reporting currency (EUR) -->
<cbc:TaxAmount currencyID="EUR">1100.00</cbc:TaxAmount>
</cac:TaxTotal>

Multi-Language Support​

Invoice Notes and Descriptions​

Include multiple languages in text fields using the languageID attribute:

<cbc:Note languageID="en">Payment due within 30 days</cbc:Note>
<cbc:Note languageID="nl">Betaling binnen 30 dagen</cbc:Note>
<cbc:Note languageID="de">Zahlung innerhalb von 30 Tagen</cbc:Note>

Item Descriptions​

<cac:InvoiceLine>
<cac:Item>
<cbc:Description languageID="en">Professional consulting services</cbc:Description>
<cbc:Description languageID="fr">Services de conseil professionnel</cbc:Description>
<cbc:Name>Consulting Services</cbc:Name>
</cac:Item>
</cac:InvoiceLine>

Supported Languages​

CodeLanguage
enEnglish
nlDutch
deGerman
frFrench
itItalian
esSpanish
ptPortuguese
plPolish
svSwedish
noNorwegian
daDanish
fiFinnish

Country-Specific Localization​

Tax Identification​

Different countries require different tax identifier formats:

<!-- Netherlands (BTW) -->
<cac:PartyTaxScheme>
<cbc:CompanyID>NL123456789B01</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>

<!-- Italy (Partita IVA + Codice Fiscale) -->
<cac:PartyTaxScheme>
<cbc:CompanyID>IT12345678901</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:CompanyID schemeID="0210">RSSMRA85M01H501Z</cbc:CompanyID>
</cac:PartyLegalEntity>

Address Formats​

Addresses vary significantly by country:

<!-- German address -->
<cac:PostalAddress>
<cbc:StreetName>Hauptstraße 42</cbc:StreetName>
<cbc:CityName>Berlin</cbc:CityName>
<cbc:PostalZone>10115</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>

<!-- UK address (with county) -->
<cac:PostalAddress>
<cbc:StreetName>10 Downing Street</cbc:StreetName>
<cbc:CityName>London</cbc:CityName>
<cbc:PostalZone>SW1A 2AA</cbc:PostalZone>
<cbc:CountrySubentity>Greater London</cbc:CountrySubentity>
<cac:Country>
<cbc:IdentificationCode>GB</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>

<!-- Singapore address (with building name) -->
<cac:PostalAddress>
<cbc:StreetName>1 Raffles Place</cbc:StreetName>
<cbc:AdditionalStreetName>One Raffles Place Tower 1</cbc:AdditionalStreetName>
<cbc:CityName>Singapore</cbc:CityName>
<cbc:PostalZone>048616</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SG</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>

Date and Time Formats​

ISO 8601 Dates​

All dates in UBL must use ISO 8601 format:

<!-- Date only (YYYY-MM-DD) -->
<cbc:IssueDate>2026-01-26</cbc:IssueDate>
<cbc:DueDate>2026-02-26</cbc:DueDate>

<!-- Date with time (for timestamps) -->
<cbc:IssueTime>10:30:00</cbc:IssueTime>

Timezone Handling​

GoRoute processes all times in UTC. Include timezone information for clarity:

<cbc:IssueDate>2026-01-26</cbc:IssueDate>
<cbc:IssueTime>10:30:00+01:00</cbc:IssueTime>

Number Formatting​

Decimal Precision​

Use periods as decimal separators and maintain precision:

<!-- Correct -->
<cbc:PriceAmount currencyID="EUR">1234.56</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1.00</cbc:BaseQuantity>

<!-- Incorrect (comma decimal separator) -->
<cbc:PriceAmount currencyID="EUR">1234,56</cbc:PriceAmount>

Quantity Units​

Use UN/ECE Recommendation 20 unit codes:

CodeUnitDescription
C62UnitOne piece/item
HURHourHourly rate
DAYDayDaily rate
MONMonthMonthly rate
KGMKilogramWeight
MTRMeterLength
LTRLiterVolume
EAEachEach item
<cbc:InvoicedQuantity unitCode="HUR">40.00</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">4000.00</cbc:LineExtensionAmount>

Country-Specific Rules (CIUS)​

Some countries have additional requirements beyond standard Peppol BIS:

Germany (XRechnung)​

<!-- Buyer Reference is mandatory -->
<cbc:BuyerReference>04011000-12345-67</cbc:BuyerReference>

<!-- Leitweg-ID required for public sector -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="9930">04011000-12345-67</cbc:EndpointID>
</cac:Party>
</cac:AccountingCustomerParty>

Italy (FatturaPA)​

<!-- Codice Destinatario -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0201">A1B2C3D</cbc:EndpointID>
</cac:Party>
</cac:AccountingCustomerParty>

<!-- Regime Fiscale -->
<cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyTaxScheme>
<cbc:TaxLevelCode>RF01</cbc:TaxLevelCode>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>

France (Factur-X)​

<!-- SIRET number -->
<cac:PartyLegalEntity>
<cbc:CompanyID schemeID="0009">12345678901234</cbc:CompanyID>
</cac:PartyLegalEntity>

API Localization​

Setting Response Language​

Request localized error messages and responses:

curl -X POST https://app.goroute.ai/peppol-api/documents/validate \
-H "X-API-Key: your-api-key" \
-H "Accept-Language: nl-NL" \
-d @invoice.xml

Localized Validation Messages​

{
"valid": false,
"errors": [
{
"rule": "BR-16",
"message": "Een factuur moet minimaal één factuurregel bevatten",
"message_en": "An Invoice shall have at least one Invoice line"
}
]
}

Best Practices​

1. Use ISO Standards​

Always use standardized codes:

  • Countries: ISO 3166-1 alpha-2 (e.g., NL, DE)
  • Currencies: ISO 4217 (e.g., EUR, USD)
  • Languages: ISO 639-1 (e.g., en, nl)
  • Units: UN/ECE Rec 20 (e.g., C62, HUR)

2. Validate for Target Country​

Use our validation API with country context:

curl -X POST https://app.goroute.ai/peppol-api/documents/validate \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"document": "<Invoice>...</Invoice>",
"target_country": "DE",
"cius": "XRechnung"
}'

3. Handle Character Encoding​

Always use UTF-8 encoding:

<?xml version="1.0" encoding="UTF-8"?>

Special characters should work natively:

  • ΓΌ, ΓΆ, Γ€ (German umlauts)
  • Γ©, Γ¨, Γͺ (French accents)
  • ΓΈ, Γ¦, Γ₯ (Nordic characters)

4. Include Fallback Text​

When using multiple languages, include English as fallback:

<cbc:Note languageID="nl">Betaling binnen 30 dagen</cbc:Note>
<cbc:Note languageID="en">Payment due within 30 days</cbc:Note>

Next Steps​