⚡ 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 digitsOrder Line Ref
custcol_cgi_ehf_orderlinereference → Format: 10/20 or 10#20SES Number
custcol_cgi_ehf_buyers_item_id → Service Entry SheetBuyer EndpointID
custbody_buyer_elec_add_ehf → 923609016Delivery GLN
custbody_deliver_loc_identifier_ehf → 13 digitsBank Account
custbody_rm_bankpaymentaccount → IBAN no spaces!🔢 Scheme IDs
| Country | EAS (Routing) | ICD (Legal) |
|---|---|---|
| 🇳🇴 Norway | 0192 | 0192 |
| 🇬🇧 UK | 9932 | 0199 |
| GLN | 0088 | 0088 |
📊 Tax Categories
| Code | Name | Rate | Exemption |
|---|---|---|---|
| S | Standard | > 0% | - |
| Z | Zero | 0% | - |
| E | Exempt | 0% | vatex-eu-132 |
| AE | Reverse Charge | 0% | vatex-eu-ae |
| G | Export | 0% | vatex-eu-143 |
⏱️ Common Unit Codes
| Unit | Code |
|---|---|
| Hour | HUR |
| Day | DAY |
| Month | MON |
| Each | EA |
| Year | ANN |
⚠️ Top 5 Validation Errors
| Error | Cause | Fix |
|---|---|---|
| EQ-PO-001 | PO not 10 digits | Enter exactly 10 digits in PO/Check Number |
| LINE-004 | Missing Order Line Ref | Fill custcol_cgi_ehf_orderlinereference on ALL lines |
| PEPPOL-R010 | No Buyer EndpointID | Set custbody_buyer_elec_add_ehf |
| EQ-LINE-001 | Zero amount line | Remove or fix lines with 0 amount |
| PAY-002 | Invalid IBAN | Remove spaces from IBAN, check format |
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
🎯 Equinor Compliance Quick Check
🔄 Process Flow
1. Create
Invoice
2. E-Doc
Fields
3. Save
XML Gen
4. Validate
290+ Rules
5. Send
SFTP
📋 Document Types
| Type | Code | Root |
|---|---|---|
| Invoice | 380 | <Invoice> |
| Credit Note | 381 | <CreditNote> |
| Corrected | 384 | <Invoice> |
| Self-billed | 389 | <Invoice> |
🏢 Energy Customers
| Customer | Special Rules |
|---|---|
| Equinor | 10-digit PO, OrderLineRef, SES |
| AkerBP | Standard PEPPOL |
| Shell | LEI identifier (0199) |
| Vår Energi | Standard PEPPOL |
🔗 PEPPOL 4-Corner Model
How documents route through the PEPPOL network
🔄 End-to-End Data Flow
Complete journey of an invoice from NetSuite to customer's ERP
📊 Invoice Lifecycle
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)
| Step | Component | Action |
|---|---|---|
| 1 | User Event Script | Triggers on invoice save |
| 2 | FreeMarker Template | Generates UBL 2.1 XML |
| 3 | PDF Generator | BASE64 encodes attachments |
| 4 | Validator Suitelet | Checks 290+ rules |
| 5 | SFTP Script | Uploads to btxdmz.eintegration.net |
| 6 | Nordic Hub Access Point | Validates & routes via PEPPOL |
📥 Response Flow (Confirmation)
| Response | Meaning | Status |
|---|---|---|
| MLR | Message Level Response | Syntax accepted |
| IMR | Invoice Message Response | Business accepted |
| IRN | Invoice Response Negative | Rejected by buyer |
| SFTP 200 | Upload confirmed | File received |
/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
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
019201990088📋 Complete Scheme Reference
| Context | Norway 🇳🇴 | UK 🇬🇧 | GLN | NetSuite Field |
|---|---|---|---|---|
| Seller EndpointID | 0192 | 9932 | 0088 | custrecord_elr_add_id_scheme_id_ehf |
| Buyer EndpointID | 0192 | 9932 | 0088 | custbody_buyer_elec_scheme_id_ehf |
| Seller PartyID | 0192 | - | 0088 | subsidiary.federalidnumber |
| Buyer PartyID | 0192 | 0199 | 0088 | custbody_buyer_identifier_ehf |
| Delivery Location | - | - | 0088 | custbody_deliver_loc_scheme_id_ehf |
💰 VAT Category Decision Tree
Determine the correct VAT category code based on transaction type
🌳 Which VAT Category?
Start
Is VAT charged?
S - Standard
VAT Rate > 0%
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
| Code | Name | Rate | When to Use | Exemption Code | Seller VAT | Buyer VAT |
|---|---|---|---|---|---|---|
| S | Standard | > 0% | Normal domestic sale with VAT | - | Required | - |
| Z | Zero Rate | 0% | Zero-rated (food, books in UK) | - | Required | - |
| E | Exempt | 0% | VAT exempt (insurance, finance) | vatex-eu-132 | Required | - |
| AE | Reverse Charge | 0% | B2B cross-border EU, construction | vatex-eu-ae | Required | Required |
| G | Export | 0% | Export outside EU/EEA | vatex-eu-143 | Required | - |
| K | Intra-Community | 0% | EU goods to VAT-registered buyer | vatex-eu-ic | Required | Required |
| O | Not Subject | 0% | Outside scope of VAT | vatex-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
🔧 FreeMarker Template Reference
Helper functions used in production invoice/credit note templates
🗺️ Country Code Mapping
🔢 Scheme ID Functions
| Function | Purpose | NO | GB | Default |
|---|---|---|---|---|
getSupplierEndpointSchemeID() | Seller EAS code | 0192 | 9932 | 0088 |
getCustomerEndpointSchemeID() | Buyer EAS code | 0192 | 0199 | 0088 |
getSupplierIdentifierSchemeID() | Seller ICD code | 0192 | - | - |
getCustomerIdentifierSchemeID() | Buyer ICD code | 0192 | 0199 | 0088 |
isGLN() | Check if 13-digit GLN | Returns true if matches ^[0-9]{13}$ | ||
💱 Tax & Decimal Functions
| Function | Purpose | Example |
|---|---|---|
formatDecimal(value, default) | Format to 2 decimals | formatDecimal(100) → "100.00" |
getTaxRate(taxRateString) | Extract rate from "25%" | getTaxRate("25%") → "25" |
extractVATCategory(taxCode, rate) | Determine S/Z/E/AE/G | extractVATCategory("VAT:S-NO", 25) → "S" |
getExemptionReasonCode(category) | Get vatex code | getExemptionReasonCode("AE") → "vatex-eu-ae" |
📏 Unit Code Mapping
| NetSuite Unit | UN/ECE Code |
|---|---|
| Hour / Hours / Hr | HUR |
| Day / Days | DAY |
| Week / Weeks / Wk | WEE |
| Month / Months / Mo | MON |
| Year / Years / Yr | ANN |
| NetSuite Unit | UN/ECE Code |
|---|---|
| Each / Ea / Unit | EA |
| Piece / Pcs | H87 |
| Kilogram / Kg | KGM |
| Liter / Litre / L | LTR |
| Meter / Metre / M | MTR |
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
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
| # | Error | Cause | Fix |
|---|---|---|---|
| 1 | EQ-PO-001 | PO not 10 digits | Edit otherrefnum → exactly 10 digits starting with 46 |
| 2 | LINE-004 | Missing Order Line Ref | Fill custcol_cgi_ehf_orderlinereference on ALL lines (format: 10/20 or 10#20) |
| 3 | CUS-001 | Missing Buyer EndpointID | Fill custbody_buyer_elec_add_ehf |
| 4 | BR-30 | Missing Seller VAT | Check subsidiary vatregnumber |
| 5 | TAX-001 | Missing exemption reason | Add vatex code for E/AE/G/O categories |
| 6 | DEL-005 | Invalid GLN | Must be exactly 13 digits in custbody_deliver_loc_identifier_ehf |
| 7 | NO-R-003 | Invalid Norwegian IBAN | Format: NO + 2 check + 11 digits (no spaces) |
| 8 | BR-55 | Credit note missing ref | Apply to original invoice OR set createdfrom |
| 9 | CURR-002 | Multi-currency tax mismatch | Fill custbody_tax_amount_vat_currency_ehf |
| 10 | ATT-004 | Attachment too large | Total 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-01 | Structure | CustomizationID is required | (Fixed value) | L |
| BR-02 | Structure | Invoice number is required | transaction.tranid | L |
| BR-03 | Structure | Issue date is required | transaction.trandate | L |
| BR-04 | Structure | Invoice type code is required | custbody_inv_type_name_ehf | L |
| BR-05 | Structure | Document currency code is required | transaction.currency | L |
| BR-08 | Structure | Seller postal address is required | subsidiary.address1 | L |
| BR-10 | Structure | Buyer postal address is required | customer.billaddr1 | L |
| BR-12 | Structure | Sum of line amounts required | transaction.subtotal | L |
| BR-13 | Structure | Invoice total without VAT required | transaction.subtotal | L |
| BR-14 | Structure | Invoice total with VAT required | transaction.total | L |
| BR-15 | Structure | Amount due for payment required | transaction.total | L |
| BR-16 | Structure | At least one invoice line required | transaction.item | L |
| BR-17 | Structure | ProfileID is required | (Fixed value) | L |
| BR-18 | Structure | BuyerReference or OrderReference required | custbody_cgi_ehf_contactemail | L |
| BR-19 | Structure | Tax currency code required if different | custbody_vat_currency_ehf | L |
| BR-20 | Structure | Accounting cost may be set at header | custbody_accounting_cost_ehf | R |
| BR-06 | Supplier | Seller name is required | subsidiary.legalname | L |
| BR-09 | Supplier | Seller country code is required | entity_nexus_country | L |
| BR-27 | Supplier | Seller identifier or legal reg required | subsidiary.federalidnumber | L |
| BR-28 | Supplier | Seller postal address city required | subsidiary.city | L |
| BR-29 | Supplier | Seller postal address post code | subsidiary.zip | R |
| BR-30 | Supplier | Seller VAT identifier required if tax | subsidiary.vatregnumber | L |
| BR-31 | Supplier | Seller tax registration if tax rep | subsidiary.vatregnumber | L |
| BR-32 | Supplier | Seller additional legal info | subsidiary.legalname | R |
| BR-33 | Supplier | Seller contact point | subsidiary.email | R |
| BR-34 | Supplier | Seller contact telephone | subsidiary.phone | R |
| BR-35 | Supplier | Seller contact email | subsidiary.email | R |
| PEPPOL-R020 | Supplier | Seller EndpointID is required | custrecord_seller_electronic_address_ehf | L |
| NO-R-001 | Supplier | Norwegian org number MOD11 check | custrecord_seller_electronic_address_ehf | L |
| NO-R-002 | Supplier | Norwegian VAT format NO{9}MVA | subsidiary.vatregnumber | L |
| BR-07 | Customer | Buyer name is required | customer.companyname | M |
| BR-11 | Customer | Buyer country code is required | custbody_cgi_inv_countrycode_ehf | M |
| BR-36 | Customer | Buyer identifier scheme required | custbody_buyer_elec_scheme_id_ehf | L |
| BR-37 | Customer | Buyer postal address city required | customer.billcity | L |
| BR-38 | Customer | Buyer postal address post code | customer.billzip | R |
| BR-39 | Customer | Buyer VAT identifier if charged | customer.vatregnumber | L |
| BR-40 | Customer | Buyer reference for routing | custbody_cgi_ehf_contactemail | M |
| BR-41 | Customer | Buyer contact point | customer.email | R |
| BR-42 | Customer | Buyer contact telephone | customer.phone | R |
| BR-43 | Customer | Buyer contact email | customer.email | R |
| BR-44 | Customer | Buyer additional legal info | customer.companyname | R |
| PEPPOL-R010 | Customer | Buyer EndpointID is required | custbody_buyer_elec_add_ehf | M |
| BR-63 | Customer | Buyer EndpointID scheme required | custbody_buyer_elec_scheme_id_ehf | L |
| EQ-PO-001 | Equinor | PO must be exactly 10 digits | transaction.otherrefnum | M |
| EQ-PO-002 | Equinor | PO should start with 46 | transaction.otherrefnum | R |
| EQ-LINE-001 | Equinor | Line amount cannot be zero | item.amount | M |
| EQ-LINE-002 | Equinor | Negative amounts not allowed | item.amount | M |
| EQ-LINE-003 | Equinor | OrderLineRef format POLine/SES | custcol_cgi_ehf_orderlinereference | M |
| EQ-CN-001 | Equinor | Credit note must reference invoice | apply[].refnum | M |
| EQ-DEL-001 | Equinor | Delivery GLN required | custbody_deliver_loc_identifier_ehf | M |
| EQ-DEL-002 | Equinor | GLN must be 13 digits | custbody_deliver_loc_identifier_ehf | M |
| EQ-SES-001 | Equinor | SES number required on lines | custcol_cgi_ehf_buyers_item_id | M |
| EQ-CON-001 | Equinor | Contract ref should start with 46 | custbody_contract_ref_ehf | R |
| BR-21 | Line | Line ID is required | item.line | L |
| BR-22 | Line | Invoiced quantity is required | item.quantity | L |
| BR-23 | Line | Unit code is required | item.units | L |
| BR-24 | Line | Line net amount is required | item.amount | L |
| BR-25 | Line | Line contains item name or description | item.description | L |
| BR-26 | Line | Item net price is required | item.amount/item.quantity | L |
| BR-64 | Line | Item standard identifier scheme | item.itemid | R |
| BR-65 | Line | Item classification identifier scheme | item.class | R |
| LINE-004 | Line | Order Line Reference required | custcol_cgi_ehf_orderlinereference | M |
| LINE-SES-01 | Line | SES number (Buyer's Item ID) | custcol_cgi_ehf_buyers_item_id | M |
| LINE-005 | Line | Service period dates for time-based | custcol_ehf_service_start_date | R |
| LINE-006 | Line | Line accounting cost | custcol_accounting_cost_ehf | R |
| LINE-007 | Line | Line note for additional info | custcol_ehf_line_note | R |
| BR-45 | Tax | VAT category taxable amount required | item.taxcode | L |
| BR-46 | Tax | VAT category tax amount required | item.tax1amt | L |
| BR-47 | Tax | VAT category code required | item.taxcode | L |
| BR-48 | Tax | VAT rate required for each category | item.taxrate1 | L |
| BR-53 | Tax | Total VAT amount required | transaction.taxtotal | L |
| BR-54 | Tax | Tax currency amount if different | custbody_tax_amount_vat_currency_ehf | L |
| BR-S-01 | Tax | Standard rate: taxable amount required | TaxableAmount | L |
| BR-S-02 | Tax | Standard rate: tax amount required | TaxAmount | L |
| BR-S-05 | Tax | Standard rate VAT must be > 0 | item.taxrate1 | L |
| BR-S-08 | Tax | Standard rate: valid rate value | item.taxrate1 | L |
| BR-S-09 | Tax | Standard rate: seller VAT required | subsidiary.vatregnumber | L |
| BR-S-10 | Tax | Standard rate: category S only | TaxCategory/ID = S | L |
| BR-Z-01 | Tax | Zero rate: taxable amount required | TaxableAmount | L |
| BR-Z-02 | Tax | Zero rate: tax amount must be 0 | TaxAmount = 0 | L |
| BR-Z-05 | Tax | Zero rate: rate must be 0% | Percent = 0 | L |
| BR-Z-08 | Tax | Zero rate: no reason required | - | R |
| BR-Z-09 | Tax | Zero rate: seller VAT required | subsidiary.vatregnumber | L |
| BR-Z-10 | Tax | Zero rate: category Z only | TaxCategory/ID = Z | L |
| BR-E-01 | Tax | Exempt: taxable amount required | TaxableAmount | L |
| BR-E-02 | Tax | Exempt: tax amount must be 0 | TaxAmount = 0 | L |
| BR-E-05 | Tax | Exempt: rate must be 0% | Percent = 0 | L |
| BR-E-08 | Tax | Exempt: exemption reason code required | TaxExemptionReasonCode | L |
| BR-E-09 | Tax | Exempt: seller VAT required | subsidiary.vatregnumber | L |
| BR-E-10 | Tax | Exempt requires exemption reason | TaxExemptionReason | L |
| BR-AE-01 | Tax | Reverse charge: taxable amount required | TaxableAmount | L |
| BR-AE-02 | Tax | Reverse charge: tax amount must be 0 | TaxAmount = 0 | L |
| BR-AE-05 | Tax | Reverse charge: rate must be 0% | Percent = 0 | L |
| BR-AE-08 | Tax | Reverse charge: reason code required | TaxExemptionReasonCode | L |
| BR-AE-09 | Tax | Reverse charge: seller VAT required | subsidiary.vatregnumber | L |
| BR-AE-10 | Tax | Reverse charge requires reason | TaxExemptionReason | L |
| BR-G-01 | Tax | Free export: taxable amount required | TaxableAmount | L |
| BR-G-02 | Tax | Free export: tax amount must be 0 | TaxAmount = 0 | L |
| BR-G-05 | Tax | Free export: rate must be 0% | Percent = 0 | L |
| BR-G-08 | Tax | Free export: no reason required | - | R |
| BR-G-09 | Tax | Free export: seller VAT required | subsidiary.vatregnumber | L |
| BR-G-10 | Tax | Free export: category G only | TaxCategory/ID = G | L |
| BR-O-01 | Tax | Not subject: taxable amount required | TaxableAmount | L |
| BR-O-02 | Tax | Not subject: tax amount must be 0 | TaxAmount = 0 | L |
| BR-O-05 | Tax | Not subject: rate must be 0% | Percent = 0 | L |
| BR-O-08 | Tax | Not subject: reason may be provided | TaxExemptionReason | R |
| BR-O-09 | Tax | Not subject: no seller VAT required | - | R |
| BR-O-10 | Tax | Not subject: category O only | TaxCategory/ID = O | L |
| BR-IC-01 | Tax | Intra-community: taxable amount required | TaxableAmount | L |
| BR-IC-02 | Tax | Intra-community: tax amount must be 0 | TaxAmount = 0 | L |
| BR-IC-05 | Tax | Intra-community: rate must be 0% | Percent = 0 | L |
| BR-IC-08 | Tax | Intra-community: reason code required | TaxExemptionReasonCode | L |
| BR-IC-09 | Tax | Intra-community: seller VAT required | subsidiary.vatregnumber | L |
| BR-IC-10 | Tax | Intra-community: buyer VAT required | customer.vatregnumber | L |
| BR-IC-11 | Tax | Intra-community: category K only | TaxCategory/ID = K | L |
| BR-IC-12 | Tax | Intra-community: reason text required | TaxExemptionReason | L |
| BR-CO-03 | Calculation | Value added tax point date | TaxPointDate | R |
| BR-CO-04 | Calculation | Actual delivery date | ActualDeliveryDate | R |
| BR-CO-09 | Calculation | Seller VAT identifier validation | subsidiary.vatregnumber | L |
| BR-CO-10 | Calculation | Sum of line net amounts | Sum(LineExtensionAmount) | L |
| BR-CO-11 | Calculation | Allowances at document level | AllowanceTotalAmount | L |
| BR-CO-12 | Calculation | Charges at document level | ChargeTotalAmount | L |
| BR-CO-13 | Calculation | Tax exclusive amount calculation | TaxExclusiveAmount | L |
| BR-CO-14 | Calculation | Invoice total VAT amount calculation | transaction.taxtotal | L |
| BR-CO-15 | Calculation | Tax inclusive amount calculation | TaxInclusiveAmount | L |
| BR-CO-16 | Calculation | Amount due for payment calculation | PayableAmount | L |
| BR-CO-17 | Calculation | VAT category tax amount calculation | TaxSubtotal/TaxAmount | L |
| BR-CO-18 | Calculation | VAT category taxable amount calc | TaxSubtotal/TaxableAmount | L |
| BR-CO-19 | Calculation | Line net amount calculation | Qty × Price / BaseQty | L |
| BR-CO-20 | Calculation | Item net price calculation | PriceAmount | L |
| BR-49 | Payment | Payment means code required | (Fixed: 30) | L |
| BR-50 | Payment | Payment account identifier required | custrecord_combankdet_iban | L |
| BR-51 | Payment | Payment card holder name | CardHolderName | R |
| BR-52 | Payment | Attached document description | custbody_supp_doc_description_ehf | M |
| BR-61 | Payment | Payment due date if terms given | transaction.duedate | R |
| BR-62 | Payment | Seller BIC required for IBAN | custrecord_bank_branch_code | R |
| PAY-002 | Payment | IBAN format validation (no spaces) | custrecord_combankdet_iban | L |
| NO-R-003 | Payment | Norwegian IBAN format: NO + 13 digits | custrecord_combankdet_iban | L |
| BR-DEC-01 | Format | Amount max 2 decimals | All amounts | L |
| BR-DEC-02 | Format | Quantity max 6 decimals | item.quantity | L |
| BR-DEC-03 | Format | Unit price max 6 decimals | item.amount/item.quantity | L |
| BR-DEC-04 | Format | VAT rate max 2 decimals | item.taxrate1 | L |
| BR-DEC-05 | Format | Percentage max 2 decimals | Percent values | L |
| BR-CL-01 | Format | Currency code ISO 4217 | transaction.currency | L |
| BR-CL-02 | Format | Invoice type code UNTDID 1001 | custbody_inv_type_name_ehf | L |
| BR-CL-03 | Format | Credit note type code UNTDID 1001 | custbody_inv_type_name_ehf | L |
| BR-CL-04 | Format | Country code ISO 3166-1 | Country codes | L |
| BR-CL-05 | Format | Allowance reason code UNTDID 5189 | AllowanceChargeReasonCode | L |
| BR-CL-06 | Format | Charge reason code UNTDID 7161 | AllowanceChargeReasonCode | L |
| BR-CL-07 | Format | Tax category code UNTDID 5305 | TaxCategory/ID | L |
| BR-CL-10 | Format | Scheme identifier for identifiers | @schemeID values | L |
| BR-CL-14 | Format | Invoice period description code | DescriptionCode | R |
| BR-CL-17 | Format | Payment means code UNTDID 4461 | PaymentMeansCode | L |
| BR-CL-20 | Format | Tax category code UNCL 5305 | item.taxcode | L |
| BR-CL-21 | Format | Tax exemption reason code | TaxExemptionReasonCode | L |
| BR-CL-23 | Format | Unit code UN/ECE Rec 20 | item.units | L |
| BR-CL-24 | Format | Identifier scheme ICD code | @schemeID (ICD) | L |
| BR-CL-25 | Format | EndpointID scheme EAS code | Scheme IDs | L |
| BR-CL-26 | Format | MIME code for attachment | EmbeddedDocument/@mimeCode | L |
| PEPPOL-EN16931-R001 | PEPPOL | CustomizationID format | (Fixed value) | L |
| PEPPOL-EN16931-R002 | PEPPOL | ProfileID format | (Fixed value) | L |
| PEPPOL-EN16931-R003 | PEPPOL | BuyerReference or OrderReference | custbody_cgi_ehf_contactemail | L |
| PEPPOL-EN16931-R004 | PEPPOL | Specification identifier | (Fixed value) | L |
| PEPPOL-EN16931-R006 | PEPPOL | Seller electronic address required | custrecord_seller_electronic_address_ehf | L |
| PEPPOL-EN16931-R007 | PEPPOL | Buyer electronic address required | custbody_buyer_elec_add_ehf | L |
| PEPPOL-EN16931-R008 | PEPPOL | Document level allowance/charge indicator | ChargeIndicator | L |
| PEPPOL-EN16931-R040 | PEPPOL | Allowance/charge base amount | BaseAmount | L |
| PEPPOL-EN16931-R053 | PEPPOL | Base quantity must be > 0 | BaseQuantity | L |
| PEPPOL-EN16931-R054 | PEPPOL | Base quantity unit code must match | BaseQuantity/@unitCode | L |
| PEPPOL-EN16931-R080 | PEPPOL | Unit code for base quantity | BaseQuantity/@unitCode | L |
| PEPPOL-EN16931-R100 | PEPPOL | All currencyID must match DocumentCurrencyCode | All @currencyID | L |
| PEPPOL-EN16931-R101 | PEPPOL | Element order in TaxTotal | TaxTotal ordering | L |
| PEPPOL-EN16931-R110 | PEPPOL | Start date <= end date | InvoicePeriod dates | L |
| PEPPOL-EN16931-R120 | PEPPOL | PaymentMeansCode values | PaymentMeansCode | L |
| PEPPOL-EN16931-R121 | PEPPOL | Mandate reference for direct debit | PaymentMandate | L |
| PEPPOL-EN16931-R130 | PEPPOL | Unit code shall exist | @unitCode | L |
| PEPPOL-EN16931-R131 | PEPPOL | Base quantity must be positive | BaseQuantity > 0 | L |
| ATT-001 | Attachment | Attachment size limit (25MB total) | custbody_attached_doc_binary_code_cgi | R |
| ATT-002 | Attachment | Attachment must be base64 encoded | EmbeddedDocumentBinaryObject | L |
| ATT-003 | Attachment | Maximum 3 attachments | Attachment fields | R |
| ATT-004 | Attachment | Valid MIME type required | @mimeCode | L |
| ATT-005 | Attachment | Filename required | @filename | L |
| NO-R-004 | Norway | Norwegian date format | All date fields | L |
| NO-R-005 | Norway | Tax point date for Norwegian invoices | TaxPointDate | R |
| NO-R-006 | Norway | Norwegian postal code format (4 digits) | PostalZone | R |
| NO-R-007 | Norway | Norwegian phone format | Telephone | R |
| NO-R-008 | Norway | Norwegian invoice type codes | InvoiceTypeCode | L |
| NO-R-009 | Norway | EndpointID 0192 for Norwegian org | EndpointID/@schemeID | L |
| NO-R-010 | Norway | Company ID scheme 0192 | CompanyID/@schemeID | L |
| UK-R-001 | UK | UK VAT format GB + 9 or 12 digits | CompanyID | L |
| UK-R-002 | UK | UK EndpointID scheme 9932/9933 | EndpointID/@schemeID | L |
| UK-R-003 | UK | UK Company ID scheme 0199 for LEI | CompanyID/@schemeID | L |
| UK-R-004 | UK | UK postal code format | PostalZone | R |
| UK-R-005 | UK | UK date format YYYY-MM-DD | All date fields | L |
| CN-001 | Credit Note | Credit note type code 381 | CreditNoteTypeCode | L |
| CN-002 | Credit Note | Billing reference required | BillingReference | L |
| CN-003 | Credit Note | Invoice document reference | InvoiceDocumentReference/ID | L |
| CN-004 | Credit Note | Credit note root element | CreditNote | L |
| CN-005 | Credit Note | Credited quantity element name | CreditedQuantity | L |
| DEL-001 | Delivery | Delivery location ID scheme | DeliveryLocation/ID/@schemeID | L |
| DEL-002 | Delivery | Actual delivery date format | ActualDeliveryDate | R |
| DEL-003 | Delivery | Delivery party name | DeliveryParty/PartyName | R |
| DEL-004 | Delivery | Delivery address required if location | DeliveryLocation/Address | L |
| DEL-005 | Delivery | GLN format 13 digits | DeliveryLocation/ID | L |
| DEL-006 | Delivery | Delivery period dates | DeliveryPeriod | R |
| ORD-001 | Order | Order reference ID required | OrderReference/ID | M |
| ORD-002 | Order | Sales order reference | OrderReference/SalesOrderID | R |
| ORD-003 | Order | Order line reference format | OrderLineReference/LineID | M |
| CON-001 | Contract | Contract document reference ID | ContractDocumentReference/ID | R |
| CON-002 | Contract | Contract document type code | ContractDocumentReference/DocumentTypeCode | R |
| AC-001 | Allowance | Charge indicator required | AllowanceCharge/ChargeIndicator | L |
| AC-002 | Allowance | Allowance/charge amount required | AllowanceCharge/Amount | L |
| AC-003 | Allowance | Allowance/charge reason | AllowanceCharge/AllowanceChargeReason | R |
| AC-004 | Allowance | Allowance/charge reason code | AllowanceCharge/AllowanceChargeReasonCode | L |
| AC-005 | Allowance | Tax category for allowance/charge | AllowanceCharge/TaxCategory | L |
| AC-006 | Allowance | Percentage if base amount given | AllowanceCharge/MultiplierFactorNumeric | L |
| ENT-001 | Entity | Party legal entity name | PartyLegalEntity/RegistrationName | L |
| ENT-002 | Entity | Party legal entity ID | PartyLegalEntity/CompanyID | L |
| ENT-003 | Entity | Party identification scheme | PartyIdentification/ID/@schemeID | L |
| ENT-004 | Entity | Tax representative party | TaxRepresentativeParty | R |
| ENT-005 | Entity | Payee party if different | PayeeParty | R |
| PEPPOL-EN16931-R041 | PEPPOL | Allowance percentage calculation | MultiplierFactorNumeric | L |
| PEPPOL-EN16931-R042 | PEPPOL | Charge percentage calculation | MultiplierFactorNumeric | L |
| PEPPOL-EN16931-R043 | PEPPOL | Line allowance percentage | Line/AllowanceCharge | L |
| PEPPOL-EN16931-R044 | PEPPOL | Line charge percentage | Line/AllowanceCharge | L |
| PEPPOL-EN16931-R046 | PEPPOL | Item classification identifier | CommodityClassification | R |
| PEPPOL-EN16931-R051 | PEPPOL | Tax subtotal required per category | TaxSubtotal | L |
| PEPPOL-EN16931-R052 | PEPPOL | Only one tax subtotal per category | TaxSubtotal uniqueness | L |
| PEPPOL-EN16931-R055 | PEPPOL | Price base quantity unit code | BaseQuantity/@unitCode | L |
| PEPPOL-EN16931-R061 | PEPPOL | Payment due date required | DueDate | R |
| PEPPOL-EN16931-R062 | PEPPOL | Seller BIC for credit transfer | FinancialInstitutionBranch/ID | R |
| SE-R-001 | Sweden | Swedish org number format | EndpointID | L |
| SE-R-002 | Sweden | Swedish VAT format SE + 12 digits | CompanyID | L |
| SE-R-003 | Sweden | Swedish EndpointID scheme 0007 | EndpointID/@schemeID | L |
| SE-R-004 | Sweden | Swedish postal code format | PostalZone | R |
| DK-R-001 | Denmark | Danish CVR number format | EndpointID | L |
| DK-R-002 | Denmark | Danish VAT format DK + 8 digits | CompanyID | L |
| DK-R-003 | Denmark | Danish EndpointID scheme 0184 | EndpointID/@schemeID | L |
| DK-R-004 | Denmark | Danish postal code format | PostalZone | R |
| FI-R-001 | Finland | Finnish business ID format | EndpointID | L |
| FI-R-002 | Finland | Finnish VAT format FI + 8 digits | CompanyID | L |
| FI-R-003 | Finland | Finnish EndpointID scheme 0213 | EndpointID/@schemeID | L |
| FI-R-004 | Finland | Finnish postal code format | PostalZone | R |
| NL-R-001 | Netherlands | Dutch KVK number format | EndpointID | L |
| NL-R-002 | Netherlands | Dutch VAT format NL + 12 chars | CompanyID | L |
| NL-R-003 | Netherlands | Dutch EndpointID scheme 0190 | EndpointID/@schemeID | L |
| NL-R-004 | Netherlands | Dutch postal code format | PostalZone | R |
| DE-R-001 | Germany | German Leitweg-ID format | EndpointID | L |
| DE-R-002 | Germany | German VAT format DE + 9 digits | CompanyID | L |
| DE-R-003 | Germany | German EndpointID scheme 0204 | EndpointID/@schemeID | L |
| DE-R-004 | Germany | German postal code format (5 digits) | PostalZone | R |
| BIS-001 | BIS | BIS 3.0 profile identifier | ProfileID | L |
| BIS-002 | BIS | BIS customization identifier | CustomizationID | L |
| BIS-003 | BIS | UBL version identifier | UBLVersionID | L |
| BIS-004 | BIS | Invoice/Credit Note namespace | xmlns | L |
| PER-001 | Period | Invoice period start date | InvoicePeriod/StartDate | R |
| PER-002 | Period | Invoice period end date | InvoicePeriod/EndDate | R |
| PER-003 | Period | Start date before end date | StartDate <= EndDate | L |
| PER-004 | Period | Line period start date | InvoiceLine/InvoicePeriod/StartDate | R |
| PER-005 | Period | Line period end date | InvoiceLine/InvoicePeriod/EndDate | R |
| ITEM-001 | Item | Item name required | Item/Name | L |
| ITEM-002 | Item | Item description | Item/Description | R |
| ITEM-003 | Item | Sellers item identification | SellersItemIdentification/ID | R |
| ITEM-004 | Item | Standard item identification | StandardItemIdentification/ID | R |
| ITEM-005 | Item | Item classification code | CommodityClassification/ItemClassificationCode | R |
| ITEM-006 | Item | Origin country code | OriginCountry/IdentificationCode | R |
| ITEM-007 | Item | Item attributes | AdditionalItemProperty | R |
| PRICE-001 | Price | Price amount required | Price/PriceAmount | L |
| PRICE-002 | Price | Base quantity = 1 | Price/BaseQuantity = 1 | L |
| PRICE-003 | Price | Price base quantity > 0 | BaseQuantity > 0 | L |
| PRICE-004 | Price | Allowance on price | Price/AllowanceCharge | R |
| PRICE-005 | Price | Price currency must match document | PriceAmount/@currencyID | L |
| CONTACT-001 | Contact | Seller contact name | Contact/Name | R |
| CONTACT-002 | Contact | Seller contact telephone | Contact/Telephone | R |
| CONTACT-003 | Contact | Seller contact email | Contact/ElectronicMail | R |
| CONTACT-004 | Contact | Buyer contact name | BuyerContact/Name | R |
| CONTACT-005 | Contact | Buyer contact telephone | BuyerContact/Telephone | R |
| CONTACT-006 | Contact | Buyer contact email | BuyerContact/ElectronicMail | R |
| REF-001 | Reference | Project reference | ProjectReference/ID | R |
| REF-002 | Reference | Despatch document reference | DespatchDocumentReference/ID | R |
| REF-003 | Reference | Receipt document reference | ReceiptDocumentReference/ID | R |
| REF-004 | Reference | Originator document reference | OriginatorDocumentReference/ID | R |
| REF-005 | Reference | Additional document reference | AdditionalDocumentReference | R |
| REF-006 | Reference | Statement reference | StatementDocumentReference/ID | R |
| XSD-001 | Schema | Valid XML structure | XML well-formed | L |
| XSD-002 | Schema | UBL 2.1 schema validation | UBL-Invoice-2.1.xsd | L |
| XSD-003 | Schema | Element ordering per schema | Element sequence | L |
| XSD-004 | Schema | Required elements present | minOccurs validation | L |
| XSD-005 | Schema | Data type validation | xs:date, xs:decimal | L |
| XSD-006 | Schema | Namespace declarations | xmlns:cbc, xmlns:cac | L |
| XSD-007 | Schema | Empty elements not allowed | No empty required fields | L |
| SCHEMATRON-001 | Schematron | Business rule validation | PEPPOL-EN16931-UBL.sch | L |
| SCHEMATRON-002 | Schematron | Code list validation | Code list Schematron | L |
❌ Error Database
Complete error code reference with solutions
| Error Code | Message | Solution |
|---|---|---|
| EQ-PO-001 | PO must be exactly 10 digits | Enter 10 digits in otherrefnum (e.g., 4600012345) |
| EQ-PO-002 | PO should start with 46 | Equinor POs typically start with 46 prefix |
| EQ-LINE-001 | Line amount cannot be zero | Remove zero-amount lines or set non-zero values |
| EQ-CN-001 | Credit note needs invoice ref | Apply credit to original invoice in Apply sublist |
| EQ-SES-001 | SES number required | Fill custcol_cgi_ehf_buyers_item_id on lines |
| LINE-004 | Order Line Reference required | Fill custcol_cgi_ehf_orderlinereference on ALL lines |
| LINE-001 | Line ID missing | Ensure item.line is populated (auto-generated) |
| LINE-002 | Quantity missing or invalid | Set item.quantity to non-zero value |
| LINE-003 | Unit code invalid | Map units to UN/ECE codes (HUR, DAY, EA) |
| LINE-005 | Item name missing | Ensure item has description/name |
| LINE-006 | Price amount missing | Ensure item.amount and item.quantity are non-zero |
| PEPPOL-R010 | Buyer EndpointID missing | Set custbody_buyer_elec_add_ehf on transaction |
| PEPPOL-R020 | Seller EndpointID missing | Set custrecord_seller_electronic_address_ehf on subsidiary |
| PEPPOL-R001 | CustomizationID invalid | Template error - contact developer |
| PEPPOL-R002 | ProfileID invalid | Template error - contact developer |
| PEPPOL-R003 | Business process invalid | Check ProfileID matches document type |
| PAY-001 | Payment means code missing | Template uses fixed value 30 (credit transfer) |
| PAY-002 | Invalid IBAN format | Remove spaces from IBAN. NO format: NO9386011117947 |
| PAY-003 | BIC/SWIFT invalid | Check custrecord_bank_branch_code format (8-11 chars) |
| PAY-004 | Bank account missing | Link custbody_rm_bankpaymentaccount to transaction |
| PAY-005 | Payment ID/KID format | Check custbody_remittance_info_ehf if used |
| BR-01 | CustomizationID required | Template error - check FreeMarker |
| BR-02 | Invoice ID required | Ensure transaction.tranid is populated |
| BR-03 | Issue date required | Set transaction.trandate |
| BR-04 | Invoice type code required | Set custbody_inv_type_name_ehf (380/381) |
| BR-05 | Currency code required | Ensure transaction.currency is set |
| BR-16 | At least one line required | Add items to invoice |
| BR-06 | Seller name required | Set subsidiary.legalname |
| BR-07 | Buyer name required | Ensure customer.companyname is set |
| BR-09 | Seller country required | Set country on subsidiary address |
| BR-11 | Buyer country required | Set custbody_cgi_inv_countrycode_ehf |
| BR-CO-10 | Sum of line amounts ≠ total | Check line amounts sum equals subtotal |
| BR-CO-13 | Tax exclusive calculation error | TaxExclusiveAmount = LineExtension - allowances + charges |
| BR-CO-14 | Tax amount calculation error | Verify tax amounts match rate × taxable |
| BR-CO-15 | Tax inclusive calculation error | TaxInclusiveAmount = TaxExclusiveAmount + TaxAmount |
| BR-CO-16 | Payable amount calculation error | PayableAmount = TaxInclusiveAmount - PrepaidAmount |
| BR-S-05 | Standard rate must be > 0 | Tax category S requires rate > 0% |
| BR-S-06 | Standard rate VAT amount error | TaxAmount = TaxableAmount × Percent / 100 |
| BR-Z-05 | Zero rate must be 0 | Tax category Z requires rate = 0% |
| BR-E-05 | Exempt rate must be 0 | Tax category E requires rate = 0% |
| BR-E-10 | Exempt needs reason | Add TaxExemptionReason for category E |
| BR-AE-05 | Reverse charge rate must be 0 | Tax category AE requires rate = 0% |
| BR-AE-10 | Reverse charge needs reason | Add TaxExemptionReasonCode vatex-eu-ae |
| BR-G-05 | Export rate must be 0 | Tax category G requires rate = 0% |
| BR-G-10 | Export needs reason | Add TaxExemptionReasonCode vatex-eu-143 |
| NO-R-001 | Norwegian org# MOD11 check failed | Verify 9-digit org number with correct check digit |
| NO-R-002 | Norwegian VAT format invalid | Format: NO{9digits}MVA (e.g., NO923609016MVA) |
| NO-R-003 | Norwegian IBAN format invalid | Format: NO{13digits} (e.g., NO9386011117947) |
| ATT-001 | Attachment too large | Each attachment should be under 10MB |
| ATT-002 | Total attachments too large | Total size should be under 25MB |
| ATT-003 | Too many attachments | Maximum 3 attachments allowed |
| BR-52 | Attachment needs description | Fill custbody_supp_doc_description_ehf for each |
| ATT-005 | Invalid MIME type | Supported: PDF, PNG, JPEG, CSV, XLSX |
| DEL-001 | Delivery location ID missing scheme | Set custbody_deliver_loc_scheme_id_ehf (0088 for GLN) |
| DEL-005 | GLN must be 13 digits | Check custbody_deliver_loc_identifier_ehf format |
| DATE-001 | Due date before issue date | Due date should be after or equal to issue date |
| DATE-002 | Invoice date in future | Issue date should not be in the future |
| DATE-003 | Invalid date format | Dates must be YYYY-MM-DD format |
| BR-DEC-01 | Amount exceeds 2 decimals | Round monetary amounts to 2 decimal places |
| BR-DEC-02 | Quantity exceeds 6 decimals | Round quantities to max 6 decimal places |
| BR-CL-01 | Invalid currency code | Use ISO 4217 3-letter codes (NOK, EUR, USD) |
| BR-CL-04 | Invalid country code | Use ISO 3166-1 2-letter codes (NO, GB, SE) |
| BR-CL-20 | Invalid tax category code | Use UNCL 5305 codes (S, Z, E, AE, G, K, O) |
| BR-CL-23 | Invalid unit code | Use UN/ECE Rec 20 codes (HUR, DAY, EA, MON) |
🔣 Regex Validation Patterns
Regular expressions for validating PEPPOL data
🇳🇴 Norwegian Patterns
| Field | Pattern | Example | Copy |
|---|---|---|---|
| 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
| Field | Pattern | Example | Copy |
|---|---|---|---|
| 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>
🔗 Official Links & Resources
External documentation and validators
📚 PEPPOL Documentation
🏢 Access Points
| Provider | SFTP Host | Usage |
|---|---|---|
| CGI | btxdmz.eintegration.net | Your Access Point |
| Basware | - | Equinor's AP |
| Pagero | - | Common customer AP |
📜 Version History
Template and documentation changelog
📄 Documentation Versions
| Version | Date | Changes |
|---|---|---|
| v9.0 | Feb 2026 | Version-aware login fix, Change Password feature, mobile hamburger menu, Access Point naming update (Nordic Hub), dead script removal, version consistency fixes |
| v8.0 | Feb 2026 | Role-based access (admin/controller/user), auth system, bookmarks, export to PDF/DOCX, admin panel, session management, interactive field mapping flow |
| v7.0 | Jan 2026 | Full encyclopedia: Search, dark mode, wizard, regex, copy buttons, 290+ rules |
| v6.0 | Jan 2026 | Added XML trees, country rules, all field mappings |
| v5.0 | Jan 2026 | Quick reference, flowcharts, interactive checklists |
| v4.0 | Jan 2026 | Initial comprehensive HTML guide |
📝 Invoice Template Versions
| Version | Changes |
|---|---|
| v3.2 | Multi-currency dual TaxTotal support |
| v3.1 | Three-attachment support with BASE64 injection |
| v3.0 | Fail-fast validation, helper functions refactor |
| v2.9 | UK support with LEI/VAT scheme detection |
📏 Unit Code Mappings
NetSuite units mapped to UN/ECE Recommendation 20
⏱️ Time-Based
| NetSuite | Code |
|---|---|
| Hour/hr/hours | HUR |
| Day/days/d | DAY |
| Week/wk | WEE |
| Month/mon/periode | MON |
| Quarter | QAN |
| Year/annual | ANN |
📦 Quantity & Other
| NetSuite | Code |
|---|---|
| Each/ea/FTE | EA |
| Meter | MTR |
| Kilometer | KMT |
| Kilogram | KGM |
| Liter | LTR |
| Cubic meter | MTQ |
💰 Tax Categories
PEPPOL VAT category codes
| Code | Name | Rate | Exemption Code |
|---|---|---|---|
| S | Standard | > 0% | - |
| Z | Zero | 0% | - |
| E | Exempt | 0% | vatex-eu-132 |
| AE | Reverse Charge | 0% | vatex-eu-ae |
| G | Export | 0% | vatex-eu-143 |
| K | Intra-Community | 0% | vatex-eu-ic |
| O | Outside Scope | 0% | vatex-eu-o |
🔢 EAS & ICD Scheme Codes
Electronic addressing and identification schemes
📍 EAS Codes (Routing)
| Code | Country/Type |
|---|---|
0192 | 🇳🇴 Norway Org# |
9932 | 🇬🇧 UK VAT |
0088 | GLN |
0199 | LEI |
0184 | 🇩🇰 Denmark CVR |
0007 | 🇸🇪 Sweden Org# |
🏢 ICD Codes (Legal ID)
| Code | Type |
|---|---|
0192 | NO Org Number |
0199 | LEI |
0088 | GLN |
📝 Invoice Workflow - Step by Step
Complete walkthrough for creating and sending a PEPPOL invoice
📋 Step-by-Step Process
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
| Step | Action | Field | Notes |
|---|---|---|---|
| 1 | Create Invoice | Transactions → Sales → Create Invoice | - |
| 2 | Select Customer | Customer field | Must have E-Doc Package = EHF Peppol |
| 3 | Enter PO Number | otherrefnum | Exactly 10 digits for Equinor (e.g., 4600012345) |
| 4 | Add Line Items | Item sublist | Fill Order Line Ref on EACH line |
| 5 | Link Bank Account | custbody_rm_bankpaymentaccount | IBAN must have NO SPACES |
| 6 | Save Invoice | Save button | XML auto-generated by template |
| 7 | Run Validator | Validate PEPPOL button | Fix any red/orange errors |
| 8 | Send Invoice | Set status to Ready | Scheduled script uploads to Nordic Hub |
📝 Credit Note Workflow
How to create and send PEPPOL credit notes
📋 Key Differences from Invoice
| Element | Invoice | Credit Note |
|---|---|---|
| Root Element | <Invoice> | <CreditNote> |
| Type Code | 380 | 381 |
| Type Element | <cbc:InvoiceTypeCode> | <cbc:CreditNoteTypeCode> |
| Line Element | <cac:InvoiceLine> | <cac:CreditNoteLine> |
| Quantity Element | <cbc:InvoicedQuantity> | <cbc:CreditedQuantity> |
| BillingReference | Optional | REQUIRED |
| Memo/Note | Optional | REQUIRED (reason) |
📝 Steps to Create Credit Note
| Step | Action | Notes |
|---|---|---|
| 1 | Create Credit Memo | Transactions → Customers → Issue Credit Memo |
| 2 | Apply to Original Invoice | In Apply sublist, check the original invoice |
| 3 | Enter Credit Reason | Fill Memo field (required for Equinor!) |
| 4 | Save and Validate | Run PEPPOL validator |
💱 Multi-Currency Invoices
Handling invoices where transaction currency differs from accounting currency
🔄 When Does Multi-Currency Apply?
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
| Field | Purpose | Example |
|---|---|---|
transaction.currency | DocumentCurrencyCode | USD |
subsidiary.currency | TaxCurrencyCode | NOK |
transaction.exchangerate | Conversion rate | 10.5 |
custbody_tax_amount_vat_currency_ehf | Tax in accounting currency | 15750.00 |
📎 Attachments Guide
How to add PDF attachments to PEPPOL invoices
📋 Attachment Fields (Up to 3)
| # | File Field | Description Field |
|---|---|---|
| 1 | custbody_cgi_ehf_attachment | custbody_supp_doc_description_ehf |
| 2 | custbody_acs_ehf_file_attachment | custbody_supp_doc_description_ehf_2 |
| 3 | custbody_acs_ehf_file_attachment3 | custbody_supp_doc_description_ehf_3 |
📏 Limits & Requirements
| Requirement | Limit |
|---|---|
| Maximum attachments | 3 files |
| Total size | 25 MB |
| Description | REQUIRED for each attachment |
| Supported formats | PDF, PNG, JPEG, CSV, XLSX |
📂 MIME Types
| Extension | MIME Type |
|---|---|
application/pdf | |
| .png | image/png |
| .jpg/.jpeg | image/jpeg |
| .csv | text/csv |
| .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
🧮 PEPPOL Calculation Formulas
How amounts must be calculated for PEPPOL compliance
📐 Line Level Calculations
| Element | Formula | Rule |
|---|---|---|
| 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="1"
📊 Document Level Calculations
| Element | Formula | NetSuite 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
| Element | Formula | Rule |
|---|---|---|
| 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:
🏢 Equinor Requirements Summary
Complete checklist for Equinor invoice compliance
✅ Mandatory Equinor Fields
| Field | NetSuite Location | Format/Rule | Example |
|---|---|---|---|
| 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
| Item | Value |
|---|---|
| Organization Number | 923609016 |
| Endpoint Scheme | 0192 |
| Access Point | Basware |
| VAT Number | NO923609016MVA |
📋 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
| Item | Qty | Rate | Amount | OrderLineRef |
|---|---|---|---|---|
| Consulting Services | 10 HUR | 1,500.00 | 15,000.00 | 10/20 |
| Equipment Rental | 5 DAY | 2,000.00 | 10,000.00 | 10/30 |
🔄 Field Transformation Flow
Click invoice sections above OR fields below to explore mappings
📥 NetSuite Field
📤 UBL XML Element
| Category | NetSuite Field | UBL Element | Notes |
|---|---|---|---|
| Header | transaction.tranid | //cbc:ID | Invoice number |
| Header | transaction.trandate | //cbc:IssueDate | YYYY-MM-DD |
| Header | transaction.duedate | //cbc:DueDate | Payment due |
| Header | custbody_inv_type_name_ehf | //cbc:InvoiceTypeCode | 380/381/384 |
| Header | transaction.currency | //cbc:DocumentCurrencyCode | ISO 4217 |
| Header | transaction.otherrefnum | //cac:OrderReference/cbc:ID | PO Number (10 digits!) |
| Header | custbody_contract_ref_ehf | //cac:ContractDocumentReference/cbc:ID | Contract ref |
| Header | custbody_cgi_ehf_contactemail | //cbc:BuyerReference | Buyer email |
| Header | transaction.memo | //cbc:Note | Invoice memo |
| Supplier | custrecord_seller_electronic_address_ehf | //cac:AccountingSupplierParty//cbc:EndpointID | Your org# |
| Supplier | custrecord_elr_add_id_scheme_id_ehf | //cbc:EndpointID/@schemeID | 0192 for NO |
| Supplier | subsidiary.legalname | //cbc:RegistrationName | Legal name |
| Supplier | subsidiary.vatregnumber | //cac:PartyTaxScheme/cbc:CompanyID | NO{9}MVA |
| Supplier | subsidiary.address1 | //cbc:StreetName | Street address |
| Supplier | subsidiary.city | //cbc:CityName | City |
| Supplier | subsidiary.zip | //cbc:PostalZone | Postal code |
| Customer | custbody_buyer_elec_add_ehf | //cac:AccountingCustomerParty//cbc:EndpointID | Customer org# |
| Customer | custbody_buyer_elec_scheme_id_ehf | //cbc:EndpointID/@schemeID | EAS code |
| Customer | custbody_buyer_identifier_ehf | //cac:PartyIdentification/cbc:ID | Legal ID |
| Customer | custbody_buyer_id_scheme_ehf | //cbc:ID/@schemeID | ICD code |
| Customer | customer.companyname | //cbc:RegistrationName | Customer name |
| Delivery | custbody_deliver_loc_identifier_ehf | //cac:DeliveryLocation/cbc:ID | GLN (13 digits) |
| Delivery | custbody_deliver_loc_scheme_id_ehf | //cbc:ID/@schemeID | 0088 for GLN |
| Payment | custbody_rm_bankpaymentaccount | //cac:PayeeFinancialAccount | Bank account link |
| Payment | custrecord_combankdet_iban | //cac:PayeeFinancialAccount/cbc:ID | IBAN (no spaces!) |
| Payment | custrecord_bank_branch_code | //cac:FinancialInstitutionBranch/cbc:ID | BIC/SWIFT |
| Tax | transaction.taxtotal | //cac:TaxTotal/cbc:TaxAmount | Total tax |
| Tax | custbody_tax_amount_vat_currency_ehf | //cac:TaxTotal[2]/cbc:TaxAmount | Multi-currency tax |
| Line | item.line | //cac:InvoiceLine/cbc:ID | Line number |
| Line | item.quantity | //cbc:InvoicedQuantity | Quantity |
| Line | item.units | //cbc:InvoicedQuantity/@unitCode | HUR/DAY/EA |
| Line | item.amount | //cbc:LineExtensionAmount | Cannot be 0! |
| Line | item.amount / item.quantity | //cac:Price/cbc:PriceAmount | Calculated unit price |
| Line | custcol_cgi_ehf_orderlinereference | //cac:OrderLineReference/cbc:LineID | PO line ref |
| Line | custcol_cgi_ehf_buyers_item_id | //cac:BuyersItemIdentification/cbc:ID | SES number |
| Attachment | custbody_cgi_ehf_attachment | //cac:AdditionalDocumentReference | File 1 |
| Attachment | custbody_supp_doc_description_ehf | //cbc:DocumentDescription | Required! |
📝 Transaction Body Fields
All custom fields on invoice/credit note transactions
| Field ID | Label | UBL Element | Required |
|---|---|---|---|
custbody_buyer_elec_add_ehf | Buyer Electronic Address | //cbc:EndpointID (buyer) | Yes |
custbody_buyer_elec_scheme_id_ehf | Buyer Scheme ID | //cbc:EndpointID/@schemeID | Yes |
custbody_buyer_identifier_ehf | Buyer Identifier | //cac:PartyIdentification/cbc:ID | No |
custbody_buyer_id_scheme_ehf | Buyer ICD Scheme | //cbc:ID/@schemeID | No |
custbody_cgi_ehf_contactemail | Buyer Reference Email | //cbc:BuyerReference | Recommended |
custbody_inv_type_name_ehf | Invoice Type Code | //cbc:InvoiceTypeCode | Yes |
custbody_contract_ref_ehf | Contract Reference | //cac:ContractDocumentReference/cbc:ID | No |
custbody_rm_bankpaymentaccount | Bank Payment Account | //cac:PayeeFinancialAccount | Yes |
custbody_deliver_loc_identifier_ehf | Delivery GLN | //cac:DeliveryLocation/cbc:ID | No |
custbody_deliver_loc_scheme_id_ehf | Delivery Scheme | //cbc:ID/@schemeID | No |
custbody_tax_amount_vat_currency_ehf | Tax in VAT Currency | //cac:TaxTotal[2]/cbc:TaxAmount | Multi-curr only |
custbody_ehf_period_start_date | Invoice Period Start | //cac:InvoicePeriod/cbc:StartDate | No |
custbody_ehf_period_end_date | Invoice Period End | //cac:InvoicePeriod/cbc:EndDate | No |
custbody_remittance_info_ehf | Payment ID / KID | //cbc:PaymentID | No |
👥 Customer Entity Fields
Fields configured on customer records for PEPPOL - these provide defaults for transactions
| Field ID | Label | Purpose | Example |
|---|---|---|---|
custentity_buyer_elec_add_ehf | Buyer Electronic Address | Default EndpointID | 923609016 |
custentity_buyer_elec_scheme_id_ehf | Buyer Scheme ID | EAS code | 0192 |
custentity_buyer_identifier_ehf | Buyer Identifier | Legal identifier | 923609016 |
custentity_buyer_id_scheme_ehf | Buyer ICD Scheme | ICD code | 0192 |
custentity_deliver_loc_identifier_ehf | Delivery GLN | Default delivery location | 7080001321284 |
custentity_deliver_loc_scheme_ehf | Delivery Scheme | GLN scheme | 0088 |
📝 Line Item Fields
Custom column fields on invoice/credit note lines
| Field ID | Label | UBL Element | Required |
|---|---|---|---|
custcol_cgi_ehf_orderlinereference | Order Line Reference | //cac:OrderLineReference/cbc:LineID | Yes (Equinor) |
custcol_cgi_ehf_buyers_item_id | Buyer's Item ID (SES) | //cac:BuyersItemIdentification/cbc:ID | Yes (Equinor) |
custcol_ehf_service_start_date | Service Start Date | //cac:InvoicePeriod/cbc:StartDate | No |
custcol_ehf_service_end_date | Service End Date | //cac:InvoicePeriod/cbc:EndDate | No |
custcol_ehf_line_note | Line Note | //cac:InvoiceLine/cbc:Note | No |
custcol_accounting_cost_ehf | Line Accounting Cost | //cac:InvoiceLine/cbc:AccountingCost | No |
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
🌳 Credit Note XML Structure
Key differences from Invoice XML
📝 Credit Note vs Invoice Differences
| Element | Invoice | Credit Note |
|---|---|---|
| Root Element | <Invoice> | <CreditNote> |
| Type Code | 380 | 381 |
| Type Element | <cbc:InvoiceTypeCode> | <cbc:CreditNoteTypeCode> |
| Line Element | <cac:InvoiceLine> | <cac:CreditNoteLine> |
| Quantity Element | <cbc:InvoicedQuantity> | <cbc:CreditedQuantity> |
📎 BillingReference (REQUIRED for Credit Notes)
📊 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
| Country | IBAN Format | Length | Example | Regex Pattern |
|---|---|---|---|---|
| 🇳🇴 Norway | NO## #### #### ### | 15 | NO9386011117947 | ^NO\d{13}$ |
| 🇬🇧 UK | GB## AAAA #### #### #### ## | 22 | GB29NWBK60161331926819 | ^GB\d{2}[A-Z]{4}\d{14}$ |
| 🇸🇪 Sweden | SE## #### #### #### #### #### | 24 | SE4550000000058398257466 | ^SE\d{22}$ |
| 🇩🇰 Denmark | DK## #### #### #### ## | 18 | DK5000400440116243 | ^DK\d{16}$ |
| 🇫🇮 Finland | FI## #### #### #### ## | 18 | FI2112345600000785 | ^FI\d{16}$ |
| 🇳🇱 Netherlands | NL## AAAA #### #### ## | 18 | NL91ABNA0417164300 | ^NL\d{2}[A-Z]{4}\d{10}$ |
| 🇩🇪 Germany | DE## #### #### #### #### ## | 22 | DE89370400440532013000 | ^DE\d{20}$ |
🏢 Registration Requirements
| Country | Business Register | Special Requirements |
|---|---|---|
| 🇳🇴 Norway | Brønnøysundregistrene | Foretaksregisteret - Second PartyTaxScheme required |
| 🇬🇧 UK | Companies House | LEI (Legal Entity Identifier) for PartyIdentification |
| 🇸🇪 Sweden | Bolagsverket | Swedish org number (10 digits with hyphen: ######-####) |
| 🇩🇰 Denmark | Erhvervsstyrelsen | CVR number required |
| 🇫🇮 Finland | PRH (Patent and Registration Office) | Y-tunnus (Business ID) |
| 🇳🇱 Netherlands | KvK (Chamber of Commerce) | KvK number + BTW (VAT) number |
| 🇩🇪 Germany | Handelsregister | Leitweg-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.euSearch by participant ID (e.g., 0192:923609016)
🇳🇴 Norwegian EHF Register
ELMA Participants ListDownloadable CSV of all Norwegian PEPPOL participants
⚡ Energy Sector Customers by Country
| Country | Major Customers | Special Requirements |
|---|---|---|
| 🇳🇴 Norway | Equinor, AkerBP, Vår Energi, ConocoPhillips NO | 10-digit PO, OrderLineRef, SES number |
| 🇬🇧 UK | Shell UK, BP, Harbour Energy, INEOS | LEI identifier, UK VAT format |
| 🇸🇪 Sweden | Vattenfall, Lundin Energy | Swedish org number format |
| 🇩🇰 Denmark | Ørsted, Total E&P Denmark | CVR number format |
| 🇳🇱 Netherlands | Shell Netherlands, NAM, ExxonMobil NL | KvK number, BTW format |
| 🇩🇪 Germany | Wintershall Dea, BASF | Leitweg-ID for government contracts |
🇳🇴 Norway - Complete Guide
Comprehensive rules for Norwegian PEPPOL invoicing
📋 Norwegian Validation Rules
| Rule | Requirement | Format/Example | Severity |
|---|---|---|---|
| NO-R-001 | Org number MOD11 check digit | 9 digits, last is check digit | L |
| NO-R-002 | VAT number format | NO923609016MVA | L |
| NO-R-003 | IBAN format | NO9386011117947 | L |
| NO-R-004 | Foretaksregisteret required | Second PartyTaxScheme | L |
🔢 Scheme IDs
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| Org Number | 9 digits (starts 8 or 9) | ^[89]\d{8}$ | 923609016 |
| VAT Number | NO + 9 digits + MVA | ^NO\d{9}MVA$ | NO923609016MVA |
| IBAN | NO + 13 digits | ^NO\d{13}$ | NO9386011117947 |
| Bank Account | 11 digits | ^\d{11}$ | 86011117947 |
| Postal Code | 4 digits | ^\d{4}$ | 4035 |
🏢 Foretaksregisteret Requirement
Norwegian suppliers must include two PartyTaxScheme elements:
⚡ Norwegian Energy Customers
| Customer | Org Number | EndpointID | Special Requirements |
|---|---|---|---|
| Equinor Energy AS | 923609016 | 0192:923609016 | 10-digit PO, OrderLineRef, SES |
| AkerBP ASA | 989795848 | 0192:989795848 | Standard PEPPOL |
| Vår Energi AS | 918050632 | 0192:918050632 | Standard PEPPOL |
| ConocoPhillips Norge | 919160675 | 0192:919160675 | Standard PEPPOL |
💰 Norwegian VAT Rates
| Rate | Category | Applies 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
📋 UK Scheme IDs
| Purpose | Scheme | Format | Example |
|---|---|---|---|
| EndpointID (VAT routing) | 9932 | GB + 9-12 digits | GB123456789 |
| EndpointID (LEI routing) | 0199 | 20 alphanumeric | 549300GKFG0RYRRQ1414 |
| PartyIdentification (legal) | 0199 | 20 char LEI | 549300GKFG0RYRRQ1414 |
| Company Number (CRN) | 9933 | 8 digits | 12345678 |
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| VAT Number | GB + 9-12 digits | ^GB\d{9,12}$ | GB123456789 |
| Company Number | 8 digits | ^\d{8}$ | 12345678 |
| LEI | 20 alphanumeric | ^[A-Z0-9]{20}$ | 549300GKFG0RYRRQ1414 |
| IBAN | GB + 2 check + 4 bank + 14 account | ^GB\d{2}[A-Z]{4}\d{14}$ | GB29NWBK60161331926819 |
| Postal Code | UK postcode format | Various | SW1A 1AA |
⚡ UK Energy Customers
| Customer | VAT Number | LEI | Notes |
|---|---|---|---|
| Shell UK | GB235730540 | Lookup required | Use LEI for PartyID |
| BP plc | GB146024686 | 213800LH1BZH3DI6G760 | Use LEI for PartyID |
| Harbour Energy | GB- | Lookup required | Use LEI for PartyID |
| INEOS | GB- | Lookup required | Use LEI for PartyID |
💰 UK VAT Rates
| Rate | Category | Applies 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
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| Org Number | 10 digits (######-####) | ^\d{10}$ | 5560360793 |
| VAT Number | SE + 10 digits + 01 | ^SE\d{10}01$ | SE556036079301 |
| IBAN | SE + 22 digits | ^SE\d{22}$ | SE4550000000058398257466 |
⚡ Swedish Energy Customers
| Customer | Org Number | EndpointID |
|---|---|---|
| Vattenfall AB | 5560360793 | 0007:5560360793 |
| Lundin Energy (now Aker BP Sweden) | 5565620903 | 0007:5565620903 |
💰 Swedish VAT Rates
| Rate | Category | Applies To |
|---|---|---|
| 25% | S (Standard) | General goods and services |
| 12% | S (Reduced) | Food, restaurants, hotels |
| 6% | S (Low) | Books, newspapers, transport |
| 0% | Z/E | Exports, healthcare, education |
🇩🇰 Denmark - Complete Guide
Comprehensive rules for Danish PEPPOL invoicing
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| CVR Number | 8 digits | ^\d{8}$ | 36213728 |
| VAT Number | DK + 8 digits | ^DK\d{8}$ | DK36213728 |
| IBAN | DK + 16 digits | ^DK\d{16}$ | DK5000400440116243 |
⚡ Danish Energy Customers
| Customer | CVR Number | EndpointID |
|---|---|---|
| Ørsted A/S | 36213728 | 0184:36213728 |
| TotalEnergies EP Denmark | - | Lookup required |
💰 Danish VAT Rates
| Rate | Category | Applies To |
|---|---|---|
| 25% | S (Standard) | All taxable goods and services |
| 0% | Z | Exports, newspapers |
| 0% | E | Healthcare, education, finance |
🇫🇮 Finland - Complete Guide
Comprehensive rules for Finnish PEPPOL invoicing
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| Y-tunnus (Business ID) | 7 digits + hyphen + check | ^\d{7}-\d$ | 0116323-8 |
| VAT Number | FI + 8 digits | ^FI\d{8}$ | FI01163238 |
| IBAN | FI + 16 digits | ^FI\d{16}$ | FI2112345600000785 |
| OVT Code | 0037 + Y-tunnus (no hyphen) | - | 003701163238 |
💰 Finnish VAT Rates
| Rate | Category | Applies To |
|---|---|---|
| 24% | S (Standard) | General goods and services |
| 14% | S (Reduced) | Food, restaurant services |
| 10% | S (Low) | Books, newspapers, transport, hotels |
| 0% | Z/E | Exports, healthcare, education |
🇳🇱 Netherlands - Complete Guide
Comprehensive rules for Dutch PEPPOL invoicing
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| KvK Number | 8 digits | ^\d{8}$ | 27378529 |
| BTW Number (VAT) | NL + 9 digits + B + 2 digits | ^NL\d{9}B\d{2}$ | NL123456789B01 |
| IBAN | NL + 2 + 4 letters + 10 digits | ^NL\d{2}[A-Z]{4}\d{10}$ | NL91ABNA0417164300 |
⚡ Dutch Energy Customers
| Customer | KvK Number | EndpointID |
|---|---|---|
| Shell Netherlands | 27378529 | 0106:27378529 |
| NAM (Nederlandse Aardolie Maatschappij) | - | Lookup required |
| ExxonMobil Netherlands | - | Lookup required |
💰 Dutch VAT Rates
| Rate | Category | Applies To |
|---|---|---|
| 21% | S (Standard) | General goods and services |
| 9% | S (Reduced) | Food, books, medicines, hotels, transport |
| 0% | Z | Exports, intra-EU supplies |
| 0% | E | Healthcare, education, finance |
🇩🇪 Germany - Complete Guide
Comprehensive rules for German PEPPOL invoicing
🔣 Format Patterns
| Field | Format | Regex | Example |
|---|---|---|---|
| Leitweg-ID | Variable (B2G routing) | Complex format | 991-12345-67 |
| USt-IdNr (VAT) | DE + 9 digits | ^DE\d{9}$ | DE123456789 |
| IBAN | DE + 20 digits | ^DE\d{20}$ | DE89370400440532013000 |
| Handelsregister | HRB + number | - | HRB 12345 |
⚡ German Energy Customers
| Customer | USt-IdNr | Notes |
|---|---|---|
| Wintershall Dea | DE- | Lookup required |
| BASF SE | DE811156135 | Large chemical/energy |
💰 German VAT Rates
| Rate | Category | Applies To |
|---|---|---|
| 19% | S (Standard) | General goods and services |
| 7% | S (Reduced) | Food, books, newspapers, hotels, transport |
| 0% | Z | Exports, intra-EU supplies |
| 0% | E | Healthcare, education, finance, insurance |
🏢 Subsidiary Setup
How to configure a subsidiary for PEPPOL e-invoicing
📋 Required Fields Checklist
subsidiary.legalname- Legal Namecustrecord_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 Numbersubsidiary.address1- Street Addresssubsidiary.city- Citysubsidiary.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 Addresscustentity_buyer_elec_scheme_id_ehf- Buyer Scheme IDcustentity_buyer_identifier_ehf- Buyer Identifiercustentity_buyer_id_scheme_ehf- Buyer ICD Schemecustentity_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
| Script | Type | Purpose | File |
|---|---|---|---|
| PEPPOL Validator | Suitelet | Validate XML against 290+ rules | SL_PEPPOL_Validator_Local.js |
| Validator Constants | Module | Validation rules and field mappings | SL_PEPPOL_Validator_Constants.js |
| Validate Button | User Event | Add Validate button to invoice | UE_PEPPOL_ValidateButton_Fancy.js |
| PDF Injector | User Event | Inject PDF attachments as BASE64 | cgi_set_pdf_content_base64_ue.js |
| SFTP Sender | Scheduled | Upload XML to CGI SFTP | CGI_PL_PeppolSftp_DO.js |
🔧 Templates
| Template | Type | Purpose |
|---|---|---|
| Invoice Template | FreeMarker | Generate UBL 2.1 Invoice XML |
| Credit Note Template | FreeMarker | Generate UBL 2.1 Credit Note XML |
🔌 API Documentation
Suitelet endpoints and integration guide
📋 PEPPOL Validator Suitelet
| Property | Value |
|---|---|
| Script ID | customscript_sl_peppol_validator |
| Deployment ID | customdeploy_sl_peppol_validator |
| HTTP Method | GET / POST |
| Entry Point | onRequest(context) |
📥 Request Parameters
| Parameter | Type | Description | Example |
|---|---|---|---|
transactionId | Integer | Internal ID of invoice/credit memo | 12345 |
transactionType | String | Record type | invoice, creditmemo |
mode | String | Validation mode | full, quick |
format | String | Response format | json, 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
| Level | Code | Behavior | Action Required |
|---|---|---|---|
| LEGAL | L | Blocks PEPPOL transmission | Must fix before sending |
| MANDATORY | M | Customer will reject | Should fix before sending |
| RECOMMENDED | R | Best practice violation | Optional fix |
| INFO | I | Informational only | No 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
| Property | Value |
|---|---|
| Script ID | customscript_cgi_pl_peppolsftp_do |
| Type | Scheduled Script |
| Trigger | Scheduled (every 15 min) or on-demand |
| SFTP Host | btxdmz.eintegration.net |
| Port | 22 |
📁 SFTP Directory Structure
| Directory | Purpose |
|---|---|
/outbound/invoices/ | Upload invoices for transmission |
/outbound/creditnotes/ | Upload credit notes for transmission |
/inbound/responses/ | MLR and Invoice Responses |
/archive/ | Processed documents archive |
☑️ 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
| Term | Definition |
|---|---|
| PEPPOL | Pan-European Public Procurement Online - network for electronic document exchange |
| BIS 3.0 | Business Interoperability Specification - PEPPOL's invoice format standard |
| UBL 2.1 | Universal Business Language - XML schema underlying PEPPOL |
| EN16931 | European standard for electronic invoicing |
| Access Point | Service provider connecting to PEPPOL network (e.g., Nordic Hub) |
| 4-Corner Model | Sender → Sender's AP → Receiver's AP → Receiver |
| EAS | Electronic Address Scheme - identifies PEPPOL routing scheme |
| ICD | International Code Designator - identifies legal entity scheme |
| EndpointID | PEPPOL network address for routing documents |
| GLN | Global Location Number - 13-digit location identifier |
| SES | Service Entry Sheet - Equinor's service confirmation number |
| MOD11 | Check digit algorithm for Norwegian org numbers |
| FreeMarker | Template engine used by NetSuite for XML generation |
| SuiteScript | NetSuite's JavaScript-based scripting language |
| BaseQuantity | Always 1 in PEPPOL (NetSuite stores per-unit rates) |
❓ Frequently Asked Questions
Common questions and answers
📚 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.