A build-to-order ERPNext app that produces validated Norwegian SAF-T Financial XML directly from your ERPNext general ledger, tax masters and party records. ECOSIRE scopes, builds, installs and supports it on your Frappe bench — it is not a marketplace download. Built to order by ECOSIRE for ERPNext v15, v16 — indicative price from $499.00 USD; request a quote for a scoped proposal.
Illustrative previewA build-to-order ERPNext app that produces validated Norwegian SAF-T Financial XML directly from your ERPNext
general ledger, tax masters and party records.
ECOSIRE scopes, builds, installs and supports it on your Frappe bench — it is not a marketplace download.
No DIY setup — a working app, built, installed and supported by ECOSIRE.
Start with a one-time build price. We scope it with you at kickoff.
ECOSIRE builds, configures and installs it on your ERPNext.
You go live in about 2–4 weeks, with a post-launch support window.
When Skatteetaten asks for a SAF-T Financial file, the clock starts. Norwegian bookkeeping rules require accounting data in the standard SAF-T Financial XML structure — a header identifying the reporting entity, a master-files block covering general ledger accounts, customers, suppliers, tax codes and analysis dimensions, and a GeneralLedgerEntries block carrying every journal line for the requested period. ERPNext already holds all of that data, but it holds it as GL Entry, Account, Customer, Supplier, Sales Taxes and Charges Template and Accounting Dimension records — not as the Norwegian standard account grouping and MVA tax-code structure the schema expects. Finance teams end up exporting to spreadsheets, hand-mapping the chart of accounts, hand-building XML, and discovering the mismatch only when the file is rejected.
ERPNext core stops well short of this. It has no SAF-T schema awareness, nowhere to persist a mapping from your Account tree to the Norwegian standard accounts, no MVA tax-code mapping table, no XML serialiser, no XSD validator, and no record of what was sent and when. Accounting Dimensions can carry the analysis data, but nothing translates them into the Analysis structure of the file. Every request becomes a manual project, and any correction after a rejection means starting again from a spreadsheet nobody trusts.
ECOSIRE builds this as a proper Frappe app installed on your bench — its own module, its own DocTypes, its own permissions, no patched core files. A Norway SAF-T Settings single DocType holds the reporting entity, the target file version and the sender registration details. Mapping DocTypes hold the account-to-standard-account and tax-template-to-MVA-code relationships, with a validate hook that refuses submission on an incomplete mapping so gaps surface before an export rather than after. A SAF-T Export DocType is the working record: choose company and date range, submit, and a background job enqueued via frappe.enqueue streams GL Entry rows in batches, assembles the master-files and general-ledger-entries blocks, and writes the XML as a File attached to the export. The same posting is rendered twice — machine XML for Skatteetaten and a human-readable print format on the same document — so your controller reviews exactly what the authority receives. Every generated file is validated against the official XSD before the export can be marked ready, with a line-level error report naming the offending voucher instead of an XML byte offset. Whitelisted methods expose generation and status over the Frappe REST API, hooks.py doc events on Account, Customer, Supplier and the tax templates flag newly created records as unmapped at creation time, and an optional scheduler event pre-validates the open period nightly so the file is already known-good when the request arrives.
Rejection handling is a first-class workflow. A rejected submission is recorded against the export with the authority's reason, and a correction export can be raised that references the original, re-runs against the amended ledger, and preserves both versions. Nothing is overwritten: every generated file, its validation result, its submitter and its timestamp stay attached to an immutable record with the standard Frappe document trail, and role profiles separate who may configure mappings, who may generate, and who may confirm a submission.
This is build-to-order. There is no instant download — ECOSIRE builds the app for your ERPNext instance, against your chart of accounts, your MVA setup and your Frappe/ERPNext version (v15 or v16), on your own bench or a Frappe Cloud private bench. Delivery starts with a scoping call, moves to a fixed written scope, then build, UAT on a staging copy of your own data, and go-live with a documented rollback plan and a post-go-live support window. Typical delivery is 2-4 weeks from confirmed scope. You receive the full source and the git repository, so the app is yours to keep, audit and extend.
Owns the response to a Skatteetaten request and signs off on what leaves the building. Needs the XML plus a readable rendering of the same posting so the numbers can be reviewed before submission, and a clear record of what was sent, by whom and when.
Runs ERPNext across several companies where one entity carries Norwegian obligations. Needs SAF-T generation scoped per company without restructuring the group chart of accounts or disturbing reporting for the other entities.
Maintains the bench and lives with whatever gets installed. Needs a properly packaged app with its own DocTypes and hooks rather than core patches or ad-hoc server scripts, so `bench update` and version upgrades stay predictable — plus the git repository to review the code.
Advises on Norwegian bookkeeping compliance and is often the one reading the rejection notice. Needs the mapping between the client's chart of accounts and the standard accounts to be visible, editable and versioned rather than buried in a spreadsheet.
| Criterion | ECOSIRE | Custom Build | Competitor | ERPNext Native |
|---|---|---|---|---|
| SAF-T Financial XML output | Purpose-built serialiser covering Header, MasterFiles and GeneralLedgerEntries, generated from your live ledger | Achievable, but you write and test the serialiser against the schema yourself | Often generic or built for another country's SAF-T variant; Norwegian coverage frequently partial | None — ERPNext core has no SAF-T concept |
| Chart of accounts mapping | Persistent mapping DocType with submit-time validation that blocks unmapped accounts | Whatever your developer builds; usually a spreadsheet import with no ongoing validation | Fixed mapping assumptions that rarely fit a group chart of accounts | Accounts exist, but nothing maps them to standard accounts |
| MVA / tax code handling | Mapped from your actual sales, purchase and item tax templates, including reverse charge and zero-rated | Built once against today's templates, then drifts as tax setup changes | Generic tax table, rarely aware of ERPNext template structure | Tax templates exist; no standard tax-code translation |
| Validation before submission | XSD validation with line-level errors naming the offending GL Entry and voucher | Depends on scope; often validated only after a rejection arrives | Schema check at best, with errors reported as XML offsets | No validation of any kind |
| Rejection and correction | Modelled workflow — reason recorded, linked correction export, both versions retained | Usually re-run the script and overwrite; history left to convention | Regenerate only; correction lineage typically not modelled | Not applicable |
| Large-period performance | Batched background job via `frappe.enqueue` with progress on the document | Frequently synchronous first, then reworked after the first timeout | Varies; synchronous generation is common | Not applicable |
| Archiving and audit trail | Immutable export records with file, validation result, submitter and timestamp, plus Frappe version history | Files land wherever the script writes them | File attachment with limited submission history | Standard document history only; no export concept |
| Ownership and upgrade path | Full source and git repo handed over; app-scoped with no core patches; built for v15/v16 | You own it, and you own every upgrade and bug with it | Vendor-controlled; fixes and upgrades follow their roadmap | Upgrades with ERPNext, but the capability is simply absent |
No — this is build-to-order, not a marketplace download. ECOSIRE builds it for your ERPNext instance against your chart of accounts, your MVA setup and your Frappe version. Typical delivery is 2-4 weeks from confirmed scope: a short scoping call, then a fixed written scope, then build, UAT on staging, and go-live with a rollback plan.
Delivery includes a post-go-live support window for defects and questions against the delivered scope. You also receive the full source and git repository, so your own team or any Frappe developer can maintain it. Beyond the included window we offer ongoing support and version-upgrade work — for example carrying the app from v15 to v16, or adapting to a schema revision — as a separately quoted engagement, never billed by surprise.
It works with your existing accounts and never touches your `Account` tree. A persistent mapping DocType links each of your accounts to the Norwegian standard account, so operational reporting stays exactly as it is while the export speaks the standard's language. The initial mapping is loaded from your live chart during delivery and reviewed with your finance owner.
Rejection is a modelled workflow, not a restart. You record the authority's reason on the export document, then raise a linked correction export that re-runs against the amended ledger. Both the original and the correction are retained with their files, validation results, submitters and timestamps — nothing is overwritten, so the trail shows exactly what was sent and what replaced it.
We build and test for Frappe/ERPNext v15 and v16. It installs as a normal Frappe app on a self-hosted bench, and on Frappe Cloud it requires a private bench, since custom apps cannot be installed on a shared bench. Tell us your version and hosting on the scoping call and we build against that target.
No. Generation runs as a background job via `frappe.enqueue` and streams `GL Entry` rows in batches instead of loading a whole period into memory, with progress shown on the export document. Users keep working while the file builds, and long date ranges do not tie up a web worker.
Yes. Whitelisted methods exposed over the Frappe REST API let a portal, RPA bot or external scheduled task trigger generation, poll status and fetch the resulting file. Access is governed by the same Frappe permissions and role profiles as the UI — API access does not bypass who may generate or confirm a submission.

