Skip to main content
Zambia Smart Invoice Compliance for Odoo — A build-to-order Odoo module that fiscalises your customer invoices and credit not — 1/1Illustrative preview

A build-to-order Odoo module that fiscalises your customer invoices and credit notes through the ZRA Smart

Invoice device/API flow, directly from `account.move`. ECOSIRE scopes, builds, installs and supports it for your Odoo 17.0, 18.0 or 19.0 database.

What is Zambia Smart Invoice Compliance for Odoo?

A build-to-order Odoo module that fiscalises your customer invoices and credit notes through the ZRA Smart Invoice device/API flow, directly from `account.move`. ECOSIRE scopes, builds, installs and supports it for your Odoo 17.0, 18.0 or 19.0 database. 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

New `zra.smart.invoice.config` model holding per-company endpoint, device/terminal identifiers, taxpayer and branch codes, and environment (sandbox vs production) with credentials stored outside version control
`account.move` extended with fiscal state, submission and acceptance timestamps, returned fiscal/invoice number, verification payload and a link to the originating document for credit notes
Submission decoupled from posting: `action_post()` enqueues a job (or `ir.cron` batch, chosen at scoping) so a slow or unreachable ZRA endpoint never blocks a user or rolls back a journal entry
Explicit tax-mapping model translating `account.tax`, fiscal position, product category and UoM into the classification codes the regime expects — maintained by accountants, not hard-coded in Python
Idempotent transmission keyed on the move, so a retry, a cluster worker duplicate or a manual resubmit can never fiscalise the same invoice twice
Full request/response archive: every payload sent and every authority response stored verbatim on an immutable submission log, retained for the statutory period
QWeb report inheriting your existing `account.move` invoice template to print the fiscal number, verification QR code and statutory wording without replacing your layout
Rejection workflow: rejected documents enter a distinct state with the authority's reason code on the form, an `mail.activity` raised for the responsible user, and a guarded correct-and-resubmit or credit-note path
Credit notes and debit notes carry the reference to the original fiscalised document, so reversals are traceable end to end
Compute fields with `@api.depends` derive fiscal totals from `account.move.line` rather than storing a second set of numbers that can drift from the accounting entries
Security via `ir.model.access.csv` plus record rules — resubmission, override and configuration restricted to nominated finance roles; company record rules for multi-company groups
List and form views with a fiscal-status filter, plus a search view and dashboard so finance can see at a glance which posted invoices are not yet fiscalised
XML-RPC/JSON-RPC endpoints so POS, e-commerce or an external billing system can trigger and query fiscalisation from outside Odoo
Structured logging and an automated action that flags any document posted beyond a configurable age without an accepted fiscal response

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

Finance teams invoicing in Zambia face a problem Odoo core does not solve: an invoice is not legally complete when it is posted in the ERP. It becomes valid only once it has been transmitted to the Zambia Revenue Authority's Smart Invoice service, accepted, and returned with its fiscal identifiers so the printed document can carry them. Out of the box, account.move knows nothing about that round trip. Teams bridge the gap by hand — re-keying every invoice into a separate Smart Invoice client, exporting spreadsheets at month end, or building fragile scripts on top of the JSON-RPC API. The results are predictable: mismatched totals between the ERP and the fiscal record, invoices that were posted but never fiscalised, credit notes with no traceable link to the original document, and an audit trail that lives in two systems that were never reconciled.

We build a dedicated Odoo module that makes fiscalisation a first-class part of the invoicing workflow. The module extends account.move and account.move.line with the fields the regime actually needs — fiscal status, submission and response timestamps, the returned invoice number and verification data, the reference to the original document on a credit note — and models the ZRA transport as its own object so device/API credentials, endpoints and the branch or taxpayer identifiers are configured per company rather than hard-coded. Posting an invoice raises a submission record; a queued job (or an ir.cron on smaller installations, your choice at scoping) handles transmission, retries and the response, so a slow or unavailable endpoint never blocks a user's action_post(). Tax treatment is derived from your existing master data — account.tax, fiscal positions, product categories and UoM — through an explicit mapping model rather than guesswork, so the classification a document carries is auditable and changeable by an accountant instead of a developer.

