A build-to-order Frappe app that issues Vietnamese e-invoices straight from ERPNext Sales Invoices, transmitting to your authorised provider and handling invoice codes, tax mapping, rejections and archiving. ECOSIRE builds, installs and supports it on your ERPNext v15/v16 site. 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 Frappe app that issues Vietnamese e-invoices straight from ERPNext Sales Invoices,
transmitting to your authorised provider and handling invoice codes, tax mapping, rejections and archiving.
ECOSIRE builds, installs and supports it on your ERPNext v15/v16 site.
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.
Finance teams operating in Vietnam cannot treat the invoice as a printed document any more. Every sale has to be issued as a structured electronic invoice, transmitted through an authorised provider, carry a valid invoice code and template/serial designation, and be retained in a form you can produce years later during a tax inspection. ERPNext core gives you a Sales Invoice, a Tax Category, an Item Tax Template and a print format — and stops there. There is no concept of a provider transmission attempt, no place to store the returned invoice code, no adjustment/replacement lifecycle when the provider or the buyer rejects a document, and no audit trail proving which exact payload was signed and sent. Teams fill that gap with a spreadsheet and a second login into the provider portal, which means the ERP and the legal record drift apart within weeks.
What ECOSIRE builds is a proper Frappe app — its own module, not a pile of customisations — installed on your bench alongside ERPNext. It introduces DocTypes for the provider connection settings (endpoint, credentials, template and serial designation, environment), a per-document E-Invoice Log that captures the generated payload, the request, the provider response, the returned invoice code and every status transition, and mapping DocTypes that translate ERPNext master data into the tax and unit codes the provider expects. Transmission is wired to hooks.py document events on Sales Invoice on_submit, so nothing depends on a user remembering to press a button, with a role-gated manual re-send for exceptions. Provider calls run through Frappe's background queue rather than blocking the submit, and a scheduler event sweeps documents stuck in a pending state to retry with backoff or flag them for a human.
Technically it stays inside the framework rather than fighting it. Payload construction is Python in the app, unit-tested against your real chart of accounts and item taxes, so a change in a tax rate is a data change and not a code change. The provider call sits behind a thin adapter class, so changing provider is configuration plus one adapter, not a rewrite. Whitelisted methods expose issue, cancel/replace and status-refresh to the desk and to the Frappe REST API, which is how your e-commerce or POS front end triggers issuance without a second integration. A client script surfaces the invoice code, provider status and last response directly on the Sales Invoice form, and a custom print format produces the presentation copy from exactly the same posting that produced the machine format — so the PDF the customer receives and the record the authority holds can never disagree. Rejections enter a correction workflow with its own status field and role-gated actions, so an accountant issues an adjustment or replacement linked to the original instead of editing history. Permissions ship as role profiles: an AR clerk can issue, only a finance manager can cancel or replace, and the log is read-only to everyone.
Archiving is a first-class requirement here, not an afterthought. Every transmitted payload and every provider acknowledgement is stored as an immutable attachment against the log record with a content hash, and a report produces a complete period file for an inspector without anyone touching the provider portal. Because the log is a DocType, it inherits Frappe's version history, comments and user attribution, so "who did what, when, to which invoice" is answerable from inside ERPNext.
This is a build-to-order product — there is no instant download. We start with a short scoping call to confirm your authorised provider, invoice templates and serials, tax mapping, company structure and ERPNext version, then build against your Frappe/ERPNext v15 or v16 site. Typical delivery is two to four weeks from confirmed scope. We deploy to your staging bench first, run UAT with your finance team against provider sandbox credentials, then cut over to production with a documented rollback plan. You receive the full source in a git repository you own, so you are never locked to us for the code.
Accountable for the legal validity of every issued invoice. Needs the ERP record and the provider record to be the same record, wants cancel and replace restricted to their role, and must be able to produce a complete archived period file during a tax inspection without opening the provider portal.
Owns the bench and the upgrade path. Wants a self-contained app with clean hooks, patches and migrations rather than core edits or ad-hoc server scripts, and needs confidence that a `bench migrate` to the next v15/v16 patch release will not break invoice issuance.
Issues dozens or hundreds of invoices a day and cannot check a provider portal for each one. Needs status and invoice code visible on the Sales Invoice form, a clear queue of rejected documents, and a guided correction flow that does not require accounting-level permissions.
Runs several Vietnamese legal entities on one ERPNext instance. Needs per-company provider settings, templates and serial designations, plus consolidated visibility of transmission failures across every entity in one list view.
| Criterion | ECOSIRE | Custom Build | Competitor | ERPNext Native |
|---|---|---|---|---|
| Provider transmission | Built against your contracted provider behind a swappable adapter | Achievable, but the adapter boundary is usually skipped and hard-coded | Often assumes one provider, with no adapter layer | No provider or transmission concept in ERPNext core |
| Invoice code, template and serial | Configured per company; returned code stored on the log and shown on the invoice | Typically one custom field with no lifecycle behind it | Varies; frequently assumes a single company and serial | No field for a provider-issued invoice code |
| Tax and UOM mapping | Mapping DocTypes driven by your Item Tax Templates and Tax Categories | Usually hard-coded in a server script; a rate change needs a developer | Fixed mapping table that you adapt your masters to | Tax templates exist but nothing maps them to provider codes |
| Rejection and correction | Dedicated workflow; adjustment/replacement linked to the original, role-gated | Manual cancel, amend and re-send, with the trail held together by convention | Basic re-send button; correction lifecycle often absent | Cancel and amend only, with no provider-side meaning |
| Archiving and audit trail | Hashed immutable attachments per transmission plus a period export report | Whatever the developer remembered to log at the time | Stores the response text, rarely the exact payload that was sent | Standard document versioning only |
| Upgrade safety | Separate app with clean hooks and patches, tested on v15 and v16 | Server scripts and core edits that break on the next `bench migrate` | Depends on the vendor shipping a build for your version | Safe by definition, but does not do the job |
| Reliability under provider outage | Background-queue transmission plus a scheduler sweep with retry and backoff | Usually a synchronous call that fails the submit when the provider is slow | Often synchronous, recovered by a manual re-send | Not applicable |
| Ownership and extensibility | Full source in a git repository you own, with docs and team training | You own it, but it is usually undocumented and untested | Vendor-controlled repo or licence; every change goes through them | Core code you should not be modifying |
There is no download. This is a build-to-order product: we build the app for your ERPNext version, your authorised provider and your tax configuration. Typical delivery is two to four weeks from confirmed scope — scoping call first, then build, then staging UAT, then production cutover. Complex multi-entity or multi-provider work can run longer, and we say so in the quotation rather than afterwards.
Every engagement includes a post-go-live support window for defect fixes and configuration adjustments against the delivered scope. Beyond that we offer an ongoing support and maintenance agreement covering compatibility with new Frappe/ERPNext patch releases, provider API changes and regulatory format updates. Because you receive the git repository, your own team can also maintain and extend the code independently.
The provider call sits behind an adapter with a defined interface, so we build against the authorised provider you already hold a contract with. Name the provider on the scoping call and we implement that adapter. Adding a second provider later is an additional adapter and mapping set, not a rebuild.
It is a separate Frappe app with its own DocTypes, `hooks.py` events and patches — we do not modify ERPNext core files and we do not rely on fragile server scripts stored in the database. That is what makes `bench update` and `bench migrate` safe. We build and test on Frappe/ERPNext v15 and v16; a jump to a future major version is a small compatibility engagement, not a new build.
The rejection is written to the E-Invoice Log with the provider's reason code and message, the Sales Invoice is flagged, and the document enters the correction workflow. A permitted user issues an adjustment or replacement that is linked to the original — the original is never silently edited, so the audit trail stays intact.
Yes. Issue, cancel/replace and status refresh are exposed as whitelisted methods over the Frappe REST API, authenticated with a normal API key and secret and governed by the same role permissions as the desk. Your front end calls ERPNext; only ERPNext talks to the provider.
Every transmitted payload and every provider acknowledgement is stored as an immutable attachment on its log record with a content hash, and a report exports a complete period file. Because the log is a DocType, Frappe's version history, comments and user attribution apply to it, so you can answer who did what and when from inside ERPNext.

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 Frappe app that issues Vietnamese e-invoices straight from ERPNext Sales Invoices, transmitting to your authorised provider and handling invoice codes, tax mapping, rejections and archiving. ECOSIRE builds, installs and supports it on your ERPNext v15/v16 site.