Skip to main content
Norway SAF-T Financial + EHF/Peppol for Odoo — A build-to-order Odoo module that produces Skatteetaten-compliant SAF-T Financ — 1/1Illustrative preview

A build-to-order Odoo module that produces Skatteetaten-compliant SAF-T Financial XML and sends EHF 3.0 (Peppol

BIS Billing 3) invoices with KID payment references and correct MVA codes.

ECOSIRE scopes, builds, installs and supports it for your specific chart of accounts.

What is Norway SAF-T Financial + EHF/Peppol for Odoo?

A build-to-order Odoo module that produces Skatteetaten-compliant SAF-T Financial XML and sends EHF 3.0 (Peppol BIS Billing 3) invoices with KID payment references and correct MVA codes. ECOSIRE scopes, builds, installs and supports it for your specific chart of accounts. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

SAF-T Financial XML export generating the Skatteetaten `Audit File - Financial` structure (masterfiles, GL entries, header) for any selected period
Configurable standard-account mapping model that cross-references each Odoo account to the SAF-T standard account set (NS 4102-based) so your own chart still exports against government codes
MVA-to-SAF-T tax-code mapping table covering domestic, reverse-charge, zero-rated and exempt rates
MVA-melding (VAT return) summary computed from the same posted `account.move.line` entries used for SAF-T
XSD validation of the SAF-T file before export, surfacing structural errors in the Odoo UI rather than at the portal
EHF 3.0 / Peppol BIS Billing 3 sales-invoice generation as an `account_edi` document type rendering UBL 2.1 (`cbc`/`cac`)
Access-Point-ready UBL handoff with Peppol participant identifiers derived from a validated `Organisasjonsnummer`
KID (`kidnummer`) payment-reference generation on invoices via a computed field supporting MOD-10 and MOD-11 check-digit schemes
`Organisasjonsnummer` validation extending `base_vat` with the Norwegian MOD-11 organisation-number check
Inbound EHF import that parses received Peppol UBL into draft `account.move` vendor bills for review
Norwegian NS 4102 chart-of-accounts template alignment layered on top of `l10n_no`
QWeb invoice report showing the KID line, MVA breakdown per rate and Peppol identifiers in a Norwegian layout
`ir.model.access.csv` plus record rules restricting who can generate SAF-T exports and view the audit file
Supports Odoo 17.0, 18.0 and 19.0 on Community and Enterprise, with the SAF-T and EHF logic kept upgrade-safe

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Norwegian businesses face two obligations that Odoo core does not cover out of the box. When the tax authority (Skatteetaten) requests it during an audit or bookkeeping review, you must be able to hand over a SAF-T Financial file — a strictly-schema'd XML export of your ledger, accounts, customers, suppliers and tax codes mapped to the national standard account set. Separately, to invoice the Norwegian public sector (and increasingly B2B partners), you must send EHF 3.0 documents over the Peppol network rather than PDF. Stock Odoo (account, account_edi, l10n_no) gives you a Norwegian chart of accounts and MVA tax setup, but there is no SAF-T generator, no standard-account cross-mapping, no EHF 3.0 UBL builder, and no KID reference on the payment slip. Teams end up exporting to spreadsheets and re-keying invoices into an Access Point portal by hand.

This is what ECOSIRE builds for you as a made-to-order module. On the SAF-T side we add a generator that walks your account.move / account.move.line data for a selected period and emits the Skatteetaten Audit File - Financial structure: masterfiles (accounts, customers, suppliers, tax table), the general-ledger entries, and the header block carrying your Organisasjonsnummer. Each Odoo account is cross-mapped to the SAF-T standard account (NS 4102-based) via a configurable mapping model, so your own multi-digit chart still exports against the government's standard codes. Every MVA tax in Odoo is mapped to its SAF-T tax code, and we generate the MVA-melding (VAT return) summary figures from the same posted entries. Before anything leaves the system the XML is validated against the official XSD, so you catch structural errors at your desk instead of at the portal.