One posting produces both required outputs. The machine payload is assembled from the same lines that produce the human-readable document, so the two can never diverge: a QWeb report inheriting your existing invoice template renders the fiscal number, verification QR code and any statutory wording, while the transmitted payload is stored verbatim alongside the response. Rejections are treated as a workflow, not an error log — a rejected document lands in a dedicated state with the authority's reason code surfaced on the form, an activity raised for the responsible user, and a guarded correction path that either amends and resubmits or issues a properly linked credit note, with every attempt retained. Access is governed through ir.model.access.csv plus record rules so only the finance roles you nominate can resubmit or override, and every state change is written to the chatter and to an immutable submission log for archiving.

The module targets Odoo 17.0, 18.0 and 19.0 and is built against your edition. It depends only on account and standard framework services, so it works on Community; where you run Enterprise we use the accounting features you already have (bank reconciliation, follow-up, consolidated reporting) rather than duplicating them. Multi-company and multi-branch setups are handled through company-scoped configuration, and integration points are exposed over XML-RPC/JSON-RPC where a POS, e-commerce front end or third-party billing system needs to trigger fiscalisation from outside Odoo.

This is build-to-order, not a marketplace download. We start with a short scoping call to confirm your ZRA registration model, the document types in scope, your tax mapping and your Odoo version and edition. From there we write the manifest and models, build against a copy of your database, and deliver typically one working week from confirmed scope. You get the installable source for your version, a staging deployment for UAT, a documented rollback, training for the finance team, and a post-go-live support window — plus the git repository, so the code is yours to keep and extend.

What you get

  • Installable module source built for your exact Odoo version (17.0, 18.0 or 19.0) and edition, with a complete `__manifest__.py` and clean dependency declaration
  • Installation and configuration on your environment, including ZRA endpoint/device setup, company and branch identifiers, and the initial tax mapping
  • Technical documentation: data model, field reference, submission and retry lifecycle, mapping rules, and the RPC integration surface
  • End-user guide plus a live training session for the finance team covering daily fiscalisation, rejection handling and correction workflow
  • UAT on a staging copy of your database with a scripted test pass and a documented rollback plan before any production change
  • Post-go-live support window for defect fixes and configuration adjustments after the module is in production use
  • Git repository handover with full commit history, so your team or any other partner can maintain and extend the code
  • Handover session with your Odoo administrator covering upgrade considerations, log locations and operational monitoring

Who this is for

Finance Manager / Financial Controller

Owns the accuracy of the ledger and the relationship with ZRA. Needs certainty that every posted customer invoice has been fiscalised, that rejections are visible the day they happen rather than at month end, and that the ERP totals and the fiscal record reconcile without a spreadsheet.

Accounts Receivable / Billing Team Lead

Runs day-to-day invoicing and credit notes. Wants fiscalisation to happen inside the invoice they already work in — no second system to re-key into — with a clear correction path when a document is rejected and no risk of accidentally sending the same invoice twice.

Odoo Administrator / Internal IT Lead

Maintains the Odoo instance and is accountable for upgrades. Needs a module that depends only on standard `account` behaviour, keeps credentials out of the repository, logs enough to diagnose a failed transmission, and comes with source they can read and maintain.

Group CFO / Head of Compliance (multi-entity)

Oversees several Zambian entities or branches on one database. Needs per-company configuration and record rules, consistent tax mapping across entities, and a retained, exportable audit trail of every submission and response for internal and external audit.

How Zambia Smart Invoice Compliance for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
ZRA Smart Invoice transmissionBuilt into the posting workflow, queued and retried, with idempotency so no invoice is sent twiceAchievable, but the retry/idempotency design is where in-house builds usually get it wrongGeneric e-invoicing connectors rarely cover the Zambian device/API flow specificallyNot present — Odoo core has no concept of fiscalisation
Tax classification mappingExplicit mapping model over your `account.tax`, fiscal positions, product categories and UoM, editable by accountantsOften hard-coded in Python, so every rate change becomes a developer ticketFixed assumptions about your chart of accounts that may not match yoursOdoo taxes exist but carry no fiscal classification codes
Rejection handlingDedicated state, authority reason code on the form, activity raised, guarded correct-and-resubmit or linked credit noteTypically a log line and an email; correction handled manuallyUsually surfaces an error; the workflow around it is left to youNo concept of an externally rejected document
Audit trail and archivingImmutable submission log storing every payload and response verbatim, plus chatter, retained for the statutory periodDepends entirely on what the developer chose to store — often the response onlyVaries widely; frequently keeps status but not the payloadChatter tracks accounting changes, nothing about fiscalisation
Printed documentQWeb report inherited from your existing invoice template, adding fiscal number, QR and statutory wordingCommon approach is to replace the template, which breaks your branding and other customisationsShips its own layout that you then have to re-brandStandard invoice PDF with no fiscal identifiers
Fit to your Odoo version and editionBuilt and tested against your exact 17.0/18.0/19.0 database and edition, Community or EnterpriseFits by definition, but the version-upgrade path is your problem aloneListed for a version range; behaviour on your customised database is unverified until installn/a
Time and cost to get liveTypically one working week from confirmed scope, fixed quotation, UAT on staging with a rollback planLonger — specification, build, and the regime research your team has not done yetFast to install, slow to reconcile once the assumptions do not match your dataImmediate, but the compliance work stays manual
Ownership and maintenanceFull source plus git repository handed over; support window included, ongoing support optionalYou own it and you maintain it, including the key-person riskVendor-controlled; you depend on their release cadence for regime changesMaintained by Odoo, but never covers this requirement

