Egypt ETA e-Invoice
by TechnoVision · Odoo App
Build the document, validate it locally where failing is free, sign it through your eSeal service, submit, then poll until the Authority actually says Valid. Rejection reasons are shown in ETA own words, because paraphrasing a tax authority leaves you searching their documentation for a string that does not exist.
One-off licence per Odoo instance. The store bills in its own base currency, so checkout may differ by a few cents. That is the add-on price. Installation and support are optional and priced separately.
Security Center
Live82
Score
1.2k
Events / 24h
3
Alerts
Export volume · 14 days
Unusual export detected
res.partner · 4,812 rows · outside business hours
Illustrative UI. Product screenshots to be dropped into this frame.
What it does
ETA validates after it answers, and a document that got a 202 can still come back Invalid. This module records Submitted and polls until the Authority returns Valid, Invalid or Rejected. Any integration that treats 202 as success will eventually tell an accountant a tax document is lodged when it is not - and they find out at the end of the period.
Missing item codes, a business receiver with no tax registration number, totals that disagree with the lines - all caught before anything leaves your server. Finding them here costs a field; finding them at the Authority costs a filing.
An accountant presses the button. A filed document cannot be unfiled, and a module that submitted on validation would file every draft mistake somebody posted - after which the fix is a credit note and a conversation.
Shown verbatim rather than paraphrased. Paraphrasing a tax authority error message leaves you searching their documentation for a string that does not exist.
Amounts re-derived at five places rather than copied from Odoo two-decimal rounding, with the unit price rounded before it is multiplied - because that is the order the Authority recalculates in, and the document has to agree with itself.
A connection refuses to be set to Production while its URLs still point at a pre-production address. Both directions of that mistake are expensive and neither announces itself: filing against production while you believe you are testing, or filing nothing while you believe you are live.
Pricing & Services
The add-on licence is the product. Installation and a support plan are separate, optional, and neither is added to anything unless you choose it. The licence is bought into your own account, so you own it outright whether or not you ever buy a service from us.
The module, bought from the Odoo Apps Store into your own account.
$125
one-off, per Odoo instance · paid to the Odoo Apps Store
An eSeal certificate on a token, a local signing service, and code mappings on every product, unit and tax.
$599
one-off · paid to TechnoVision
Twelve months of updates and help with the module, on top of what every licence already includes.
$360
per 12 months · paid to TechnoVision
A support plan adds to what you already have. It never replaces it: defect fixes and help with the module stay free for every licence holder, plan or no plan.
Supported: Odoo 18 and 19, Community and Enterprise. Licensed per Odoo instance, with no user limit and no expiry. Prices exclude any tax that applies where you are, and we tell you before you pay if any is due.
Demo
Recorded from a running Odoo 18 with real records. No slides, no mock-ups, and nothing sped up.
Screenshots
3 captures of the shipped product: documents built for eta, one document, the connection.

Documents built for ETA

One document

The connection
How it works
Pre-production files nothing. Stay there until you have seen a document come back Valid.
On the records your accountant already keeps, not in a separate mapping table nobody maintains. ETA rejects a line without them.
Local validation runs first and costs nothing to fail. The Document tab holds the JSON exactly as it will be submitted.
The signing service holds the eSeal. Submission gives you a 202 and a UUID; the scheduled job polls until ETA says Valid, Invalid or Rejected.
FAQ
No call has ever been made to the Egyptian Tax Authority from this module - there is no ETA-issued Client ID or eSeal certificate on our development account, so nothing has reached a real ETA environment, not even pre-production. The suite runs against a mock ETA service: a real HTTP server, not a patched library, so a 202 carrying rejections, an expired token and a timeout are exercised faithfully. We would rather say so here than have you find out after paying.
ETA requires a CAdES-BES signature from an eSeal certificate, and that certificate lives on a USB token or HSM from an accredited Egyptian provider - it is hardware on purpose, and Odoo cannot hold it. ETA own signing toolkit also runs outside the ERP. The shape is fixed by the Authority, not chosen by us, and there is no version of this integration without it.
No, and it will not be made to. A filed document cannot be unfiled, and submitting on validation would file every draft mistake somebody posted.
ETA works to five decimal places and recomputes from the document, so the document has to agree with itself under ETA arithmetic. One limit remains: if you need genuine five-decimal unit prices, raise Odoo own Product Price precision - no module can recover precision Odoo has already discarded.
Customer invoices, credit notes and debit notes, at document version 1.0. Vendor and export documents are not built, and other document versions are not claimed.
No - that is Egypt ETA e-Receipt, a separate module. A receipt has a different endpoint, a different body wrapper, different line field names and a per-device chain. A shared builder would produce a document each endpoint rejects.
Not yet. longId is captured, which is what a QR code encodes, but the report is not extended.
The module itself, for one Odoo instance, with no user limit and no expiry; every 18.0 release of the module, including security fixes; the module documentation, in the module and on this site; and defect fixes and help with configuration, at no extra cost and with no support plan required. It is a one-off licence for one Odoo instance, with no user limit and no expiry. It does not include installation on your instance, and configuration against your data; changes to the module for your own requirements; migration of the module or your data to another Odoo series; and work on your Odoo, your server, your network, or on other vendors’ modules.
No, and it is not hidden in the price either. Installation and configuration is a separate, optional service at $599 one-off. It covers remote installation on your instance; credential and endpoint configuration for the external service; and compatibility verification against your Odoo version and edition. If you or your partner install Odoo modules already, buy the licence on its own and skip it — most buyers of a module this size do.
Odoo 18 and 19, on Community and Enterprise. We do not claim a series until there is a branch for it, its tests pass on that series, and somebody has run it there — so the list on this page is what is actually supported rather than what is planned.
Twelve months of module updates, including security fixes; configuration support by email; priority handling: your ticket is looked at before unpaid enquiries; and help reproducing and reporting a defect, and a fix or a workaround. It runs for twelve months at $360 and is bounded by stated limits rather than by the word "reasonable": Up to 10 support requests in the twelve months; up to 4 hours of remote assistance in total; one Odoo minor-version upgrade of the module, within the same series; response within 2 business days, Sunday to Thursday, Cairo time; and covers the module. It does not cover your Odoo, your server, your network, or work on other modules.. The plan runs for 12 months from the day it starts and then stops. It renews only if you ask us to renew it — nothing renews automatically and no card is stored. It does not cover your Odoo, your server, your network, your backups, or other vendors’ modules; custom development or changes to how the module behaves; migration to another Odoo series — 18.0 to 19.0 is a project, not a ticket; on-site attendance, and work outside the hours below; and anything an external vendor charges for.
No, and this is the line worth being clear about. Defect fixes, at no charge, for the life of the 18.0 series; help when the module does not behave as its description says it does; answers to configuration questions about the module itself; and security fixes, released to everyone whether or not they hold a support plan — all of that comes with the licence, for every buyer, at no extra cost and whether or not a plan is ever bought. A paid plan adds updates, priority over unpaid enquiries and an allowance of assistance hours on top. It never takes anything away.
No, in any of the three options. A change to how a module behaves, a migration between Odoo series, and connecting a system we do not publish a connector for are each their own piece of work, quoted on their own. They are listed as exclusions on the cards rather than left to be discovered: they are the three things buyers most often assume are covered.
Use the buttons in the Pricing & Services section above. Both have a price, so the button takes you to a short form, shows you the total and what it covers before you commit, and creates a numbered order we reply to. No card details are taken on this site, and nothing is added to anything unless you choose it.
Install from Odoo Apps, or talk to us about a guided rollout across multiple companies.