On the e-invoicing side we implement EHF 3.0 / Peppol BIS Billing 3 as a document type extending account_edi. When you confirm a customer invoice, the module renders Access-Point-ready UBL 2.1 — correct cbc/cac structure, Peppol participant identifiers derived from the validated Organisasjonsnummer, MVA breakdown per rate, and a computed KID (kidnummer) payment reference using the MOD-10 or MOD-11 check-digit scheme your bank uses. The UBL is handed off to your chosen Peppol Access Point for transmission; we do not resell network access, we make Odoo produce a document your provider will accept. We also add inbound EHF: supplier documents you receive are parsed into draft account.move vendor bills for review, so incoming Peppol traffic lands in Odoo instead of an inbox. All of this ships as clean, upgrade-safe code — proper __manifest__.py dependencies, models.Model extensions with @api.depends computes for the KID and MVA fields, ir.model.access.csv plus record rules for who can export SAF-T, XML/OWL views, and a QWeb layout for the KID-bearing invoice. The JSON-RPC/XML-RPC API surface stays intact so your other integrations keep working.

Because it is build-to-order, delivery follows a short, predictable path: a scoping call to confirm your chart of accounts, MVA setup, bank KID scheme and Access Point; a fixed quotation; then we build, validate against the XSD and a real Peppol test corner, run UAT on a staging copy of your database, and deploy with a documented rollback. Typical delivery is one working week from confirmed scope, and we support Odoo 17.0, 18.0 and 19.0 on Community or Enterprise. Pricing starts from $999 (indicative, single-company base scope); additional legal entities, a non-standard chart of accounts requiring deeper standard-account mapping, custom KID rules, or inbound-EHF automation depth increase the quoted scope.

What you get

  • Installable source code for your Odoo version (17.0, 18.0 or 19.0), Community or Enterprise
  • Installation and configuration on your environment, including standard-account and MVA code mapping for your chart
  • Technical documentation covering models, fields, the SAF-T/EHF pipeline and configuration points
  • User guide plus a live training session for your finance/accounting team
  • Post-go-live support window for defect fixes and configuration questions
  • UAT on a staging copy of your database, validated against the SAF-T XSD and a Peppol test corner, with a documented rollback plan
  • Git repository handover with tagged release and commit history
  • Configuration workbook capturing your KID scheme, Access Point details and account mappings for future reference

Who this is for

Norwegian SME finance manager

Runs bookkeeping in Odoo and must be able to produce a valid SAF-T Financial file on demand when Skatteetaten or the auditor asks, without exporting to spreadsheets and re-formatting by hand.

Public-sector supplier / AR team

Sells to Norwegian government bodies that mandate EHF over Peppol and needs confirmed Odoo invoices to become Access-Point-ready UBL with the correct KID reference, instead of manual entry in a portal.

Accounting firm serving Norwegian clients

Manages multiple client databases and wants one reliable, upgrade-safe SAF-T and EHF module they can standardise on across engagements rather than patching each client individually.

Odoo implementation partner / internal ERP lead

Owns an Odoo rollout in Norway and needs a documented, git-handed-over localization layer with clear models, access rules and tests so the compliance piece is maintainable in-house.