Frequently Asked Questions about Zambia Smart Invoice Compliance

How long does delivery take?

This is a build-to-order module, not an instant download. Typical delivery is one working week from confirmed scope. The clock starts once we have agreed the document types in scope, your tax mapping, your ZRA registration and device/API details, and your Odoo version and edition on a scoping call. Larger multi-entity or POS-integrated builds can run longer, and we tell you that before you commit, not afterwards.

What support and updates come with it?

Delivery includes a post-go-live support window for defect fixes and configuration adjustments — the exact length is agreed in your quotation. After that, ongoing support and version-to-version upgrades (for example moving the module from 18.0 to 19.0, or adapting to a change in the ZRA specification) are handled under a support agreement or as a scoped change. Because you receive the git repository, you also retain the option to maintain it in-house.

Which Odoo versions and editions are supported?

We build for Odoo 17.0, 18.0 and 19.0, on Community or Enterprise. The module depends on the standard `account` module and framework services only, so it does not require Enterprise. Where you already run Enterprise accounting features, we integrate with them rather than duplicating them. We build against your specific version — we do not ship one branch and hope it loads on another.

Will it work alongside our existing invoice layout and customisations?

Yes — that is part of scoping. The printed fiscal data is added by inheriting your existing `account.move` QWeb report rather than replacing it, and the model extensions are additive fields and methods on `account.move`/`account.move.line`. If you already have customisations touching invoice posting, we review them on the copy of your database we build against, so conflicts surface during development instead of on go-live day.

What happens when ZRA rejects an invoice, or the service is unavailable?

Neither blocks your finance team. Transmission runs outside the posting transaction, so an unreachable endpoint means the invoice is posted and queued, with automatic retries. A rejection puts the document into a dedicated state with the authority's reason code shown on the form and an activity assigned to the responsible user; from there you either correct and resubmit or issue a linked credit note. Every attempt, payload and response is retained.

Can it fiscalise invoices raised outside Odoo — POS, e-commerce, or another billing system?

Yes, subject to scoping. We expose the submission and status calls over Odoo's XML-RPC/JSON-RPC API so an external system can trigger fiscalisation and read back the result. If the volume or shape of that traffic is significant, tell us on the scoping call — it changes how we design the queue and the idempotency keys, and we would rather design for it than bolt it on.

Do we own the code?

Yes. You receive the full source and the git repository with commit history at handover. There is no runtime licence check that can disable the module, and no dependency on us to keep it running. We would like to be your support partner; you are not obliged to make us one.

Request a quote

Zambia Smart Invoice Compliance

A build-to-order Odoo module that fiscalises your customer invoices and credit notes through the ZRA Smart Invoice device/API flow, directly from `account.move`. ECOSIRE scopes, builds, installs and supports it for your Odoo 17.0, 18.0 or 19.0 database.

  • New `zra.smart.invoice.config` model holding per-company endpoint, device/terminal identifiers, taxpayer and branch codes, and environment (sandbox vs production) with credentials stored outside version control
  • `account.move` extended with fiscal state, submission and acceptance timestamps, returned fiscal/invoice number, verification payload and a link to the originating document for credit notes
  • Submission decoupled from posting: `action_post()` enqueues a job (or `ir.cron` batch, chosen at scoping) so a slow or unreachable ZRA endpoint never blocks a user or rolls back a journal entry
  • Explicit tax-mapping model translating `account.tax`, fiscal position, product category and UoM into the classification codes the regime expects — maintained by accountants, not hard-coded in Python

Request a Quotation

Tell us about your Zambia Smart Invoice Compliance 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.