⚠️ Warning: This page is not served over HTTPS. Your connection may not be secure. Dismiss

PEPPOL Encyclopedia

NetSuite PEPPOL BIS 3.0 Reference Guide

Forgot password?

⏱️ Your session will expire in 60 seconds

⚙️ Admin Panel

Registered Users

Recent Activity

System Settings

⭐ My Bookmarks
?
Guest
User
👤 My Profile
⭐ My Bookmarks
🔑 Change Password
🚪 Sign Out

⚡ Quick Reference Card

Essential information at a glance - print this page for a one-page cheat sheet!

🔑 Critical Fields (Equinor)

PO Number
otherrefnum → Exactly 10 digits
Order Line Ref
custcol_cgi_ehf_orderlinereference → Format: 10/20 or 10#20
SES Number
custcol_cgi_ehf_buyers_item_id → Service Entry Sheet
Buyer EndpointID
custbody_buyer_elec_add_ehf → 923609016
Delivery GLN
custbody_deliver_loc_identifier_ehf → 13 digits
Bank Account
custbody_rm_bankpaymentaccount → IBAN no spaces!

🔢 Scheme IDs

CountryEAS (Routing)ICD (Legal)
🇳🇴 Norway01920192
🇬🇧 UK99320199
GLN00880088

📊 Tax Categories

CodeNameRateExemption
SStandard> 0%-
ZZero0%-
EExempt0%vatex-eu-132
AEReverse Charge0%vatex-eu-ae
GExport0%vatex-eu-143

⏱️ Common Unit Codes

UnitCode
HourHUR
DayDAY
MonthMON
EachEA
YearANN

⚠️ Top 5 Validation Errors

ErrorCauseFix
EQ-PO-001PO not 10 digitsEnter exactly 10 digits in PO/Check Number
LINE-004Missing Order Line RefFill custcol_cgi_ehf_orderlinereference on ALL lines
PEPPOL-R010No Buyer EndpointIDSet custbody_buyer_elec_add_ehf
EQ-LINE-001Zero amount lineRemove or fix lines with 0 amount
PAY-002Invalid IBANRemove spaces from IBAN, check format
💡 Pro Tip: Click any field_id to copy it to clipboard!

🔧 Troubleshooting Wizard

Interactive guide to diagnose and fix common issues

What issue are you experiencing?

📊 Dashboard

Overview of the PEPPOL E-Invoicing system

📋
290+
Validation Rules
🔗
170+
Field Mappings
📏
25
Unit Codes
🌍
180+
Currency Codes

🎯 Equinor Compliance Quick Check

PO Number
10 digits, starts 46
Order Line Ref
Format: 10/20
SES Number
Buyer's Item ID
Delivery GLN
13 digits
EndpointID
923609016
Bank IBAN
No spaces!

🔄 Process Flow

Invoice Lifecycle
1. Create

Invoice

2. E-Doc

Fields

3. Save

XML Gen

4. Validate

290+ Rules

5. Send

SFTP

📋 Document Types

TypeCodeRoot
Invoice380<Invoice>
Credit Note381<CreditNote>
Corrected384<Invoice>
Self-billed389<Invoice>

🏢 Energy Customers

CustomerSpecial Rules
Equinor10-digit PO, OrderLineRef, SES
AkerBPStandard PEPPOL
ShellLEI identifier (0199)
Vår EnergiStandard PEPPOL

🔗 PEPPOL 4-Corner Model

How documents route through the PEPPOL network

CORNER 1
🏢 Your Company
NetSuite ERP
CORNER 4
🏪 Customer
SAP / Oracle
⬇️
⬆️
CORNER 2
📡 Nordic Hub
Your Access Point
➡️ PEPPOL ➡️
CORNER 3
📡 Basware
Customer's AP

🔄 End-to-End Data Flow

Complete journey of an invoice from NetSuite to customer's ERP

📊 Invoice Lifecycle

NetSuite → PEPPOL Network → Customer
1. Create Invoice

NetSuite ERP

2. Fill E-Doc Fields

PO, GLN, EndpointID

3. Save/Validate

290+ Rules Check

4. XML Generated

FreeMarker Template

⬇️
8. Customer ERP

SAP/Oracle/D365

7. Receiver AP

Basware/Pagero

6. PEPPOL Network

SML/SMP Lookup

5. SFTP Upload

Nordic Hub Access Point

📤 Outbound Flow (Sending)

StepComponentAction
1User Event ScriptTriggers on invoice save
2FreeMarker TemplateGenerates UBL 2.1 XML
3PDF GeneratorBASE64 encodes attachments
4Validator SuiteletChecks 290+ rules
5SFTP ScriptUploads to btxdmz.eintegration.net
6Nordic Hub Access PointValidates & routes via PEPPOL

📥 Response Flow (Confirmation)

ResponseMeaningStatus
MLRMessage Level ResponseSyntax accepted
IMRInvoice Message ResponseBusiness accepted
IRNInvoice Response NegativeRejected by buyer
SFTP 200Upload confirmedFile received
⚠️ Gap: SFTP upload success ≠ PEPPOL delivery. Automated retrieval of Transport Acknowledgements, MLR, and Invoice Responses from Nordic Hub's /inbound/responses/ directory is not yet implemented. Currently, status must be checked manually via Nordic Hub portal or by contacting the receiver.

🔢 Scheme ID Decision Guide

Choose the correct EAS (routing) and ICD (legal identification) codes

🎯 EndpointID Scheme (EAS) - For Routing

Which EAS Code for EndpointID?
Start

Country?

⬇️
🇳🇴 Norway

Org Number

🇬🇧 UK

Company Number

🌍 Other

GLN Available?

⬇️
0192

Norwegian Org#

9932

UK VAT Number

0088

GLN (13 digits)

🏢 PartyIdentification Scheme (ICD) - For Legal ID

🇳🇴
Norway
0192
Foretaksregisteret
🇬🇧
United Kingdom
0199
Legal Entity ID
🌍
International
0088
GLN (GS1)

📋 Complete Scheme Reference

ContextNorway 🇳🇴UK 🇬🇧GLNNetSuite Field
Seller EndpointID019299320088custrecord_elr_add_id_scheme_id_ehf
Buyer EndpointID019299320088custbody_buyer_elec_scheme_id_ehf
Seller PartyID0192-0088subsidiary.federalidnumber
Buyer PartyID019201990088custbody_buyer_identifier_ehf
Delivery Location--0088custbody_deliver_loc_scheme_id_ehf
💡 Remember: EAS codes are for routing (finding the receiver on PEPPOL network). ICD codes are for legal identification (identifying the legal entity).

💰 VAT Category Decision Tree

Determine the correct VAT category code based on transaction type

🌳 Which VAT Category?

VAT Category Selection
Start

Is VAT charged?

⬇️ Yes / No
S - Standard

VAT Rate > 0%

or
No VAT

Why no VAT?

⬇️
Z - Zero

Zero-rated goods

E - Exempt

VAT exempt

AE - Reverse

Buyer pays VAT

G - Export

Outside EU/EEA

O - Outside

Not subject to VAT

📊 VAT Category Quick Reference

CodeNameRateWhen to UseExemption CodeSeller VATBuyer VAT
SStandard> 0%Normal domestic sale with VAT-Required-
ZZero Rate0%Zero-rated (food, books in UK)-Required-
EExempt0%VAT exempt (insurance, finance)vatex-eu-132Required-
AEReverse Charge0%B2B cross-border EU, constructionvatex-eu-aeRequiredRequired
GExport0%Export outside EU/EEAvatex-eu-143Required-
KIntra-Community0%EU goods to VAT-registered buyervatex-eu-icRequiredRequired
ONot Subject0%Outside scope of VATvatex-eu-o--

🇳🇴 Norway Specific

  • 25% - Standard rate (most goods/services)
  • 15% - Food and beverages
  • 12% - Transport, cinema, hotels
  • 0% - Exports, newspapers, electric vehicles