How Norway SAF-T Financial + EHF/Peppol for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
SAF-T Financial exportBuilt-in generator emitting the Skatteetaten structure, XSD-validated before exportPossible but you specify and build the whole XML schema yourselfMay cover basic SAF-T but rarely tuned to your chart or validatedNot available in Odoo core
Standard-account mappingConfigurable mapping of your accounts to the NS 4102-based standard setHand-coded mapping you must design and maintainFixed mapping assumptions, hard to adapt to your COANo standard-account concept at all
EHF 3.0 / Peppol invoicingUBL 2.1 document type, Access-Point-ready with Peppol identifiersBuild the UBL builder and identifier logic from scratchGeneric EHF that may not match your Access Point's expectationsOnly generic `account_edi`, no EHF/Peppol BIS builder
KID payment referenceComputed KID with MOD-10 or MOD-11 matching your bank schemeYou implement and test the check-digit algorithm yourselfKID sometimes present but scheme choice may be fixedNo KID generation
Inbound EHF vendor billsReceived Peppol UBL parsed into draft vendor bills for reviewSeparate parser project on top of the outbound workOften outbound-only, no inbound pathNot handled
Fit to your setupScoped to your COA, MVA codes, KID scheme and Access PointFully bespoke but on your time and QA budgetOne-size-fits-all, you adapt around its assumptionsGeneric Norwegian localization only
Delivery & supportBuilt, installed, UAT + rollback, support window, git handoverDepends entirely on your internal capacity and timelineDownload plus forum/ticket support, self-installCommunity support only, no localization delivery
Odoo version coverage17.0 / 18.0 / 19.0, Community or Enterprise, upgrade-safeWhatever you build and then re-test each upgradeVaries by listing; upgrades not guaranteedShips with each version but without SAF-T/EHF

Frequently Asked Questions about Norway SAF-T Financial + EHF/Peppol

Is this an app I can download and install right now?

No. This is a build-to-order module. ECOSIRE builds it for your specific chart of accounts, MVA setup, KID scheme and Peppol Access Point, then installs and supports it. It is not an existing apps.odoo.com download, and we never claim an instant download.

How long does delivery take?

Typical delivery is one working week from confirmed scope. After the scoping call and a fixed quotation, we build the module, validate the SAF-T output against the official XSD and test EHF over a Peppol test corner, run UAT on a staging copy of your database, and then deploy with a rollback plan.

How does pricing and scoping work?

Pricing starts from $999 as an indicative single-company base scope. We give you a firm fixed quote only after a scoping call, because the real drivers are the number of legal entities, how non-standard your chart of accounts is for standard-account mapping, custom KID rules and how much inbound-EHF automation you want. The from-price is indicative, not a fixed quote.

Does this send my invoices onto the Peppol network directly?

The module produces Access-Point-ready EHF 3.0 / Peppol BIS Billing 3 UBL from your confirmed Odoo invoices and hands it to your chosen Peppol Access Point for transmission. We do not resell network access; we make Odoo generate a document your Access Point will accept, and we help wire up the handoff.

What about support and future Odoo updates?

Every build includes a post-go-live support window for defect fixes and configuration questions, and you receive the full git repository so the code is yours to maintain. We keep the SAF-T and EHF logic upgrade-safe, and we can quote a separate engagement to migrate the module when you move to a newer Odoo version.

Which Odoo versions and editions are supported?

We support Odoo 17.0, 18.0 and 19.0 on both Community and Enterprise. The module builds on `account`, `account_edi`, `base_vat` and `l10n_no`, and we confirm any edition-specific behaviour during the scoping call.

Can it handle both the SAF-T export and the VAT return figures?

Yes. The SAF-T Financial export and the MVA-melding (VAT return) summary are computed from the same posted journal entries, so your audit file and your VAT figures reconcile against one source. The SAF-T file is validated against the Skatteetaten XSD before you export it.

Request a quote

Norway SAF-T Financial + EHF/Peppol

A build-to-order Odoo module that produces Skatteetaten-compliant SAF-T Financial XML and sends EHF 3.0 (Peppol BIS Billing 3) invoices with KID payment references and correct MVA codes. ECOSIRE scopes, builds, installs and supports it for your specific chart of accounts.

  • SAF-T Financial XML export generating the Skatteetaten `Audit File - Financial` structure (masterfiles, GL entries, header) for any selected period
  • Configurable standard-account mapping model that cross-references each Odoo account to the SAF-T standard account set (NS 4102-based) so your own chart still exports against government codes
  • MVA-to-SAF-T tax-code mapping table covering domestic, reverse-charge, zero-rated and exempt rates
  • MVA-melding (VAT return) summary computed from the same posted `account.move.line` entries used for SAF-T

Request a Quotation

Tell us about your Norway SAF-T Financial + EHF/Peppol requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.