A build-to-order Frappe app that fiscalizes ERPNext Sales Invoices against Tanzania Revenue Authority EFD/VFD requirements, returning the fiscal receipt number, verification code and QR back onto the invoice. ECOSIRE builds, installs and supports it for your ERPNext v15/v16 site after a scoping call. 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 fiscalizes ERPNext Sales Invoices against Tanzania Revenue Authority EFD/VFD
requirements, returning the fiscal receipt number, verification code and QR back onto the invoice.
ECOSIRE builds, installs and supports it for your ERPNext v15/v16 site after a scoping call.
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 invoicing in Tanzania run a split process: the sale is recorded in ERPNext, but the fiscal receipt is produced somewhere else — a physical EFD terminal on the counter, a vendor portal, or a spreadsheet the accountant re-keys at month end. ERPNext core has no concept of a fiscal device. A Sales Invoice submits happily whether or not TRA ever saw it, the naming series bears no relationship to the fiscal receipt number, and the Tanzanian VAT breakdown lives in Sales Taxes and Charges in a shape no fiscal endpoint accepts. The result is the familiar pattern: invoices posted in the ERP that were never fiscalized, fiscal receipts issued that were never posted, and a reconciliation exercise before every VAT return that nobody enjoys.
We build a proper Frappe app — its own module, its own DocTypes, its own git repository — that makes fiscalization a first-class step of the ERPNext posting lifecycle rather than a parallel process. A TRA EFD Settings single DocType holds the per-company device credentials, VFD registration details, endpoint URLs and certificate material, with secrets stored as Password fieldtype so they are encrypted at rest and never rendered back to the browser. A TRA Fiscal Document DocType is created for each fiscalization attempt and carries the full request payload, the raw response, the fiscal receipt number, verification code, verification URL, TRA timestamp and the resulting status. A hooks.py doc_events handler on Sales Invoice on_submit enqueues the fiscalization through frappe.enqueue so a slow or unreachable device never blocks a cashier's submit, and a companion handler blocks on_cancel for any invoice that already holds a successful fiscal receipt — because a fiscalized document is corrected with a credit note, never quietly cancelled.
Tax mapping is driven from your existing ERPNext master data rather than a hard-coded table. We map each Item Tax Template and Sales Taxes and Charges Template to the TRA tax code it represents — standard-rated, zero-rated, exempt, special rate — so a change in the master data changes the fiscal output without touching code. Line-level rounding is computed to the tolerance the endpoint expects rather than inherited from ERPNext's display precision, which is the single most common cause of rejection on first go-live. Human-readable and machine formats come out of the same posting: the signed payload goes to TRA, and a customised Print Format renders the fiscal receipt number, verification code and a QR code pointing at the TRA verification URL onto the customer-facing invoice, so one submit produces both the fiscal record and the document the customer actually receives.
Rejections are treated as a workflow, not an exception in a log. A failed fiscalization leaves the TRA Fiscal Document in a Failed state with the TRA error code and message parsed onto named fields, an indicator on the linked Sales Invoice, and a retry action exposed as a whitelisted method (@frappe.whitelist()) so an authorised finance user can re-attempt after correcting the underlying data. A scheduler_events hourly job sweeps stuck and pending documents, refreshes the device token before expiry, and raises an exception report of anything that has aged past your tolerance. Permissions ship as a dedicated TRA Compliance Officer role with a matching Role Profile, so operators can fiscalize and retry without gaining rights to edit the credentials in Settings. Everything is reachable over the standard Frappe REST API for your own integrations, and archiving is real archiving — every request and response is retained immutably against the fiscal document with a versioned audit trail, exportable for a TRA audit.
This is build-to-order, not a marketplace download. We start with a short scoping call to confirm your TRA registration and device model, your ERPNext version (v15 or v16), your VAT template structure and your branch or POS topology. From confirmed scope, typical delivery is 2 to 4 weeks: we build against a staging copy of your site, run UAT with your finance team on real invoice shapes, then install on production with a documented rollback. You receive the installable source for your version, the git repository, technical and user documentation, a training session, and a post-go-live support window while the first VAT period runs through the new flow.
Owns the VAT return and signs off the numbers. Needs every posted Sales Invoice to have a matching TRA fiscal receipt with no manual reconciliation, and a defensible audit trail when TRA asks for the underlying request and response.
Responsible for the site's stability and upgrade path. Wants a proper Frappe app in its own repository with hooks and scheduler events they can read, not a pile of Server Scripts and Custom Fields that break on the next `bench update`.
Issues invoices daily and absorbs the pain when a fiscalization fails. Needs the rejection reason visible on the invoice itself, a retry they are permitted to run, and a clear rule about when to raise a credit note rather than cancel.
Runs multiple companies or branches where only some entities are TRA-registered. Needs per-company settings, correct behaviour on non-Tanzanian entities, and consolidated visibility of fiscalization exceptions across all branches.
| Criterion | ECOSIRE | Custom Build | Competitor | ERPNext Native |
|---|---|---|---|---|
| Fiscalization trigger | `on_submit` doc event on Sales Invoice, queued via `frappe.enqueue` so a slow device never blocks the user | Usually a Server Script fired synchronously — the cashier waits, and a timeout aborts the submit | Often a manual button the user must remember to press after posting | None — ERPNext has no concept of a fiscal device |
| Tax mapping to TRA codes | Driven from `Item Tax Template` and `Sales Taxes and Charges Template`, editable as master data | Typically hard-coded rates in the script, reopened for every rate change | Fixed mapping tuned to the vendor's reference chart of accounts | Tax templates exist but carry no TRA tax-code concept |
| Rejection handling | `Failed` state with parsed TRA error code, an invoice indicator and a permissioned retry action | Usually an entry in the Error Log nobody reads until the VAT return | Retry exists, but the reason is often a raw response dump | Not applicable |
| Cancellation safety | `on_cancel` guard forces a credit note once a fiscal receipt exists | Rarely implemented — cancelled invoices drift out of sync with TRA | Varies by vendor; frequently unguarded | Cancels freely, with no fiscal awareness |
| Audit archive | Immutable request/response pairs on `TRA Fiscal Document` with Frappe versioning and an audit export | Whatever the developer chose to log, often truncated | Response stored, request frequently discarded | Standard document versioning only, no fiscal payloads |
| Permissions model | `TRA Compliance Officer` role and Role Profile separating fiscalize/retry from credential edit rights | Usually runs as System Manager because it was quicker | Generic role; credentials often visible to anyone who can fiscalize | Standard Accounts roles, no fiscal separation |
| Upgrade path | Proper Frappe app in its own repo, branch-pinned to v15/v16 and handed to you | Custom Fields and Server Scripts that survive `bench update` only by luck | Vendor-controlled release cadence; you wait for their version support | Upgrades cleanly, but delivers no fiscalization at all |
| Source ownership | Private git repository handed over — your team can maintain it | You own it, but the person who wrote it may not still be there | Licensed or vendor-hosted app; source usually not provided | Open source, but the capability does not exist |
No — this is build-to-order, and we say so plainly. There is no instant download and no existing Frappe Cloud Marketplace listing. We build the app against your ERPNext version, your TRA registration and your VAT template structure, then install and support it.
Typical delivery is 2 to 4 weeks from confirmed scope. The clock starts once the scoping call has settled your ERPNext version, TRA/VFD registration and device details, tax mapping and branch topology — not from the day you enquire. Wider scope such as multi-company, POS lanes or a middleware layer is quoted separately.
Frappe/ERPNext v15 and v16. We build and test against the version you actually run and pin the app branch to it. If you are mid-upgrade, say so on the scoping call and we will target the version you will be on at go-live.
The `TRA Fiscal Document` moves to a `Failed` state with the TRA error code and message parsed onto named fields, the linked Sales Invoice shows a clear indicator, and an authorised user can correct the underlying data and trigger a retry. An hourly scheduler job ages anything that stays unresolved into an exception report, so nothing is silently lost.
Deliberately not. Once a Sales Invoice holds a successful fiscal receipt, an `on_cancel` guard blocks cancellation and directs you to raise a credit note instead — the correct treatment for a document TRA has already seen. Invoices that failed or were never fiscalized cancel normally.
A post-go-live support window covering defect fixes runs through your first full VAT period on the new flow. Beyond that we offer an annual support and maintenance agreement covering TRA specification changes, ERPNext version compatibility and enhancements. You also receive the git repository, so your own team can maintain the source if you prefer.
Not until UAT is signed off. We build and test against a staging copy, run acceptance with your finance team on real invoice shapes, and only then perform the production install — with a site backup taken first and a documented rollback plan in hand.

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 fiscalizes ERPNext Sales Invoices against Tanzania Revenue Authority EFD/VFD requirements, returning the fiscal receipt number, verification code and QR back onto the invoice. ECOSIRE builds, installs and supports it for your ERPNext v15/v16 site after a scoping call.