Installation
What Egypt ETA e-Invoice requires, how to install it, and how to check the install worked.
Requirements
- Odoo 18.0, Community or Enterprise
- Invoicing (account)
- From ETA, issued when your ERP is registered: a Client ID, a Client Secret and the base URLs
- From an accredited Egyptian provider: an eSeal certificate on a USB token or HSM
- A local signing service running ETA's own signing toolkit
The last two are not optional and cannot be engineered away. See below.
Install
- Put technovision_eta_einvoice in your addons path.
- Update the apps list and install Egypt ETA e-Invoice.
- Egypt ETA → Configuration → Connections → New.
The signing service, and why there is one
ETA requires a CAdES-BES signature made with an eSeal certificate. Two facts follow from that, and neither is a choice we made:
- The certificate lives on a USB token or HSM issued by an accredited Egyptian provider. Odoo cannot hold it. It is hardware, deliberately, and that is the point of it.
- ETA's own signing toolkit runs outside the ERP — a Docker container, a NuGet library or a CLI.
So the shape is fixed by the Authority: Odoo builds the document, a small local service holding the token signs it, Odoo submits.
This module says so plainly rather than failing mysteriously when the service is not configured. If you were hoping to avoid it, there is no version of this integration that does.
Set up the connection
Egypt ETA → Configuration → Connections
| Setting | Where it comes from |
|---|---|
| Identity Service URL | Issued by ETA on registration |
| API URL | Issued by ETA on registration |
| Client ID / Client Secret | ETA taxpayer portal |
| Registration Number | Your tax registration number |
| Activity Code | Your ETA taxpayer profile |
| Branch ID | 0 for head office unless ETA assigned one |
| Signing Service URL | Your local eSeal signing service |
Start in pre-production
Pre-production files nothing. Use it until you have seen a document come back Valid.
The connection refuses to be switched to Production while still pointing at a pre-production address, which stops the most expensive version of this mistake: believing you are testing while filing real documents, or believing you are filing while testing.
Map your codes
ETA rejects a line without them, so this is not optional either:
| Map | On |
|---|---|
| ETA item code | Each product |
| Unit code | Each unit of measure |
| Tax type | Each tax |
They go on the records your accountant already keeps, not in a separate mapping table nobody maintains.
Check the install worked
- Post a customer invoice for a product with an ETA item code.
- Build the ETA document from the invoice.
- Open it and look at the Document tab — the generated JSON is there.
- Local validation runs at build time. If something is missing it tells you before anything is sent, which costs nothing.
You can get this far with no ETA credentials at all. Submission is the step that needs them.
Give somebody the groups
| Group | Can |
|---|---|
| ETA User | Build documents, submit, read status |
| ETA Administrator | Connections, credentials, the raw payload |
The scheduled action
ETA: refresh pending document status polls submitted documents until the Authority returns a final answer. Settings → Technical → Scheduled Actions.
Without it, documents stay at Submitted forever — which, as the next section explains, is not the same as being filed.
Filing is never automatic
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.
Upgrading
Upgrade normally. Documents, their UUIDs and their status history are preserved.
Uninstalling
Removes connections, documents and the code mappings. Documents already filed with ETA stay filed — uninstalling an Odoo module does not withdraw a tax document. Export the UUIDs first if you need them.