Troubleshooting
What goes wrong with Egypt ETA e-Invoice, how to recognise it, and what to do.
Test Connection fails
It checks the credentials and the signing service separately, so the message tells you which half is wrong.
Authentication failed — Client ID or Secret. They come from the ETA taxpayer portal, and they are environment-specific: pre-production credentials do not work against production.
Cannot reach the identity service — the Identity Service URL, or a firewall between Odoo and it.
Signing service unreachable — your local eSeal service is not running, or the URL is wrong. This is a separate process holding the token; Odoo cannot sign without it.
It will not let me switch to Production
The connection refuses Production while its URLs still point at a pre-production address.
Change the Identity Service URL and API URL to the production ones ETA issued, then switch. The guard exists because both directions of this mistake are expensive: testing against production files documents you cannot withdraw, and "filing" against pre-production files nothing while you believe otherwise.
Local validation rejects my invoice
That is it working, and it costs nothing — nothing has been sent.
| Message | Fix |
|---|---|
| Missing item code | Put an ETA item code on the product |
| Missing unit code | Put a unit code on the unit of measure |
| Receiver has no tax registration number | Add it to the customer |
| Totals disagree with the lines | Usually a rounding or precision issue — see below |
Totals disagree with the lines
ETA recalculates from the document, so the document has to be internally consistent under ETA's arithmetic: five decimal places, unit price rounded before multiplying.
If the difference is fractions, it is almost always Odoo's Product Price decimal precision being too low. Raise it in Settings → Technical → Decimal Accuracy. This module cannot recover precision Odoo has already discarded.
Submission returned 202 but the status never becomes Valid
202 means received, not filed. The real answer comes from polling.
Check ETA: refresh pending document status is active under Settings → Technical → Scheduled Actions. Without it, documents sit at Submitted indefinitely.
If the job is running and the status is not moving, ETA has not finished validating. That is normal and can take time.
The document came back Invalid or Rejected
Read the reasons on the document — they are shown verbatim, in ETA's own words, because paraphrasing a tax authority's error leaves you searching their documentation for a string that does not exist.
Correct the invoice, build a new document, submit that. The rejected one keeps its record of what was sent and why it was refused.
Signing fails
The signing service holds the certificate; Odoo does not. Check, on the host running it:
- Is the service running?
- Is the USB token or HSM connected and unlocked? A token that has locked itself after failed PIN attempts looks the same as one that is absent.
- Has the certificate expired? eSeal certificates have an expiry and it arrives without warning.
There is no software-only fallback and there cannot be — the whole point of the eSeal is that the key is in hardware.
The access token expires mid-run
It should not: tokens are refreshed before expiry rather than after a call fails. If you are seeing 401s, the more likely cause is the wrong environment's credentials.
A document was submitted twice
Duplicate submission is detected and covered by the test suite. If you see two submissionUUID values for one invoice, send us the document record.
I cannot see the Document tab
It is restricted to an ETA Administrator. The raw payload contains the whole document, including the customer's tax registration number and every line.
Vendor bills have no ETA button
Only customer invoices, credit notes and debit notes are built. Vendor documents and export documents are not implemented.
POS receipts are not appearing
They are not part of this module. Install technovision_eta_ereceipt — a receipt has a different structure, a different endpoint and a per-device chain, so it is not an invoice with a new label.