A build-to-order 2Checkout (Verifone) payment integration for ERPNext, giving global digital-goods sellers card acceptance, 45+ local payment methods, multi-currency checkout, and reconciled invoices. ECOSIRE scopes, builds, installs, and supports it on your ERPNext v15/v16 instance.

A build-to-order ERPNext application for anonymous 360-degree reviews — configurable peer, manager, report and self rater groups, weighted competency scoring, and aggregated gap-analysis and heatmap reports. ECOSIRE scopes, builds, installs and supports it on your Frappe/ERPNext v15/v16 instance.

A build-to-order ERPNext app that detects abandoned webshop and POS carts, then runs multi-channel WhatsApp, email, and SMS recovery and win-back sequences with dynamic cart content and coupon injection. ECOSIRE scopes, builds, installs, and supports it for your v15/v16 instance.

A build-to-order ERPNext app for running B2B account-based campaigns: define target-account lists, sequence outreach calls, auto-distribute them to agents, and score account engagement across every contact. ECOSIRE designs, builds, installs and supports it after you confirm scope.
A build-to-order ERPNext app that produces validated Norwegian SAF-T Financial XML directly from your ERPNext general ledger, tax masters and party records. ECOSIRE scopes, builds, installs and supports it on your Frappe bench — it is not a marketplace download.