🇬🇧 UK Specific

  • 20% - Standard rate
  • 5% - Reduced (energy, child car seats)
  • 0% - Zero (food, books, children's clothes)
  • Exempt - Insurance, finance, education
⚠️ Critical: For AE (Reverse Charge) and K (Intra-Community), BOTH seller AND buyer VAT numbers are REQUIRED in the invoice!

🔧 FreeMarker Template Reference

Helper functions used in production invoice/credit note templates

🗺️ Country Code Mapping

<#function getCountryCode country> // Converts country names to ISO 2-letter codes "UNITED KINGDOM" | "UK" | "GB" → "GB" "NORWAY" | "NORGE" | "NOR" → "NO" 2-letter code → uppercase </#function>

🔢 Scheme ID Functions

FunctionPurposeNOGBDefault
getSupplierEndpointSchemeID()Seller EAS code019299320088
getCustomerEndpointSchemeID()Buyer EAS code019201990088
getSupplierIdentifierSchemeID()Seller ICD code0192--
getCustomerIdentifierSchemeID()Buyer ICD code019201990088
isGLN()Check if 13-digit GLNReturns true if matches ^[0-9]{13}$

💱 Tax & Decimal Functions

FunctionPurposeExample
formatDecimal(value, default)Format to 2 decimalsformatDecimal(100) → "100.00"
getTaxRate(taxRateString)Extract rate from "25%"getTaxRate("25%") → "25"
extractVATCategory(taxCode, rate)Determine S/Z/E/AE/GextractVATCategory("VAT:S-NO", 25) → "S"
getExemptionReasonCode(category)Get vatex codegetExemptionReasonCode("AE") → "vatex-eu-ae"

📏 Unit Code Mapping

NetSuite UnitUN/ECE Code
Hour / Hours / HrHUR
Day / DaysDAY
Week / Weeks / WkWEE
Month / Months / MoMON
Year / Years / YrANN
NetSuite UnitUN/ECE Code
Each / Ea / UnitEA
Piece / PcsH87
Kilogram / KgKGM
Liter / Litre / LLTR
Meter / Metre / MMTR
⚠️ BaseQuantity Rule: Always use BaseQuantity="1" in PEPPOL. NetSuite stores rates as "per unit" so the formula is: LineExtensionAmount = Quantity × PriceAmount / 1

🔧 Error Resolution Flowchart

Step-by-step guide to fix common PEPPOL validation errors

🚨 Error Type Decision

What Type of Error?
Validation Failed

Check error code

⬇️
BR-*

PEPPOL Business Rule

EQ-*

Equinor Specific

NO-R-*

Norwegian Rule

SYNTAX

XML Structure

⬇️
Fix Data

Update NetSuite field

Re-Save

Regenerate XML

Re-Validate

Click button

🔥 Top 10 Errors & Quick Fixes

#ErrorCauseFix
1EQ-PO-001PO not 10 digitsEdit otherrefnum → exactly 10 digits starting with 46
2LINE-004Missing Order Line RefFill custcol_cgi_ehf_orderlinereference on ALL lines (format: 10/20 or 10#20)
3CUS-001Missing Buyer EndpointIDFill custbody_buyer_elec_add_ehf
4BR-30Missing Seller VATCheck subsidiary vatregnumber
5TAX-001Missing exemption reasonAdd vatex code for E/AE/G/O categories
6DEL-005Invalid GLNMust be exactly 13 digits in custbody_deliver_loc_identifier_ehf
7NO-R-003Invalid Norwegian IBANFormat: NO + 2 check + 11 digits (no spaces)
8BR-55Credit note missing refApply to original invoice OR set createdfrom
9CURR-002Multi-currency tax mismatchFill custbody_tax_amount_vat_currency_ehf
10ATT-004Attachment too largeTotal attachments must be < 25MB

✅ Complete Validation Rules (290+)

All PEPPOL BIS 3.0 and Equinor-specific validation rules

Rule ID Category Description NetSuite Field Sev
BR-01StructureCustomizationID is required(Fixed value)L
BR-02StructureInvoice number is requiredtransaction.tranidL
BR-03StructureIssue date is requiredtransaction.trandateL
BR-04StructureInvoice type code is requiredcustbody_inv_type_name_ehfL
BR-05StructureDocument currency code is requiredtransaction.currencyL
BR-08StructureSeller postal address is requiredsubsidiary.address1L
BR-10StructureBuyer postal address is requiredcustomer.billaddr1L
BR-12StructureSum of line amounts requiredtransaction.subtotalL
BR-13StructureInvoice total without VAT requiredtransaction.subtotalL
BR-14StructureInvoice total with VAT requiredtransaction.totalL
BR-15StructureAmount due for payment requiredtransaction.totalL
BR-16StructureAt least one invoice line requiredtransaction.itemL
BR-17StructureProfileID is required(Fixed value)L
BR-18StructureBuyerReference or OrderReference requiredcustbody_cgi_ehf_contactemailL
BR-19StructureTax currency code required if differentcustbody_vat_currency_ehfL
BR-20StructureAccounting cost may be set at headercustbody_accounting_cost_ehfR
BR-06SupplierSeller name is requiredsubsidiary.legalnameL
BR-09SupplierSeller country code is requiredentity_nexus_countryL
BR-27SupplierSeller identifier or legal reg requiredsubsidiary.federalidnumberL
BR-28SupplierSeller postal address city requiredsubsidiary.cityL
BR-29SupplierSeller postal address post codesubsidiary.zipR
BR-30SupplierSeller VAT identifier required if taxsubsidiary.vatregnumberL
BR-31SupplierSeller tax registration if tax repsubsidiary.vatregnumberL
BR-32SupplierSeller additional legal infosubsidiary.legalnameR
BR-33SupplierSeller contact pointsubsidiary.emailR
BR-34SupplierSeller contact telephonesubsidiary.phoneR
BR-35SupplierSeller contact emailsubsidiary.emailR
PEPPOL-R020SupplierSeller EndpointID is requiredcustrecord_seller_electronic_address_ehfL
NO-R-001SupplierNorwegian org number MOD11 checkcustrecord_seller_electronic_address_ehfL
NO-R-002SupplierNorwegian VAT format NO{9}MVAsubsidiary.vatregnumberL
BR-07CustomerBuyer name is requiredcustomer.companynameM
BR-11CustomerBuyer country code is requiredcustbody_cgi_inv_countrycode_ehfM
BR-36CustomerBuyer identifier scheme requiredcustbody_buyer_elec_scheme_id_ehfL
BR-37CustomerBuyer postal address city requiredcustomer.billcityL
BR-38CustomerBuyer postal address post codecustomer.billzipR
BR-39CustomerBuyer VAT identifier if chargedcustomer.vatregnumberL
BR-40CustomerBuyer reference for routingcustbody_cgi_ehf_contactemailM
BR-41CustomerBuyer contact pointcustomer.emailR
BR-42CustomerBuyer contact telephonecustomer.phoneR
BR-43CustomerBuyer contact emailcustomer.emailR
BR-44CustomerBuyer additional legal infocustomer.companynameR
PEPPOL-R010CustomerBuyer EndpointID is requiredcustbody_buyer_elec_add_ehfM
BR-63CustomerBuyer EndpointID scheme requiredcustbody_buyer_elec_scheme_id_ehfL
EQ-PO-001EquinorPO must be exactly 10 digitstransaction.otherrefnumM
EQ-PO-002EquinorPO should start with 46transaction.otherrefnumR
EQ-LINE-001EquinorLine amount cannot be zeroitem.amountM
EQ-LINE-002EquinorNegative amounts not alloweditem.amountM
EQ-LINE-003EquinorOrderLineRef format POLine/SEScustcol_cgi_ehf_orderlinereferenceM
EQ-CN-001EquinorCredit note must reference invoiceapply[].refnumM
EQ-DEL-001EquinorDelivery GLN requiredcustbody_deliver_loc_identifier_ehfM
EQ-DEL-002EquinorGLN must be 13 digitscustbody_deliver_loc_identifier_ehfM
EQ-SES-001EquinorSES number required on linescustcol_cgi_ehf_buyers_item_idM
EQ-CON-001EquinorContract ref should start with 46custbody_contract_ref_ehfR
BR-21LineLine ID is requireditem.lineL
BR-22LineInvoiced quantity is requireditem.quantityL
BR-23LineUnit code is requireditem.unitsL
BR-24LineLine net amount is requireditem.amountL
BR-25LineLine contains item name or descriptionitem.descriptionL
BR-26LineItem net price is requireditem.amount/item.quantityL
BR-64LineItem standard identifier schemeitem.itemidR
BR-65LineItem classification identifier schemeitem.classR
LINE-004LineOrder Line Reference requiredcustcol_cgi_ehf_orderlinereferenceM
LINE-SES-01LineSES number (Buyer's Item ID)custcol_cgi_ehf_buyers_item_idM
LINE-005LineService period dates for time-basedcustcol_ehf_service_start_dateR
LINE-006LineLine accounting costcustcol_accounting_cost_ehfR
LINE-007LineLine note for additional infocustcol_ehf_line_noteR
BR-45TaxVAT category taxable amount requireditem.taxcodeL
BR-46TaxVAT category tax amount requireditem.tax1amtL
BR-47TaxVAT category code requireditem.taxcodeL
BR-48TaxVAT rate required for each categoryitem.taxrate1L
BR-53TaxTotal VAT amount requiredtransaction.taxtotalL
BR-54TaxTax currency amount if differentcustbody_tax_amount_vat_currency_ehfL
BR-S-01TaxStandard rate: taxable amount requiredTaxableAmountL
BR-S-02TaxStandard rate: tax amount requiredTaxAmountL
BR-S-05TaxStandard rate VAT must be > 0item.taxrate1L
BR-S-08TaxStandard rate: valid rate valueitem.taxrate1L
BR-S-09TaxStandard rate: seller VAT requiredsubsidiary.vatregnumberL
BR-S-10TaxStandard rate: category S onlyTaxCategory/ID = SL
BR-Z-01TaxZero rate: taxable amount requiredTaxableAmountL
BR-Z-02TaxZero rate: tax amount must be 0TaxAmount = 0L
BR-Z-05TaxZero rate: rate must be 0%Percent = 0L
BR-Z-08TaxZero rate: no reason required-R
BR-Z-09TaxZero rate: seller VAT requiredsubsidiary.vatregnumberL
BR-Z-10TaxZero rate: category Z onlyTaxCategory/ID = ZL
BR-E-01TaxExempt: taxable amount requiredTaxableAmountL
BR-E-02TaxExempt: tax amount must be 0TaxAmount = 0L
BR-E-05TaxExempt: rate must be 0%Percent = 0L
BR-E-08TaxExempt: exemption reason code requiredTaxExemptionReasonCodeL
BR-E-09TaxExempt: seller VAT requiredsubsidiary.vatregnumberL
BR-E-10TaxExempt requires exemption reasonTaxExemptionReasonL
BR-AE-01TaxReverse charge: taxable amount requiredTaxableAmountL
BR-AE-02TaxReverse charge: tax amount must be 0TaxAmount = 0L
BR-AE-05TaxReverse charge: rate must be 0%Percent = 0L
BR-AE-08TaxReverse charge: reason code requiredTaxExemptionReasonCodeL
BR-AE-09TaxReverse charge: seller VAT requiredsubsidiary.vatregnumberL
BR-AE-10TaxReverse charge requires reasonTaxExemptionReasonL
BR-G-01TaxFree export: taxable amount requiredTaxableAmountL
BR-G-02TaxFree export: tax amount must be 0TaxAmount = 0L
BR-G-05TaxFree export: rate must be 0%Percent = 0L
BR-G-08TaxFree export: no reason required-R
BR-G-09TaxFree export: seller VAT requiredsubsidiary.vatregnumberL
BR-G-10TaxFree export: category G onlyTaxCategory/ID = GL
BR-O-01TaxNot subject: taxable amount requiredTaxableAmountL
BR-O-02TaxNot subject: tax amount must be 0TaxAmount = 0L
BR-O-05TaxNot subject: rate must be 0%Percent = 0L
BR-O-08TaxNot subject: reason may be providedTaxExemptionReasonR
BR-O-09TaxNot subject: no seller VAT required-R
BR-O-10TaxNot subject: category O onlyTaxCategory/ID = OL
BR-IC-01TaxIntra-community: taxable amount requiredTaxableAmountL
BR-IC-02TaxIntra-community: tax amount must be 0TaxAmount = 0L
BR-IC-05TaxIntra-community: rate must be 0%Percent = 0L
BR-IC-08TaxIntra-community: reason code requiredTaxExemptionReasonCodeL
BR-IC-09TaxIntra-community: seller VAT requiredsubsidiary.vatregnumberL
BR-IC-10TaxIntra-community: buyer VAT requiredcustomer.vatregnumberL
BR-IC-11TaxIntra-community: category K onlyTaxCategory/ID = KL
BR-IC-12TaxIntra-community: reason text requiredTaxExemptionReasonL
BR-CO-03CalculationValue added tax point dateTaxPointDateR
BR-CO-04CalculationActual delivery dateActualDeliveryDateR
BR-CO-09CalculationSeller VAT identifier validationsubsidiary.vatregnumberL
BR-CO-10CalculationSum of line net amountsSum(LineExtensionAmount)L
BR-CO-11CalculationAllowances at document levelAllowanceTotalAmountL
BR-CO-12CalculationCharges at document levelChargeTotalAmountL
BR-CO-13CalculationTax exclusive amount calculationTaxExclusiveAmountL
BR-CO-14CalculationInvoice total VAT amount calculationtransaction.taxtotalL
BR-CO-15CalculationTax inclusive amount calculationTaxInclusiveAmountL
BR-CO-16CalculationAmount due for payment calculationPayableAmountL
BR-CO-17CalculationVAT category tax amount calculationTaxSubtotal/TaxAmountL
BR-CO-18CalculationVAT category taxable amount calcTaxSubtotal/TaxableAmountL
BR-CO-19CalculationLine net amount calculationQty × Price / BaseQtyL
BR-CO-20CalculationItem net price calculationPriceAmountL
BR-49PaymentPayment means code required(Fixed: 30)L
BR-50PaymentPayment account identifier requiredcustrecord_combankdet_ibanL
BR-51PaymentPayment card holder nameCardHolderNameR
BR-52PaymentAttached document descriptioncustbody_supp_doc_description_ehfM
BR-61PaymentPayment due date if terms giventransaction.duedateR
BR-62PaymentSeller BIC required for IBANcustrecord_bank_branch_codeR
PAY-002PaymentIBAN format validation (no spaces)custrecord_combankdet_ibanL
NO-R-003PaymentNorwegian IBAN format: NO + 13 digitscustrecord_combankdet_ibanL
BR-DEC-01FormatAmount max 2 decimalsAll amountsL
BR-DEC-02FormatQuantity max 6 decimalsitem.quantityL
BR-DEC-03FormatUnit price max 6 decimalsitem.amount/item.quantityL
BR-DEC-04FormatVAT rate max 2 decimalsitem.taxrate1L
BR-DEC-05FormatPercentage max 2 decimalsPercent valuesL
BR-CL-01FormatCurrency code ISO 4217transaction.currencyL
BR-CL-02FormatInvoice type code UNTDID 1001custbody_inv_type_name_ehfL
BR-CL-03FormatCredit note type code UNTDID 1001custbody_inv_type_name_ehfL
BR-CL-04FormatCountry code ISO 3166-1Country codesL
BR-CL-05FormatAllowance reason code UNTDID 5189AllowanceChargeReasonCodeL
BR-CL-06FormatCharge reason code UNTDID 7161AllowanceChargeReasonCodeL
BR-CL-07FormatTax category code UNTDID 5305TaxCategory/IDL
BR-CL-10FormatScheme identifier for identifiers@schemeID valuesL
BR-CL-14FormatInvoice period description codeDescriptionCodeR
BR-CL-17FormatPayment means code UNTDID 4461PaymentMeansCodeL
BR-CL-20FormatTax category code UNCL 5305item.taxcodeL
BR-CL-21FormatTax exemption reason codeTaxExemptionReasonCodeL
BR-CL-23FormatUnit code UN/ECE Rec 20item.unitsL
BR-CL-24FormatIdentifier scheme ICD code@schemeID (ICD)L
BR-CL-25FormatEndpointID scheme EAS codeScheme IDsL
BR-CL-26FormatMIME code for attachmentEmbeddedDocument/@mimeCodeL
PEPPOL-EN16931-R001PEPPOLCustomizationID format(Fixed value)L
PEPPOL-EN16931-R002PEPPOLProfileID format(Fixed value)L
PEPPOL-EN16931-R003PEPPOLBuyerReference or OrderReferencecustbody_cgi_ehf_contactemailL
PEPPOL-EN16931-R004PEPPOLSpecification identifier(Fixed value)L
PEPPOL-EN16931-R006PEPPOLSeller electronic address requiredcustrecord_seller_electronic_address_ehfL
PEPPOL-EN16931-R007PEPPOLBuyer electronic address requiredcustbody_buyer_elec_add_ehfL
PEPPOL-EN16931-R008PEPPOLDocument level allowance/charge indicatorChargeIndicatorL
PEPPOL-EN16931-R040PEPPOLAllowance/charge base amountBaseAmountL
PEPPOL-EN16931-R053PEPPOLBase quantity must be > 0BaseQuantityL
PEPPOL-EN16931-R054PEPPOLBase quantity unit code must matchBaseQuantity/@unitCodeL
PEPPOL-EN16931-R080PEPPOLUnit code for base quantityBaseQuantity/@unitCodeL
PEPPOL-EN16931-R100PEPPOLAll currencyID must match DocumentCurrencyCodeAll @currencyIDL
PEPPOL-EN16931-R101PEPPOLElement order in TaxTotalTaxTotal orderingL
PEPPOL-EN16931-R110PEPPOLStart date <= end dateInvoicePeriod datesL
PEPPOL-EN16931-R120PEPPOLPaymentMeansCode valuesPaymentMeansCodeL
PEPPOL-EN16931-R121PEPPOLMandate reference for direct debitPaymentMandateL
PEPPOL-EN16931-R130PEPPOLUnit code shall exist@unitCodeL
PEPPOL-EN16931-R131PEPPOLBase quantity must be positiveBaseQuantity > 0L
ATT-001AttachmentAttachment size limit (25MB total)custbody_attached_doc_binary_code_cgiR
ATT-002AttachmentAttachment must be base64 encodedEmbeddedDocumentBinaryObjectL
ATT-003AttachmentMaximum 3 attachmentsAttachment fieldsR
ATT-004AttachmentValid MIME type required@mimeCodeL
ATT-005AttachmentFilename required@filenameL
NO-R-004NorwayNorwegian date formatAll date fieldsL
NO-R-005NorwayTax point date for Norwegian invoicesTaxPointDateR
NO-R-006NorwayNorwegian postal code format (4 digits)PostalZoneR
NO-R-007NorwayNorwegian phone formatTelephoneR
NO-R-008NorwayNorwegian invoice type codesInvoiceTypeCodeL
NO-R-009NorwayEndpointID 0192 for Norwegian orgEndpointID/@schemeIDL
NO-R-010NorwayCompany ID scheme 0192CompanyID/@schemeIDL
UK-R-001UKUK VAT format GB + 9 or 12 digitsCompanyIDL
UK-R-002UKUK EndpointID scheme 9932/9933EndpointID/@schemeIDL
UK-R-003UKUK Company ID scheme 0199 for LEICompanyID/@schemeIDL
UK-R-004UKUK postal code formatPostalZoneR
UK-R-005UKUK date format YYYY-MM-DDAll date fieldsL
CN-001Credit NoteCredit note type code 381CreditNoteTypeCodeL
CN-002Credit NoteBilling reference requiredBillingReferenceL
CN-003Credit NoteInvoice document referenceInvoiceDocumentReference/IDL
CN-004Credit NoteCredit note root elementCreditNoteL
CN-005Credit NoteCredited quantity element nameCreditedQuantityL
DEL-001DeliveryDelivery location ID schemeDeliveryLocation/ID/@schemeIDL
DEL-002DeliveryActual delivery date formatActualDeliveryDateR
DEL-003DeliveryDelivery party nameDeliveryParty/PartyNameR
DEL-004DeliveryDelivery address required if locationDeliveryLocation/AddressL
DEL-005DeliveryGLN format 13 digitsDeliveryLocation/IDL
DEL-006DeliveryDelivery period datesDeliveryPeriodR
ORD-001OrderOrder reference ID requiredOrderReference/IDM
ORD-002OrderSales order referenceOrderReference/SalesOrderIDR
ORD-003OrderOrder line reference formatOrderLineReference/LineIDM
CON-001ContractContract document reference IDContractDocumentReference/IDR
CON-002ContractContract document type codeContractDocumentReference/DocumentTypeCodeR
AC-001AllowanceCharge indicator requiredAllowanceCharge/ChargeIndicatorL
AC-002AllowanceAllowance/charge amount requiredAllowanceCharge/AmountL
AC-003AllowanceAllowance/charge reasonAllowanceCharge/AllowanceChargeReasonR
AC-004AllowanceAllowance/charge reason codeAllowanceCharge/AllowanceChargeReasonCodeL
AC-005AllowanceTax category for allowance/chargeAllowanceCharge/TaxCategoryL
AC-006AllowancePercentage if base amount givenAllowanceCharge/MultiplierFactorNumericL
ENT-001EntityParty legal entity namePartyLegalEntity/RegistrationNameL
ENT-002EntityParty legal entity IDPartyLegalEntity/CompanyIDL
ENT-003EntityParty identification schemePartyIdentification/ID/@schemeIDL
ENT-004EntityTax representative partyTaxRepresentativePartyR
ENT-005EntityPayee party if differentPayeePartyR
PEPPOL-EN16931-R041PEPPOLAllowance percentage calculationMultiplierFactorNumericL
PEPPOL-EN16931-R042PEPPOLCharge percentage calculationMultiplierFactorNumericL
PEPPOL-EN16931-R043PEPPOLLine allowance percentageLine/AllowanceChargeL
PEPPOL-EN16931-R044PEPPOLLine charge percentageLine/AllowanceChargeL
PEPPOL-EN16931-R046PEPPOLItem classification identifierCommodityClassificationR
PEPPOL-EN16931-R051PEPPOLTax subtotal required per categoryTaxSubtotalL
PEPPOL-EN16931-R052PEPPOLOnly one tax subtotal per categoryTaxSubtotal uniquenessL
PEPPOL-EN16931-R055PEPPOLPrice base quantity unit codeBaseQuantity/@unitCodeL
PEPPOL-EN16931-R061PEPPOLPayment due date requiredDueDateR
PEPPOL-EN16931-R062PEPPOLSeller BIC for credit transferFinancialInstitutionBranch/IDR
SE-R-001SwedenSwedish org number formatEndpointIDL
SE-R-002SwedenSwedish VAT format SE + 12 digitsCompanyIDL
SE-R-003SwedenSwedish EndpointID scheme 0007EndpointID/@schemeIDL
SE-R-004SwedenSwedish postal code formatPostalZoneR
DK-R-001DenmarkDanish CVR number formatEndpointIDL
DK-R-002DenmarkDanish VAT format DK + 8 digitsCompanyIDL
DK-R-003DenmarkDanish EndpointID scheme 0184EndpointID/@schemeIDL
DK-R-004DenmarkDanish postal code formatPostalZoneR
FI-R-001FinlandFinnish business ID formatEndpointIDL
FI-R-002FinlandFinnish VAT format FI + 8 digitsCompanyIDL
FI-R-003FinlandFinnish EndpointID scheme 0213EndpointID/@schemeIDL
FI-R-004FinlandFinnish postal code formatPostalZoneR
NL-R-001NetherlandsDutch KVK number formatEndpointIDL
NL-R-002NetherlandsDutch VAT format NL + 12 charsCompanyIDL
NL-R-003NetherlandsDutch EndpointID scheme 0190EndpointID/@schemeIDL
NL-R-004NetherlandsDutch postal code formatPostalZoneR
DE-R-001GermanyGerman Leitweg-ID formatEndpointIDL
DE-R-002GermanyGerman VAT format DE + 9 digitsCompanyIDL
DE-R-003GermanyGerman EndpointID scheme 0204EndpointID/@schemeIDL
DE-R-004GermanyGerman postal code format (5 digits)PostalZoneR
BIS-001BISBIS 3.0 profile identifierProfileIDL
BIS-002BISBIS customization identifierCustomizationIDL
BIS-003BISUBL version identifierUBLVersionIDL
BIS-004BISInvoice/Credit Note namespacexmlnsL
PER-001PeriodInvoice period start dateInvoicePeriod/StartDateR
PER-002PeriodInvoice period end dateInvoicePeriod/EndDateR
PER-003PeriodStart date before end dateStartDate <= EndDateL
PER-004PeriodLine period start dateInvoiceLine/InvoicePeriod/StartDateR
PER-005PeriodLine period end dateInvoiceLine/InvoicePeriod/EndDateR
ITEM-001ItemItem name requiredItem/NameL
ITEM-002ItemItem descriptionItem/DescriptionR
ITEM-003ItemSellers item identificationSellersItemIdentification/IDR
ITEM-004ItemStandard item identificationStandardItemIdentification/IDR
ITEM-005ItemItem classification codeCommodityClassification/ItemClassificationCodeR
ITEM-006ItemOrigin country codeOriginCountry/IdentificationCodeR
ITEM-007ItemItem attributesAdditionalItemPropertyR
PRICE-001PricePrice amount requiredPrice/PriceAmountL
PRICE-002PriceBase quantity = 1Price/BaseQuantity = 1L
PRICE-003PricePrice base quantity > 0BaseQuantity > 0L
PRICE-004PriceAllowance on pricePrice/AllowanceChargeR
PRICE-005PricePrice currency must match documentPriceAmount/@currencyIDL
CONTACT-001ContactSeller contact nameContact/NameR
CONTACT-002ContactSeller contact telephoneContact/TelephoneR
CONTACT-003ContactSeller contact emailContact/ElectronicMailR
CONTACT-004ContactBuyer contact nameBuyerContact/NameR
CONTACT-005ContactBuyer contact telephoneBuyerContact/TelephoneR
CONTACT-006ContactBuyer contact emailBuyerContact/ElectronicMailR
REF-001ReferenceProject referenceProjectReference/IDR
REF-002ReferenceDespatch document referenceDespatchDocumentReference/IDR
REF-003ReferenceReceipt document referenceReceiptDocumentReference/IDR
REF-004ReferenceOriginator document referenceOriginatorDocumentReference/IDR
REF-005ReferenceAdditional document referenceAdditionalDocumentReferenceR
REF-006ReferenceStatement referenceStatementDocumentReference/IDR
XSD-001SchemaValid XML structureXML well-formedL
XSD-002SchemaUBL 2.1 schema validationUBL-Invoice-2.1.xsdL
XSD-003SchemaElement ordering per schemaElement sequenceL
XSD-004SchemaRequired elements presentminOccurs validationL
XSD-005SchemaData type validationxs:date, xs:decimalL
XSD-006SchemaNamespace declarationsxmlns:cbc, xmlns:cacL
XSD-007SchemaEmpty elements not allowedNo empty required fieldsL
SCHEMATRON-001SchematronBusiness rule validationPEPPOL-EN16931-UBL.schL
SCHEMATRON-002SchematronCode list validationCode list SchematronL
Legend: L = Legal (blocks PEPPOL) | M = Mandatory (customer rejects) | R = Recommended

❌ Error Database

Complete error code reference with solutions

Error CodeMessageSolution
EQ-PO-001PO must be exactly 10 digitsEnter 10 digits in otherrefnum (e.g., 4600012345)
EQ-PO-002PO should start with 46Equinor POs typically start with 46 prefix
EQ-LINE-001Line amount cannot be zeroRemove zero-amount lines or set non-zero values
EQ-CN-001Credit note needs invoice refApply credit to original invoice in Apply sublist
EQ-SES-001SES number requiredFill custcol_cgi_ehf_buyers_item_id on lines
LINE-004Order Line Reference requiredFill custcol_cgi_ehf_orderlinereference on ALL lines
LINE-001Line ID missingEnsure item.line is populated (auto-generated)
LINE-002Quantity missing or invalidSet item.quantity to non-zero value
LINE-003Unit code invalidMap units to UN/ECE codes (HUR, DAY, EA)
LINE-005Item name missingEnsure item has description/name
LINE-006Price amount missingEnsure item.amount and item.quantity are non-zero
PEPPOL-R010Buyer EndpointID missingSet custbody_buyer_elec_add_ehf on transaction
PEPPOL-R020Seller EndpointID missingSet custrecord_seller_electronic_address_ehf on subsidiary
PEPPOL-R001CustomizationID invalidTemplate error - contact developer
PEPPOL-R002ProfileID invalidTemplate error - contact developer
PEPPOL-R003Business process invalidCheck ProfileID matches document type
PAY-001Payment means code missingTemplate uses fixed value 30 (credit transfer)
PAY-002Invalid IBAN formatRemove spaces from IBAN. NO format: NO9386011117947
PAY-003BIC/SWIFT invalidCheck custrecord_bank_branch_code format (8-11 chars)
PAY-004Bank account missingLink custbody_rm_bankpaymentaccount to transaction
PAY-005Payment ID/KID formatCheck custbody_remittance_info_ehf if used
BR-01CustomizationID requiredTemplate error - check FreeMarker
BR-02Invoice ID requiredEnsure transaction.tranid is populated
BR-03Issue date requiredSet transaction.trandate
BR-04Invoice type code requiredSet custbody_inv_type_name_ehf (380/381)
BR-05Currency code requiredEnsure transaction.currency is set
BR-16At least one line requiredAdd items to invoice
BR-06Seller name requiredSet subsidiary.legalname
BR-07Buyer name requiredEnsure customer.companyname is set
BR-09Seller country requiredSet country on subsidiary address
BR-11Buyer country requiredSet custbody_cgi_inv_countrycode_ehf
BR-CO-10Sum of line amounts ≠ totalCheck line amounts sum equals subtotal
BR-CO-13Tax exclusive calculation errorTaxExclusiveAmount = LineExtension - allowances + charges
BR-CO-14Tax amount calculation errorVerify tax amounts match rate × taxable
BR-CO-15Tax inclusive calculation errorTaxInclusiveAmount = TaxExclusiveAmount + TaxAmount
BR-CO-16Payable amount calculation errorPayableAmount = TaxInclusiveAmount - PrepaidAmount
BR-S-05Standard rate must be > 0Tax category S requires rate > 0%
BR-S-06Standard rate VAT amount errorTaxAmount = TaxableAmount × Percent / 100
BR-Z-05Zero rate must be 0Tax category Z requires rate = 0%
BR-E-05Exempt rate must be 0Tax category E requires rate = 0%
BR-E-10Exempt needs reasonAdd TaxExemptionReason for category E
BR-AE-05Reverse charge rate must be 0Tax category AE requires rate = 0%
BR-AE-10Reverse charge needs reasonAdd TaxExemptionReasonCode vatex-eu-ae
BR-G-05Export rate must be 0Tax category G requires rate = 0%
BR-G-10Export needs reasonAdd TaxExemptionReasonCode vatex-eu-143
NO-R-001Norwegian org# MOD11 check failedVerify 9-digit org number with correct check digit
NO-R-002Norwegian VAT format invalidFormat: NO{9digits}MVA (e.g., NO923609016MVA)
NO-R-003Norwegian IBAN format invalidFormat: NO{13digits} (e.g., NO9386011117947)
ATT-001Attachment too largeEach attachment should be under 10MB
ATT-002Total attachments too largeTotal size should be under 25MB
ATT-003Too many attachmentsMaximum 3 attachments allowed
BR-52Attachment needs descriptionFill custbody_supp_doc_description_ehf for each
ATT-005Invalid MIME typeSupported: PDF, PNG, JPEG, CSV, XLSX
DEL-001Delivery location ID missing schemeSet custbody_deliver_loc_scheme_id_ehf (0088 for GLN)
DEL-005GLN must be 13 digitsCheck custbody_deliver_loc_identifier_ehf format
DATE-001Due date before issue dateDue date should be after or equal to issue date
DATE-002Invoice date in futureIssue date should not be in the future
DATE-003Invalid date formatDates must be YYYY-MM-DD format
BR-DEC-01Amount exceeds 2 decimalsRound monetary amounts to 2 decimal places
BR-DEC-02Quantity exceeds 6 decimalsRound quantities to max 6 decimal places
BR-CL-01Invalid currency codeUse ISO 4217 3-letter codes (NOK, EUR, USD)
BR-CL-04Invalid country codeUse ISO 3166-1 2-letter codes (NO, GB, SE)
BR-CL-20Invalid tax category codeUse UNCL 5305 codes (S, Z, E, AE, G, K, O)
BR-CL-23Invalid unit codeUse UN/ECE Rec 20 codes (HUR, DAY, EA, MON)
💡 Tips: Click column headers to sort. Use the filter to narrow down by category. L = Blocks PEPPOL network | M = Customer rejects | R = Recommended fix

🔣 Regex Validation Patterns

Regular expressions for validating PEPPOL data

🇳🇴 Norwegian Patterns

FieldPatternExampleCopy
Org Number^[89]\d{8}$923609016📋
VAT Number^NO\d{9}MVA$NO923609016MVA📋
IBAN^NO\d{13}$NO9386011117947📋
Bank Account^\d{11}$86011117947📋

🌍 General Patterns

FieldPatternExampleCopy
GLN^\d{13}$7080001321284📋
LEI^[A-Z0-9]{20}$549300GKFG0RYRRQ1414📋
UK VAT^GB\d{9,12}$GB123456789📋
Equinor PO^\d{10}$4600012345📋
Date^\d{4}-\d{2}-\d{2}$2026-01-17📋
Currency^[A-Z]{3}$NOK📋

📄 Sample XML Files

Complete working examples you can download and reference

📋 Minimal Invoice Example

<?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">
  <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>INV-2026-00001</cbc:ID>
  <cbc:IssueDate>2026-01-17</cbc:IssueDate>
  <cbc:DueDate>2026-02-17</cbc:DueDate>
  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
  <cbc:DocumentCurrencyCode>NOK</cbc:DocumentCurrencyCode>
  <cbc:BuyerReference>[email protected]</cbc:BuyerReference>
  
  <cac:OrderReference>
    <cbc:ID>4600012345</cbc:ID>
  </cac:OrderReference>
  
  <cac:AccountingSupplierParty>
    <cac:Party>
      <cbc:EndpointID schemeID="0192">990888213</cbc:EndpointID>
      <cac:PartyName><cbc:Name>Your Company AS</cbc:Name></cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>Street 1</cbc:StreetName>
        <cbc:CityName>Bergen</cbc:CityName>
        <cbc:PostalZone>5003</cbc:PostalZone>
        <cac:Country><cbc:IdentificationCode>NO</cbc:IdentificationCode></cac:Country>
      </cac:PostalAddress>
      <cac:PartyTaxScheme>
        <cbc:CompanyID>NO990888213MVA</cbc:CompanyID>
        <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
      </cac:PartyTaxScheme>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Your Company AS</cbc:RegistrationName>
        <cbc:CompanyID schemeID="0192">990888213</cbc:CompanyID>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingSupplierParty>
  
  <cac:AccountingCustomerParty>
    <cac:Party>
      <cbc:EndpointID schemeID="0192">923609016</cbc:EndpointID>
      <cac:PartyName><cbc:Name>Equinor Energy AS</cbc:Name></cac:PartyName>
      <cac:PostalAddress>
        <cbc:StreetName>Forusbeen 50</cbc:StreetName>
        <cbc:CityName>Stavanger</cbc:CityName>
        <cbc:PostalZone>4035</cbc:PostalZone>
        <cac:Country><cbc:IdentificationCode>NO</cbc:IdentificationCode></cac:Country>
      </cac:PostalAddress>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Equinor Energy AS</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingCustomerParty>
  
  <cac:PaymentMeans>
    <cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
    <cac:PayeeFinancialAccount>
      <cbc:ID>NO9386011117947</cbc:ID>
    </cac:PayeeFinancialAccount>
  </cac:PaymentMeans>
  
  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="NOK">15000.00</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="NOK">60000.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="NOK">15000.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>25.00</cbc:Percent>
        <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>
  
  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="NOK">60000.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="NOK">60000.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="NOK">75000.00</cbc:TaxInclusiveAmount>
    <cbc:PayableAmount currencyID="NOK">75000.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>
  
  <cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="HUR">40.00</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="NOK">60000.00</cbc:LineExtensionAmount>
    <cac:OrderLineReference>
      <cbc:LineID>10/20</cbc:LineID>
    </cac:OrderLineReference>
    <cac:Item>
      <cbc:Name>Consulting Services</cbc:Name>
      <cac:ClassifiedTaxCategory>
        <cbc:ID>S</cbc:ID>
        <cbc:Percent>25.00</cbc:Percent>
        <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
      </cac:ClassifiedTaxCategory>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="NOK">1500.00</cbc:PriceAmount>
      <cbc:BaseQuantity unitCode="HUR">1</cbc:BaseQuantity>
    </cac:Price>
  </cac:InvoiceLine>
</Invoice>

📜 Version History

Template and documentation changelog

📄 Documentation Versions

VersionDateChanges
v9.0Feb 2026Version-aware login fix, Change Password feature, mobile hamburger menu, Access Point naming update (Nordic Hub), dead script removal, version consistency fixes
v8.0Feb 2026Role-based access (admin/controller/user), auth system, bookmarks, export to PDF/DOCX, admin panel, session management, interactive field mapping flow
v7.0Jan 2026Full encyclopedia: Search, dark mode, wizard, regex, copy buttons, 290+ rules
v6.0Jan 2026Added XML trees, country rules, all field mappings
v5.0Jan 2026Quick reference, flowcharts, interactive checklists
v4.0Jan 2026Initial comprehensive HTML guide

📝 Invoice Template Versions

VersionChanges
v3.2Multi-currency dual TaxTotal support
v3.1Three-attachment support with BASE64 injection
v3.0Fail-fast validation, helper functions refactor
v2.9UK support with LEI/VAT scheme detection

📏 Unit Code Mappings

NetSuite units mapped to UN/ECE Recommendation 20

⏱️ Time-Based

NetSuiteCode
Hour/hr/hoursHUR
Day/days/dDAY
Week/wkWEE
Month/mon/periodeMON
QuarterQAN
Year/annualANN

📦 Quantity & Other

NetSuiteCode
Each/ea/FTEEA
MeterMTR
KilometerKMT
KilogramKGM
LiterLTR
Cubic meterMTQ

💰 Tax Categories

PEPPOL VAT category codes

CodeNameRateExemption Code
SStandard> 0%-
ZZero0%-
EExempt0%vatex-eu-132
AEReverse Charge0%vatex-eu-ae
GExport0%vatex-eu-143
KIntra-Community0%vatex-eu-ic
OOutside Scope0%vatex-eu-o

🔢 EAS & ICD Scheme Codes

Electronic addressing and identification schemes

📍 EAS Codes (Routing)

CodeCountry/Type
0192🇳🇴 Norway Org#
9932🇬🇧 UK VAT
0088GLN
0199LEI
0184🇩🇰 Denmark CVR
0007🇸🇪 Sweden Org#

🏢 ICD Codes (Legal ID)

CodeType
0192NO Org Number
0199LEI
0088GLN

📝 Invoice Workflow - Step by Step

Complete walkthrough for creating and sending a PEPPOL invoice

📋 Step-by-Step Process

8 Steps to Send an Invoice
1. Create

New Invoice

2. Customer

Select PEPPOL customer

3. PO Number

10 digits!

4. Lines

Add items

⬇️
8. Send

SFTP upload

7. Validate

Click button

6. Save

XML generated

5. Bank

Link IBAN

📝 Detailed Steps

StepActionFieldNotes
1Create InvoiceTransactions → Sales → Create Invoice-
2Select CustomerCustomer fieldMust have E-Doc Package = EHF Peppol
3Enter PO NumberotherrefnumExactly 10 digits for Equinor (e.g., 4600012345)
4Add Line ItemsItem sublistFill Order Line Ref on EACH line
5Link Bank Accountcustbody_rm_bankpaymentaccountIBAN must have NO SPACES
6Save InvoiceSave buttonXML auto-generated by template
7Run ValidatorValidate PEPPOL buttonFix any red/orange errors
8Send InvoiceSet status to ReadyScheduled script uploads to Nordic Hub
⚠️ Equinor Requirements: PO must be exactly 10 digits, every line needs Order Line Reference, and SES number should be filled.

📝 Credit Note Workflow

How to create and send PEPPOL credit notes

📋 Key Differences from Invoice

ElementInvoiceCredit Note
Root Element<Invoice><CreditNote>
Type Code380381
Type Element<cbc:InvoiceTypeCode><cbc:CreditNoteTypeCode>
Line Element<cac:InvoiceLine><cac:CreditNoteLine>
Quantity Element<cbc:InvoicedQuantity><cbc:CreditedQuantity>
BillingReferenceOptionalREQUIRED
Memo/NoteOptionalREQUIRED (reason)

📝 Steps to Create Credit Note

StepActionNotes
1Create Credit MemoTransactions → Customers → Issue Credit Memo
2Apply to Original InvoiceIn Apply sublist, check the original invoice
3Enter Credit ReasonFill Memo field (required for Equinor!)
4Save and ValidateRun PEPPOL validator
⚠️ Required: Credit notes MUST reference the original invoice. The BillingReference comes from Apply[].refnum or transaction.createdfrom.

💱 Multi-Currency Invoices

Handling invoices where transaction currency differs from accounting currency

🔄 When Does Multi-Currency Apply?

Multi-Currency Detection
Transaction Currency

e.g., USD

Subsidiary Currency

e.g., NOK

Multi-Currency

Two TaxTotal elements

📊 Two TaxTotal Structure

First TaxTotal (Document Currency)

  • currencyID = DocumentCurrencyCode (USD)
  • Contains full TaxSubtotal breakdown
  • TaxableAmount, TaxAmount, TaxCategory

Second TaxTotal (Tax Currency)

  • currencyID = TaxCurrencyCode (NOK)
  • Contains ONLY TaxAmount
  • NO TaxSubtotal!

🔢 Required Fields

FieldPurposeExample
transaction.currencyDocumentCurrencyCodeUSD
subsidiary.currencyTaxCurrencyCodeNOK
transaction.exchangerateConversion rate10.5
custbody_tax_amount_vat_currency_ehfTax in accounting currency15750.00
⚠️ Critical: The second TaxTotal must NOT contain TaxSubtotal elements. Only the TaxAmount in tax currency.

📎 Attachments Guide

How to add PDF attachments to PEPPOL invoices

📋 Attachment Fields (Up to 3)

#File FieldDescription Field
1custbody_cgi_ehf_attachmentcustbody_supp_doc_description_ehf
2custbody_acs_ehf_file_attachmentcustbody_supp_doc_description_ehf_2
3custbody_acs_ehf_file_attachment3custbody_supp_doc_description_ehf_3

📏 Limits & Requirements

RequirementLimit
Maximum attachments3 files
Total size25 MB
DescriptionREQUIRED for each attachment
Supported formatsPDF, PNG, JPEG, CSV, XLSX

📂 MIME Types

ExtensionMIME Type
.pdfapplication/pdf
.pngimage/png
.jpg/.jpegimage/jpeg
.csvtext/csv
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
⚠️ Important: Every attachment MUST have a description. Missing descriptions cause validation error BR-52.

🧮 PEPPOL Calculation Formulas

How amounts must be calculated for PEPPOL compliance

📐 Line Level Calculations

ElementFormulaRule
LineExtensionAmount Quantity × PriceAmount / BaseQuantity BR-26-CHECK
Line Net (with allowances) LineExtensionAmount + Charges - Allowances PEPPOL-EN16931-R120
Line Tax Amount LineNetAmount × TaxRate / 100 BR-CO-18
⚠️ BaseQuantity MUST = 1: NetSuite stores rates as "per unit" so always use BaseQuantity="1"

📊 Document Level Calculations

ElementFormulaNetSuite Field
SumOfLineExtensionAmount Σ (all line LineExtensionAmount) transaction.subtotal
AllowanceTotalAmount Σ (all document allowances) transaction.discounttotal
ChargeTotalAmount Σ (all document charges) transaction.shippingcost
TaxExclusiveAmount SumOfLines + Charges - Allowances (calculated)
TaxInclusiveAmount TaxExclusiveAmount + TaxTotal transaction.total
PayableAmount TaxInclusiveAmount - PrepaidAmount transaction.amountremainingtotalbox

💰 Tax Subtotal Calculations

ElementFormulaRule
TaxableAmount (per category) Σ (LineNetAmount where TaxCategory = X) BR-45
TaxAmount (per category) TaxableAmount × TaxRate / 100 BR-46
Total TaxAmount Σ (all TaxSubtotal TaxAmount) BR-CO-14

🔢 Decimal Rules

2 Decimal Places Required:

  • LineExtensionAmount
  • TaxExclusiveAmount
  • TaxInclusiveAmount
  • PayableAmount
  • TaxAmount
  • TaxableAmount
  • AllowanceAmount
  • ChargeAmount

FreeMarker Format:

<cbc:Amount>${amount?string["#0.00"]}</cbc:Amount> // Example outputs: 100 → "100.00" 99.999 → "100.00" (rounded) 0 → "0.00"

🏢 Equinor Requirements Summary

Complete checklist for Equinor invoice compliance

✅ Mandatory Equinor Fields

FieldNetSuite LocationFormat/RuleExample
PO Number otherrefnum Exactly 10 digits, starts with 46 4600012345
Order Line Reference custcol_cgi_ehf_orderlinereference POLine/ServiceLine or POLine#ServiceLine 10/20 or 10#20
SES Number custcol_cgi_ehf_buyers_item_id Service Entry Sheet number 5000123456
Buyer EndpointID custbody_buyer_elec_add_ehf Equinor org number 923609016
Delivery GLN custbody_deliver_loc_identifier_ehf 13-digit GLN 7080005051897
Contract Reference custbody_contract_ref_ehf Should start with 46 4600098765

🔴 Common Equinor Rejections

  • PO Number not 10 digits
  • Missing Order Line Reference on ANY line
  • Order Line Ref format wrong (need / or #)
  • Missing SES number
  • GLN not 13 digits
  • Zero-amount lines present
  • Negative amounts on invoice (use Credit Note)

📧 Equinor Contact Details

ItemValue
Organization Number923609016
Endpoint Scheme0192
Access PointBasware
VAT NumberNO923609016MVA
💡 Tip: Set these as defaults on the Equinor customer record!

📋 Pre-Send Equinor Checklist

  • PO Number is exactly 10 digits (starts with 46)
  • Every line has Order Line Reference (format: 10/20 or 10#20)
  • Every line has SES Number (Buyer's Item ID)
  • Delivery GLN is 13 digits
  • No zero-amount lines
  • No negative amounts (use Credit Note instead)
  • Contract Reference starts with 46
  • Service dates filled for time-based services
  • Bank IBAN is Norwegian format (NO + 13 digits, no spaces)

🗺️ Complete Field Mappings

All NetSuite fields mapped to UBL XML elements

🎯 Interactive Invoice Map

Click on any section to see the NetSuite field mapping

Supplier
🏢 DeepOcean AS
Org: 912345678
Invoice
INV-2024-0001
Date: 2024-01-15 | Type: 380
Bill To (Customer)
Equinor ASA
EndpointID: 923609016
Ship To (Delivery)
📍 Stavanger Base
GLN: 7080005051897
📋 Purchase Order Reference (Equinor Critical!)
PO: 4600012345
Line Items
ItemQtyRateAmountOrderLineRef
Consulting Services10 HUR1,500.0015,000.0010/20
Equipment Rental5 DAY2,000.0010,000.0010/30
Tax Summary
Taxable (S-25%):25,000.00
VAT Amount:6,250.00
Payment
Total:31,250.00 NOK
IBAN: NO9386011117947

🔄 Field Transformation Flow

Click invoice sections above OR fields below to explore mappings

📥 NetSuite Field

FreeMarker
Template Engine

📤 UBL XML Element

CategoryNetSuite FieldUBL ElementNotes
Headertransaction.tranid//cbc:IDInvoice number
Headertransaction.trandate//cbc:IssueDateYYYY-MM-DD
Headertransaction.duedate//cbc:DueDatePayment due
Headercustbody_inv_type_name_ehf//cbc:InvoiceTypeCode380/381/384
Headertransaction.currency//cbc:DocumentCurrencyCodeISO 4217
Headertransaction.otherrefnum//cac:OrderReference/cbc:IDPO Number (10 digits!)
Headercustbody_contract_ref_ehf//cac:ContractDocumentReference/cbc:IDContract ref
Headercustbody_cgi_ehf_contactemail//cbc:BuyerReferenceBuyer email
Headertransaction.memo//cbc:NoteInvoice memo
Suppliercustrecord_seller_electronic_address_ehf//cac:AccountingSupplierParty//cbc:EndpointIDYour org#
Suppliercustrecord_elr_add_id_scheme_id_ehf//cbc:EndpointID/@schemeID0192 for NO
Suppliersubsidiary.legalname//cbc:RegistrationNameLegal name
Suppliersubsidiary.vatregnumber//cac:PartyTaxScheme/cbc:CompanyIDNO{9}MVA
Suppliersubsidiary.address1//cbc:StreetNameStreet address
Suppliersubsidiary.city//cbc:CityNameCity
Suppliersubsidiary.zip//cbc:PostalZonePostal code
Customercustbody_buyer_elec_add_ehf//cac:AccountingCustomerParty//cbc:EndpointIDCustomer org#
Customercustbody_buyer_elec_scheme_id_ehf//cbc:EndpointID/@schemeIDEAS code
Customercustbody_buyer_identifier_ehf//cac:PartyIdentification/cbc:IDLegal ID
Customercustbody_buyer_id_scheme_ehf//cbc:ID/@schemeIDICD code
Customercustomer.companyname//cbc:RegistrationNameCustomer name
Deliverycustbody_deliver_loc_identifier_ehf//cac:DeliveryLocation/cbc:IDGLN (13 digits)
Deliverycustbody_deliver_loc_scheme_id_ehf//cbc:ID/@schemeID0088 for GLN
Paymentcustbody_rm_bankpaymentaccount//cac:PayeeFinancialAccountBank account link
Paymentcustrecord_combankdet_iban//cac:PayeeFinancialAccount/cbc:IDIBAN (no spaces!)
Paymentcustrecord_bank_branch_code//cac:FinancialInstitutionBranch/cbc:IDBIC/SWIFT
Taxtransaction.taxtotal//cac:TaxTotal/cbc:TaxAmountTotal tax
Taxcustbody_tax_amount_vat_currency_ehf//cac:TaxTotal[2]/cbc:TaxAmountMulti-currency tax
Lineitem.line//cac:InvoiceLine/cbc:IDLine number
Lineitem.quantity//cbc:InvoicedQuantityQuantity
Lineitem.units//cbc:InvoicedQuantity/@unitCodeHUR/DAY/EA
Lineitem.amount//cbc:LineExtensionAmountCannot be 0!
Lineitem.amount / item.quantity//cac:Price/cbc:PriceAmountCalculated unit price
Linecustcol_cgi_ehf_orderlinereference//cac:OrderLineReference/cbc:LineIDPO line ref
Linecustcol_cgi_ehf_buyers_item_id//cac:BuyersItemIdentification/cbc:IDSES number
Attachmentcustbody_cgi_ehf_attachment//cac:AdditionalDocumentReferenceFile 1
Attachmentcustbody_supp_doc_description_ehf//cbc:DocumentDescriptionRequired!

📝 Transaction Body Fields

All custom fields on invoice/credit note transactions

Field IDLabelUBL ElementRequired
custbody_buyer_elec_add_ehfBuyer Electronic Address//cbc:EndpointID (buyer)Yes
custbody_buyer_elec_scheme_id_ehfBuyer Scheme ID//cbc:EndpointID/@schemeIDYes
custbody_buyer_identifier_ehfBuyer Identifier//cac:PartyIdentification/cbc:IDNo
custbody_buyer_id_scheme_ehfBuyer ICD Scheme//cbc:ID/@schemeIDNo
custbody_cgi_ehf_contactemailBuyer Reference Email//cbc:BuyerReferenceRecommended
custbody_inv_type_name_ehfInvoice Type Code//cbc:InvoiceTypeCodeYes
custbody_contract_ref_ehfContract Reference//cac:ContractDocumentReference/cbc:IDNo
custbody_rm_bankpaymentaccountBank Payment Account//cac:PayeeFinancialAccountYes
custbody_deliver_loc_identifier_ehfDelivery GLN//cac:DeliveryLocation/cbc:IDNo
custbody_deliver_loc_scheme_id_ehfDelivery Scheme//cbc:ID/@schemeIDNo
custbody_tax_amount_vat_currency_ehfTax in VAT Currency//cac:TaxTotal[2]/cbc:TaxAmountMulti-curr only
custbody_ehf_period_start_dateInvoice Period Start//cac:InvoicePeriod/cbc:StartDateNo
custbody_ehf_period_end_dateInvoice Period End//cac:InvoicePeriod/cbc:EndDateNo
custbody_remittance_info_ehfPayment ID / KID//cbc:PaymentIDNo

👥 Customer Entity Fields

Fields configured on customer records for PEPPOL - these provide defaults for transactions

Field IDLabelPurposeExample
custentity_buyer_elec_add_ehfBuyer Electronic AddressDefault EndpointID923609016
custentity_buyer_elec_scheme_id_ehfBuyer Scheme IDEAS code0192
custentity_buyer_identifier_ehfBuyer IdentifierLegal identifier923609016
custentity_buyer_id_scheme_ehfBuyer ICD SchemeICD code0192
custentity_deliver_loc_identifier_ehfDelivery GLNDefault delivery location7080001321284
custentity_deliver_loc_scheme_ehfDelivery SchemeGLN scheme0088
💡 Tip: Customer entity fields are copied to transaction fields when creating an invoice. You can override them at the transaction level.

📝 Line Item Fields

Custom column fields on invoice/credit note lines

Field IDLabelUBL ElementRequired
custcol_cgi_ehf_orderlinereferenceOrder Line Reference//cac:OrderLineReference/cbc:LineIDYes (Equinor)
custcol_cgi_ehf_buyers_item_idBuyer's Item ID (SES)//cac:BuyersItemIdentification/cbc:IDYes (Equinor)
custcol_ehf_service_start_dateService Start Date//cac:InvoicePeriod/cbc:StartDateNo
custcol_ehf_service_end_dateService End Date//cac:InvoicePeriod/cbc:EndDateNo
custcol_ehf_line_noteLine Note//cac:InvoiceLine/cbc:NoteNo
custcol_accounting_cost_ehfLine Accounting Cost//cac:InvoiceLine/cbc:AccountingCostNo
⚠️ Equinor Requirement: Order Line Reference format is POLine/ServiceLine (e.g., 10/20) or POLine#ServiceLine (e.g., 10#20). Get these values from the customer's purchase order. The POLine is the PO line number and ServiceLine is the service entry line.

🌳 Complete Invoice XML Structure

Full UBL 2.1 invoice with all NetSuite field mappings

📄 ROOT & HEADER
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-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>INV-2026-00123</cbc:ID> transaction.tranid
<cbc:IssueDate>2026-01-17</cbc:IssueDate> transaction.trandate
<cbc:DueDate>2026-02-16</cbc:DueDate> transaction.duedate
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode> custbody_inv_type_name_ehf
<cbc:DocumentCurrencyCode>NOK</cbc:DocumentCurrencyCode> transaction.currency
<cbc:BuyerReference>[email protected]</cbc:BuyerReference> custbody_cgi_ehf_contactemail
📎 ORDER REFERENCE
<cac:OrderReference>
<cbc:ID>4600012345</cbc:ID> transaction.otherrefnum ⚠️ 10 digits!
</cac:OrderReference>
🏢 SUPPLIER (AccountingSupplierParty)
<cac:AccountingSupplierParty><cac:Party>
<cbc:EndpointID schemeID="0192">990888213</cbc:EndpointID> custrecord_seller_electronic_address_ehf
<cac:PartyLegalEntity><cbc:RegistrationName>Your Company AS</cbc:RegistrationName></cac:PartyLegalEntity> subsidiary.legalname
</cac:Party></cac:AccountingSupplierParty>
🏪 CUSTOMER (AccountingCustomerParty)
<cac:AccountingCustomerParty><cac:Party>
<cbc:EndpointID schemeID="0192">923609016</cbc:EndpointID> custbody_buyer_elec_add_ehf
</cac:Party></cac:AccountingCustomerParty>
💳 PAYMENT MEANS
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode> 30 = Credit transfer
<cac:PayeeFinancialAccount><cbc:ID>NO9386011117947</cbc:ID></cac:PayeeFinancialAccount> ⚠️ NO SPACES!
</cac:PaymentMeans>
📊 TAX TOTAL
<cac:TaxTotal>
<cbc:TaxAmount currencyID="NOK">15000.00</cbc:TaxAmount>
</cac:TaxTotal>
💰 LEGAL MONETARY TOTAL
<cac:LegalMonetaryTotal>
<cbc:PayableAmount currencyID="NOK">75000.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
📝 INVOICE LINE
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">40.00</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount>60000.00</cbc:LineExtensionAmount> ⚠️ Cannot be 0!
<cac:OrderLineReference><cbc:LineID>10/20</cbc:LineID></cac:OrderLineReference> custcol_cgi_ehf_orderlinereference Format: POLine/ServiceLine or POLine#ServiceLine
<cac:Price><cbc:BaseQuantity>1</cbc:BaseQuantity></cac:Price> ⚠️ ALWAYS 1!
</cac:InvoiceLine>
</Invoice>

🌳 Credit Note XML Structure

Key differences from Invoice XML

📝 Credit Note vs Invoice Differences

ElementInvoiceCredit Note
Root Element<Invoice><CreditNote>
Type Code380381
Type Element<cbc:InvoiceTypeCode><cbc:CreditNoteTypeCode>
Line Element<cac:InvoiceLine><cac:CreditNoteLine>
Quantity Element<cbc:InvoicedQuantity><cbc:CreditedQuantity>

📎 BillingReference (REQUIRED for Credit Notes)

<cac:BillingReference> ⚠️ REQUIRED!
<cac:InvoiceDocumentReference>
<cbc:ID>INV-2026-00100</cbc:ID> apply[].refnum OR transaction.createdfrom
<cbc:IssueDate>2026-01-01</cbc:IssueDate>
</cac:InvoiceDocumentReference>
</cac:BillingReference>

📊 Country Comparison Table

Side-by-side comparison of all PEPPOL countries

🔢 Scheme IDs & Identifiers

Country EAS (Routing) ICD (Legal) VAT Rate Org # Format VAT # Format
🇳🇴 Norway 0192 0192 25% 9 digits (MOD11) NO{9}MVA
🇬🇧 United Kingdom 9932 0199 20% 8 digits (CRN) GB{9-12}
🇸🇪 Sweden 0007 0007 25% 10 digits SE{10}01
🇩🇰 Denmark 0184 0184 25% 8 digits (CVR) DK{8}
🇫🇮 Finland 0037 0037 24% 8 digits (Y-tunnus) FI{8}
🇳🇱 Netherlands 0106 0106 21% 8 digits (KvK) NL{9}B{2}
🇩🇪 Germany 0204 0204 19% 9 digits (Leitweg-ID) DE{9}
🇧🇪 Belgium 0208 0208 21% 10 digits (KBO) BE{10}
🇫🇷 France 0009 0009 20% 9 digits (SIREN) FR{2}{9}
🇮🇹 Italy 0211 0211 22% 11 digits (Cod. Fiscale) IT{11}

🏦 IBAN Formats by Country

CountryIBAN FormatLengthExampleRegex Pattern
🇳🇴 NorwayNO## #### #### ###15NO9386011117947^NO\d{13}$
🇬🇧 UKGB## AAAA #### #### #### ##22GB29NWBK60161331926819^GB\d{2}[A-Z]{4}\d{14}$
🇸🇪 SwedenSE## #### #### #### #### ####24SE4550000000058398257466^SE\d{22}$
🇩🇰 DenmarkDK## #### #### #### ##18DK5000400440116243^DK\d{16}$
🇫🇮 FinlandFI## #### #### #### ##18FI2112345600000785^FI\d{16}$
🇳🇱 NetherlandsNL## AAAA #### #### ##18NL91ABNA0417164300^NL\d{2}[A-Z]{4}\d{10}$
🇩🇪 GermanyDE## #### #### #### #### ##22DE89370400440532013000^DE\d{20}$

🏢 Registration Requirements

CountryBusiness RegisterSpecial Requirements
🇳🇴 NorwayBrønnøysundregistreneForetaksregisteret - Second PartyTaxScheme required
🇬🇧 UKCompanies HouseLEI (Legal Entity Identifier) for PartyIdentification
🇸🇪 SwedenBolagsverketSwedish org number (10 digits with hyphen: ######-####)
🇩🇰 DenmarkErhvervsstyrelsenCVR number required
🇫🇮 FinlandPRH (Patent and Registration Office)Y-tunnus (Business ID)
🇳🇱 NetherlandsKvK (Chamber of Commerce)KvK number + BTW (VAT) number
🇩🇪 GermanyHandelsregisterLeitweg-ID for B2G, USt-IdNr for VAT

🔍 PEPPOL Directory Lookup

Verify if a company is registered on the PEPPOL network:

🌐 Official PEPPOL Directory
https://directory.peppol.eu

Search by participant ID (e.g., 0192:923609016)

🇳🇴 Norwegian EHF Register
ELMA Participants List

Downloadable CSV of all Norwegian PEPPOL participants

⚡ Energy Sector Customers by Country

CountryMajor CustomersSpecial Requirements
🇳🇴 NorwayEquinor, AkerBP, Vår Energi, ConocoPhillips NO10-digit PO, OrderLineRef, SES number
🇬🇧 UKShell UK, BP, Harbour Energy, INEOSLEI identifier, UK VAT format
🇸🇪 SwedenVattenfall, Lundin EnergySwedish org number format
🇩🇰 DenmarkØrsted, Total E&P DenmarkCVR number format
🇳🇱 NetherlandsShell Netherlands, NAM, ExxonMobil NLKvK number, BTW format
🇩🇪 GermanyWintershall Dea, BASFLeitweg-ID for government contracts

🇳🇴 Norway - Complete Guide

Comprehensive rules for Norwegian PEPPOL invoicing

🔢
0192
EAS & ICD
💰
25%
Standard VAT
🏦
15
IBAN Length
📋
9
Org # Digits

📋 Norwegian Validation Rules

RuleRequirementFormat/ExampleSeverity
NO-R-001Org number MOD11 check digit9 digits, last is check digitL
NO-R-002VAT number formatNO923609016MVAL
NO-R-003IBAN formatNO9386011117947L
NO-R-004Foretaksregisteret requiredSecond PartyTaxSchemeL

🔢 Scheme IDs

EAS (Routing)
0192
Norwegian org number
ICD (Legal ID)
0192
Same as EAS for Norway

🔣 Format Patterns

FieldFormatRegexExample
Org Number9 digits (starts 8 or 9)^[89]\d{8}$923609016
VAT NumberNO + 9 digits + MVA^NO\d{9}MVA$NO923609016MVA
IBANNO + 13 digits^NO\d{13}$NO9386011117947
Bank Account11 digits^\d{11}$86011117947
Postal Code4 digits^\d{4}$4035

🏢 Foretaksregisteret Requirement

Norwegian suppliers must include two PartyTaxScheme elements:

<cac:PartyTaxScheme> 1️⃣ VAT registration
<cbc:CompanyID>NO923609016MVA</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyTaxScheme> 2️⃣ Foretaksregisteret
<cbc:CompanyID>Foretaksregisteret</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>TAX</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>

⚡ Norwegian Energy Customers

CustomerOrg NumberEndpointIDSpecial Requirements
Equinor Energy AS9236090160192:92360901610-digit PO, OrderLineRef, SES
AkerBP ASA9897958480192:989795848Standard PEPPOL
Vår Energi AS9180506320192:918050632Standard PEPPOL
ConocoPhillips Norge9191606750192:919160675Standard PEPPOL

💰 Norwegian VAT Rates

RateCategoryApplies To
25%S (Standard)General goods and services
15%S (Reduced)Food products
12%S (Low)Transport, cinema, hotels
0%Z (Zero)Exports, shipping
0%E (Exempt)Healthcare, education, finance

🇬🇧 United Kingdom - Complete Guide

Comprehensive rules for UK PEPPOL invoicing

🔢
9932
EAS Code
🏢
0199
ICD (LEI)
💰
20%
Standard VAT
🏦
22
IBAN Length

📋 UK Scheme IDs

PurposeSchemeFormatExample
EndpointID (VAT routing)9932GB + 9-12 digitsGB123456789
EndpointID (LEI routing)019920 alphanumeric549300GKFG0RYRRQ1414
PartyIdentification (legal)019920 char LEI549300GKFG0RYRRQ1414
Company Number (CRN)99338 digits12345678
⚠️ Key Difference from Norway: In UK, EAS (routing) and ICD (legal ID) use DIFFERENT scheme codes: 9932 for VAT routing vs 0199 for LEI identification. In Norway, both use 0192.

🔣 Format Patterns

FieldFormatRegexExample
VAT NumberGB + 9-12 digits^GB\d{9,12}$GB123456789
Company Number8 digits^\d{8}$12345678
LEI20 alphanumeric^[A-Z0-9]{20}$549300GKFG0RYRRQ1414
IBANGB + 2 check + 4 bank + 14 account^GB\d{2}[A-Z]{4}\d{14}$GB29NWBK60161331926819
Postal CodeUK postcode formatVariousSW1A 1AA

⚡ UK Energy Customers

CustomerVAT NumberLEINotes
Shell UKGB235730540Lookup requiredUse LEI for PartyID
BP plcGB146024686213800LH1BZH3DI6G760Use LEI for PartyID
Harbour EnergyGB-Lookup requiredUse LEI for PartyID
INEOSGB-Lookup requiredUse LEI for PartyID

💰 UK VAT Rates

RateCategoryApplies To
20%S (Standard)General goods and services
5%S (Reduced)Domestic fuel, children's car seats
0%Z (Zero)Food, books, children's clothes, exports
0%E (Exempt)Insurance, finance, healthcare, education

🇸🇪 Sweden - Complete Guide

Comprehensive rules for Swedish PEPPOL invoicing

🔢
0007
EAS & ICD
💰
25%
Standard VAT
🏦
24
IBAN Length
📋
10
Org # Digits

🔣 Format Patterns

FieldFormatRegexExample
Org Number10 digits (######-####)^\d{10}$5560360793
VAT NumberSE + 10 digits + 01^SE\d{10}01$SE556036079301
IBANSE + 22 digits^SE\d{22}$SE4550000000058398257466

⚡ Swedish Energy Customers

CustomerOrg NumberEndpointID
Vattenfall AB55603607930007:5560360793
Lundin Energy (now Aker BP Sweden)55656209030007:5565620903

💰 Swedish VAT Rates

RateCategoryApplies To
25%S (Standard)General goods and services
12%S (Reduced)Food, restaurants, hotels
6%S (Low)Books, newspapers, transport
0%Z/EExports, healthcare, education

🇩🇰 Denmark - Complete Guide

Comprehensive rules for Danish PEPPOL invoicing

🔢
0184
EAS & ICD
💰
25%
Standard VAT
🏦
18
IBAN Length
📋
8
CVR Digits

🔣 Format Patterns

FieldFormatRegexExample
CVR Number8 digits^\d{8}$36213728
VAT NumberDK + 8 digits^DK\d{8}$DK36213728
IBANDK + 16 digits^DK\d{16}$DK5000400440116243

⚡ Danish Energy Customers

CustomerCVR NumberEndpointID
Ørsted A/S362137280184:36213728
TotalEnergies EP Denmark-Lookup required

💰 Danish VAT Rates

RateCategoryApplies To
25%S (Standard)All taxable goods and services
0%ZExports, newspapers
0%EHealthcare, education, finance
Note: Denmark has no reduced VAT rates - only 25% or exempt.

🇫🇮 Finland - Complete Guide

Comprehensive rules for Finnish PEPPOL invoicing

🔢
0037
EAS & ICD
💰
24%
Standard VAT
🏦
18
IBAN Length
📋
8
Y-tunnus Digits

🔣 Format Patterns

FieldFormatRegexExample
Y-tunnus (Business ID)7 digits + hyphen + check^\d{7}-\d$0116323-8
VAT NumberFI + 8 digits^FI\d{8}$FI01163238
IBANFI + 16 digits^FI\d{16}$FI2112345600000785
OVT Code0037 + Y-tunnus (no hyphen)-003701163238

💰 Finnish VAT Rates

RateCategoryApplies To
24%S (Standard)General goods and services
14%S (Reduced)Food, restaurant services
10%S (Low)Books, newspapers, transport, hotels
0%Z/EExports, healthcare, education

🇳🇱 Netherlands - Complete Guide

Comprehensive rules for Dutch PEPPOL invoicing

🔢
0106
EAS & ICD
💰
21%
Standard VAT
🏦
18
IBAN Length
📋
8
KvK Digits

🔣 Format Patterns

FieldFormatRegexExample
KvK Number8 digits^\d{8}$27378529
BTW Number (VAT)NL + 9 digits + B + 2 digits^NL\d{9}B\d{2}$NL123456789B01
IBANNL + 2 + 4 letters + 10 digits^NL\d{2}[A-Z]{4}\d{10}$NL91ABNA0417164300

⚡ Dutch Energy Customers

CustomerKvK NumberEndpointID
Shell Netherlands273785290106:27378529
NAM (Nederlandse Aardolie Maatschappij)-Lookup required
ExxonMobil Netherlands-Lookup required

💰 Dutch VAT Rates

RateCategoryApplies To
21%S (Standard)General goods and services
9%S (Reduced)Food, books, medicines, hotels, transport
0%ZExports, intra-EU supplies
0%EHealthcare, education, finance

🇩🇪 Germany - Complete Guide

Comprehensive rules for German PEPPOL invoicing

🔢
0204
EAS & ICD
💰
19%
Standard VAT
🏦
22
IBAN Length
📋
9
USt-ID Digits

🔣 Format Patterns

FieldFormatRegexExample
Leitweg-IDVariable (B2G routing)Complex format991-12345-67
USt-IdNr (VAT)DE + 9 digits^DE\d{9}$DE123456789
IBANDE + 20 digits^DE\d{20}$DE89370400440532013000
HandelsregisterHRB + number-HRB 12345
⚠️ XRechnung: Germany uses XRechnung (based on EN16931) for B2G invoicing. For PEPPOL BIS 3.0 compatibility, ensure your invoices comply with both standards.

⚡ German Energy Customers

CustomerUSt-IdNrNotes
Wintershall DeaDE-Lookup required
BASF SEDE811156135Large chemical/energy

💰 German VAT Rates

RateCategoryApplies To
19%S (Standard)General goods and services
7%S (Reduced)Food, books, newspapers, hotels, transport
0%ZExports, intra-EU supplies
0%EHealthcare, education, finance, insurance

🏢 Subsidiary Setup

How to configure a subsidiary for PEPPOL e-invoicing

📋 Required Fields Checklist

  • subsidiary.legalname - Legal Name
  • custrecord_seller_electronic_address_ehf - Seller Electronic Address (org number)
  • custrecord_elr_add_id_scheme_id_ehf - Seller Scheme ID (0192 for NO)
  • subsidiary.vatregnumber - VAT Registration Number
  • subsidiary.address1 - Street Address
  • subsidiary.city - City
  • subsidiary.zip - Postal Code
  • Bank Account with IBAN (no spaces!)

📍 Navigation

Setup → Company → Subsidiaries → [Select Subsidiary] → E-Document subtab

👥 Customer Setup

How to configure a customer for PEPPOL e-invoicing

📋 Required Configuration Checklist

  • E-Document Package = EHF Peppol
  • Generate Transaction PDF ☑️
  • Template Auto-Selection ☑️
  • custentity_buyer_elec_add_ehf - Buyer Electronic Address
  • custentity_buyer_elec_scheme_id_ehf - Buyer Scheme ID
  • custentity_buyer_identifier_ehf - Buyer Identifier
  • custentity_buyer_id_scheme_ehf - Buyer ICD Scheme
  • custentity_deliver_loc_identifier_ehf - Delivery Location GLN (optional)

📍 Navigation

Lists → Relationships → Customers → [Select Customer] → E-Document subtab

📜 Scripts & Deployments

SuiteScript components of the PEPPOL solution

📋 Script Components

ScriptTypePurposeFile
PEPPOL ValidatorSuiteletValidate XML against 290+ rulesSL_PEPPOL_Validator_Local.js
Validator ConstantsModuleValidation rules and field mappingsSL_PEPPOL_Validator_Constants.js
Validate ButtonUser EventAdd Validate button to invoiceUE_PEPPOL_ValidateButton_Fancy.js
PDF InjectorUser EventInject PDF attachments as BASE64cgi_set_pdf_content_base64_ue.js
SFTP SenderScheduledUpload XML to CGI SFTPCGI_PL_PeppolSftp_DO.js

🔧 Templates

TemplateTypePurpose
Invoice TemplateFreeMarkerGenerate UBL 2.1 Invoice XML
Credit Note TemplateFreeMarkerGenerate UBL 2.1 Credit Note XML

🔌 API Documentation

Suitelet endpoints and integration guide

📋 PEPPOL Validator Suitelet

PropertyValue
Script IDcustomscript_sl_peppol_validator
Deployment IDcustomdeploy_sl_peppol_validator
HTTP MethodGET / POST
Entry PointonRequest(context)

📥 Request Parameters

ParameterTypeDescriptionExample
transactionIdIntegerInternal ID of invoice/credit memo12345
transactionTypeStringRecord typeinvoice, creditmemo
modeStringValidation modefull, quick
formatStringResponse formatjson, html

📤 Response Structure (JSON)

{
  "success": true,
  "transactionId": 12345,
  "transactionNumber": "INV-2026-00123",
  "validationDate": "2026-01-17T14:30:00Z",
  "totalRules": 290,
  "passed": 285,
  "failed": 3,
  "warnings": 2,
  "errors": [
    {
      "ruleId": "EQ-PO-001",
      "severity": "MANDATORY",
      "message": "PO must be exactly 10 digits",
      "field": "otherrefnum",
      "currentValue": "460001234",
      "expectedFormat": "10 digits"
    }
  ],
  "xmlPreview": "<Invoice>...</Invoice>"
}

🔗 URL Construction

// Get Suitelet URL dynamically
var suiteletUrl = url.resolveScript({
    scriptId: 'customscript_sl_peppol_validator',
    deploymentId: 'customdeploy_sl_peppol_validator',
    params: {
        transactionId: record.id,
        transactionType: record.type,
        format: 'json'
    }
});

// Example URL (Production)
https://<account-id>.app.netsuite.com/app/site/hosting/scriptlet.nl
    ?script=customscript_sl_peppol_validator
    &deploy=customdeploy_sl_peppol_validator
    &transactionId=12345
    &transactionType=invoice
    &format=json

📊 Severity Levels

LevelCodeBehaviorAction Required
LEGALLBlocks PEPPOL transmissionMust fix before sending
MANDATORYMCustomer will rejectShould fix before sending
RECOMMENDEDRBest practice violationOptional fix
INFOIInformational onlyNo action needed

💻 Client-Side Integration Example

// Call validator from Client Script
function validatePEPPOL(transactionId) {
    return new Promise((resolve, reject) => {
        var suiteletUrl = url.resolveScript({
            scriptId: 'customscript_sl_peppol_validator',
            deploymentId: 'customdeploy_sl_peppol_validator',
            params: {
                transactionId: transactionId,
                format: 'json'
            }
        });
        
        https.get.promise({
            url: suiteletUrl
        }).then(function(response) {
            var result = JSON.parse(response.body);
            if (result.failed > 0) {
                // Show errors to user
                showValidationErrors(result.errors);
            }
            resolve(result);
        }).catch(reject);
    });
}

🔧 SFTP Sender API

PropertyValue
Script IDcustomscript_cgi_pl_peppolsftp_do
TypeScheduled Script
TriggerScheduled (every 15 min) or on-demand
SFTP Hostbtxdmz.eintegration.net
Port22

📁 SFTP Directory Structure

DirectoryPurpose
/outbound/invoices/Upload invoices for transmission
/outbound/creditnotes/Upload credit notes for transmission
/inbound/responses/MLR and Invoice Responses
/archive/Processed documents archive
⚠️ Authentication: SFTP credentials are stored in a custom record (SFTP Configuration). Never hardcode credentials in scripts. Use N/keyControl module or custom records with restricted access.

☑️ Pre-Send Checklists

Verify everything before sending

📋 New Customer Setup

  • E-Document Package = EHF Peppol
  • Generate Transaction PDF ☑️
  • Template Auto-Selection ☑️
  • Buyer Electronic Address filled
  • Buyer Scheme ID filled
  • Delivery GLN (if required)

📋 Pre-Send Invoice

  • PO number is exactly 10 digits
  • Order Line Refs on ALL lines
  • No zero-amount lines
  • PEPPOL Validator shows no errors
  • Bank account linked
  • IBAN has no spaces
  • Attachment descriptions filled

📖 Glossary

Key terms and definitions

TermDefinition
PEPPOLPan-European Public Procurement Online - network for electronic document exchange
BIS 3.0Business Interoperability Specification - PEPPOL's invoice format standard
UBL 2.1Universal Business Language - XML schema underlying PEPPOL
EN16931European standard for electronic invoicing
Access PointService provider connecting to PEPPOL network (e.g., Nordic Hub)
4-Corner ModelSender → Sender's AP → Receiver's AP → Receiver
EASElectronic Address Scheme - identifies PEPPOL routing scheme
ICDInternational Code Designator - identifies legal entity scheme
EndpointIDPEPPOL network address for routing documents
GLNGlobal Location Number - 13-digit location identifier
SESService Entry Sheet - Equinor's service confirmation number
MOD11Check digit algorithm for Norwegian org numbers
FreeMarkerTemplate engine used by NetSuite for XML generation
SuiteScriptNetSuite's JavaScript-based scripting language
BaseQuantityAlways 1 in PEPPOL (NetSuite stores per-unit rates)

❓ Frequently Asked Questions

Common questions and answers

30 FAQs

📚 General

What is PEPPOL?

PEPPOL (Pan-European Public Procurement Online) is a network for exchanging electronic business documents like invoices. It uses a 4-corner model: Sender → Sender's Access Point → Receiver's Access Point → Receiver. Think of it like email for invoices!

What is BIS 3.0?

BIS (Business Interoperability Specifications) 3.0 is the PEPPOL standard for invoice formatting. It defines which fields are required, their formats, and validation rules. Based on EN 16931 European standard and UBL 2.1 XML schema.

Why can't I send invoices from Sandbox?

Sandbox environments are blocked by design to prevent test data from reaching the real PEPPOL network. Only Production accounts can send to customers. The system checks runtime.envType and blocks if not "PRODUCTION".

What does "Sent" status mean?

It means the XML was uploaded to Nordic Hub's SFTP server. Nordic Hub then routes it through PEPPOL to the customer's Access Point. Important: "Sent" ≠ "Delivered". Actual delivery confirmation requires MLR (Message Level Response) tracking.

What's the difference between Invoice and Credit Note?

Invoice (380): Request for payment. Credit Note (381): Reduces amount owed, must reference original invoice. Credit notes use <CreditNote> root element and <CreditedQuantity> instead of <InvoicedQuantity>.

What's the difference between EAS and ICD?

EAS (Electronic Address Scheme) = Where to SEND the document (routing). ICD (Identification Code) = Who the company IS (legal ID). In Norway both use 0192, but in UK they differ: EAS=9932/9933, ICD=0199 for LEI.

Who is the Access Point provider?

Nordic Hub (operated by CGI) is the PEPPOL Access Point provider. They operate the SFTP server (btxdmz.eintegration.net) where invoices are uploaded, and route documents through the PEPPOL network to recipients.

🛢️ Equinor-Specific

What's the Equinor PO format?

Exactly 10 digits, typically starting with 46. Example: 4600012345. Validation regex: ^\d{10}$. This goes in transaction.otherrefnum//cac:OrderReference/cbc:ID

What is Order Line Reference?

Links each invoice line to the PO line and service line. Format: POLine/ServiceLine or POLine#ServiceLine. Example: 10/20 means PO line 10, service line 20. Field: custcol_cgi_ehf_orderlinereference

What is an SES Number?

Service Entry Sheet - a reference number Equinor provides to suppliers after confirming services were received. Include this on your invoice so Equinor can match it to their records (3-way matching: PO → SES → Invoice). Field: custcol_cgi_ehf_buyers_item_id//cac:BuyersItemIdentification/cbc:ID

What's Equinor's PEPPOL address?

EndpointID: 923609016 with schemeID 0192. This is their Norwegian organization number used for PEPPOL routing.

Why does Equinor reject zero-amount lines?

Equinor's system cannot process invoice lines with zero amounts. If you need to show a line without charge, either remove it entirely or use a Credit Note to adjust. Use EQ-LINE-001 validation to check.

Can I send negative amounts to Equinor?

No! Negative line amounts are rejected. If you need to reduce an amount, create a separate Credit Note referencing the original invoice. This is enforced by rule EQ-LINE-002.

What GLN format does Equinor require?

Delivery GLN must be exactly 13 digits. Example: 7080005051897. Goes in custbody_deliver_loc_identifier_ehf with schemeID 0088.

What other energy companies use similar requirements?

AkerBP, ConocoPhillips, Shell, and Vår Energi have similar (but not identical) requirements. Always check each company's specific mapping guidelines. Equinor's are the most detailed.

⚙️ Technical

Why must BaseQuantity always be 1?

NetSuite stores rates as "per unit" pricing. The PEPPOL formula is: LineExtensionAmount = Quantity × PriceAmount / BaseQuantity. If BaseQuantity ≠ 1, the calculation breaks. Always hardcode <cbc:BaseQuantity>1</cbc:BaseQuantity>.

How do I handle multi-currency invoices?

When document currency differs from tax currency (e.g., invoice in GBP, VAT reported in NOK), you need two TaxTotal elements: first in document currency, second in tax currency. Use custbody_vat_currency_ehf and custbody_tax_amount_vat_currency_ehf.

What format should the IBAN be?

NO SPACES! Norwegian format: NO + 13 digits. Example: NO9386011117947. Use FreeMarker: ${record.custbody_rm_bankpaymentaccount?replace(" ", "")}

How many attachments can I include?

Maximum 3 files, with a total size limit of 25MB. Each attachment MUST have a description or it will fail validation (BR-52). Supported formats: PDF, PNG, JPEG, CSV, XLSX.

What unit codes are supported?

UN/ECE Recommendation 20 codes. Common ones: HUR (hours), DAY (days), EA (each), KGM (kg), MTR (meters), LTR (liters), MON (months). Map from NetSuite units in template.

What's the correct element ordering?

UBL 2.1 requires strict element order! For example, in TaxTotal: TaxAmount must come before TaxSubtotal. In InvoiceLine: ID, Note, InvoicedQuantity, LineExtensionAmount, then nested elements. Use the XML structure reference.

How do I handle VAT exemption?

Use TaxCategory code E (Exempt) or AE (Reverse Charge). You MUST provide TaxExemptionReasonCode and TaxExemptionReason text. Tax amount must be 0.00 and rate must be 0%.

What's the Norwegian VAT number format?

Format: NO + 9-digit org number + MVA. Example: NO912345678MVA. The 9 digits must pass MOD11 check digit validation.

✅ Validation

What does severity L/M/R mean?

L (Legal): Blocks PEPPOL network transmission - must fix. M (Mandatory): Customer will reject - should fix. R (Recommended): Best practice - nice to fix. Focus on L and M first!

What are BR rules vs PEPPOL rules?

BR-xx: EN 16931 business rules (European standard). PEPPOL-xx: PEPPOL-specific extensions. NO-R-xx: Norwegian national rules. EQ-xx: Equinor-specific requirements.

Why do I get "empty element" errors?

PEPPOL doesn't allow empty required elements. If a field might be empty, either: (1) Use FreeMarker conditionals to skip the element entirely, or (2) Use fail-fast to stop template execution with clear error.

What's the 2-decimal rule?

All monetary amounts must have exactly 2 decimal places. Example: 1500.00 not 1500 or 1500.5. Use FreeMarker: ${amount?string["0.00"]}. Quantities can have up to 6 decimals.

How do I validate locally before sending?

Use the PEPPOL Validator Suitelet! It runs 290+ rules against your invoice before transmission. Access via: Transactions → PEPPOL → Validate Invoice. Fix all L and M severity issues before sending.

🔧 Troubleshooting

Customer says they didn't receive the invoice?

Check: (1) Status shows "Sent"? (2) Correct EndpointID used? (3) Customer registered on PEPPOL? (4) Check Nordic Hub portal for delivery status. "Sent" only means uploaded to SFTP, not delivered to customer.

Getting "UNEXPECTED_ERROR" in FreeMarker?

NetSuite's FreeMarker has limitations! Avoid: regex ?matches(), lambda expressions, ?filter(). Use simpler alternatives like ?contains(), ?starts_with(), or build helper macros.

XML validation passes but customer rejects?

PEPPOL validation ≠ Customer acceptance. Customer may have additional business rules. For Equinor: check PO format (10 digits), OrderLineRef format, SES numbers, GLN format, no zero/negative amounts.

How do I debug template issues?

Create a diagnostic template version that outputs raw field values. Check: (1) Field has data? (2) Correct field ID? (3) Null-safe access field!""? (4) Correct date/number formatting? Use browser console to view generated XML.

Invoice stuck in "Processing" status?

Check: (1) User Event script errors in script logs (2) SFTP connection issues (3) File size exceeds limit (4) PDF generation timeout. Look at System → Script Logs for detailed error messages.

How do I resend a failed invoice?

Clear the PEPPOL status field, fix the underlying issue, then trigger the User Event script again by editing and saving the transaction. Or use the "Resend" button if available in your customization.