ETA returned 202: why your e-invoice is not filed yet
TechnoVision
24 September 2026 · 8 min read
You submitted an invoice to the Egyptian Tax Authority (ETA). The API answered 202 Accepted. Your ERP marked it green. Three days later your accountant tells you the invoice shows as Invalid on the ETA portal and the customer cannot see it.
Nothing went wrong in the network. Nothing crashed. The problem is simpler and more common than that: 202 is not "filed". 202 is "we received your package". This article explains what actually happens after that 202, why documents turn Invalid hours later, and what to check when they do.
The short answer
The ETA e-invoicing API is asynchronous. When you call Submit Documents, the platform runs only a minimal set of checks and returns HTTP 202 Accepted before validation has finished. The SDK says this in plain words: the API returns 202 "given that the process of validation is not complete when result is returned".
So a 202 tells you three things, and only three:
- Your request was structurally readable.
- Your credentials were accepted for this taxpayer.
- The platform has queued the documents for full validation.
It does not tell you the invoice is valid, that the customer will receive it, or that it counts as a filed tax document.
What "accepted" means inside the 202 body
Even within a single submission, individual documents can be accepted or rejected immediately. The response body contains:
submissionUUID– an identifier for the whole batch.acceptedDocuments[]– each with auuid, alongId, and yourinternalId(usually the Odoo invoice number).rejectedDocuments[]– documents that failed the synchronous checks, with an error object.
A document in acceptedDocuments has a UUID. It still has no verdict. That comes later.
The document lifecycle after 202
Every document the ETA accepts moves through a status. The Get Document Details API lists five:
| Status | Meaning | What you should do |
|---|---|---|
| Submitted | Received, full validation still running | Wait, then poll or handle the notification |
| Valid | Passed every validation step; the invoice is now a tax document | Store the UUID and long ID; print the ETA reference on the PDF |
| Invalid | Failed one or more validation steps | Read validationResults, fix the data, issue a corrected document |
| Rejected | The receiver (your customer) rejected it | Talk to the customer; issue a credit note or new invoice as appropriate |
| Cancelled | You, the issuer, cancelled it | Replace it if a sale still exists |
Only Valid means filed. Everything else is unfinished business.
The time between Submitted and a final verdict is not fixed. In practice it is often minutes, but it can be longer during busy periods or after platform maintenance. Do not assume a document is fine because ten minutes passed quietly.
Why documents turn Invalid after a 202
The asynchronous phase runs the full "validation equation". The response for an Invalid document includes validationResults with a list of validationSteps; each step has a name, a status and, if it failed, an error block. These are the steps that most often fail for Egyptian Odoo users.
1. Item codes that are not approved yet
Every invoice line needs a codeType of GS1 or EGS and an itemCode. The step is literally named things like "GS1 code validator". Typical causes:
- You created an EGS code in the portal but the ETA has not approved it yet. GS1 Egypt's guidance describes an approval window of up to 15 days for EGS codes; check the current ETA guidance for today's timing.
- The code was approved for a different tax registration number (a sister company, or a branch registered separately).
- The code was typed with a different prefix or a trailing space in Odoo.
Fix: look up the code on the ETA portal, confirm its status is Approved for this taxpayer, then correct the product in Odoo and re-issue.
2. Totals that do not add up to five decimals
ETA totals are compared with five decimal places. Odoo stores amounts with the currency's rounding (two decimals for EGP) and computes tax per line and then per group. When a discount or a multi-tax line is involved, the sum of your salesTotal, netTotal, taxTotals and totalAmount can be off by 0.00001, and the arithmetic validator fails.
Fix: the document builder must recompute the ETA totals from the line values it actually sends, not copy Odoo's rounded fields. If you are building your own integration, test with a line that has a percentage discount, a quantity of 3, and a unit price ending in .33.
3. Receiver information missing above the threshold
For a natural-person receiver (type P), the ID, name and address are optional only when the invoice amount is below the threshold defined by law. Above it, the buyer's national ID and name must be present. The threshold has changed over the years, so check the current ETA guidance rather than hard-coding a number.
Fix: make the customer form in Odoo require the national ID when the invoice total crosses the threshold, before the invoice is posted.
4. Date issues
dateTimeIssued must be in UTC and cannot be in the future. An Odoo server set to Cairo time that sends local time as if it were UTC will produce a document dated two or three hours in the future, which fails.
Fix: convert to UTC explicitly when building the document; do not rely on the server's default timezone.
5. Activity code, branch or address mismatches
The issuer's activityCode must be one of the taxpayer's registered tax activity codes, and the branchID must match a branch registered with the ETA. A new branch added in Odoo but not in the taxpayer profile will fail.
6. Signature problems
The signature is a CAdES-BES signature made with a certificate on a USB token or HSM. Common failures: the signed content includes fields that should be excluded, the certificate expired, or the document was modified after signing (for example, a serialisation step that reorders keys). The error usually references the signature validator step.
Errors that are not 202 at all
Sometimes the problem shows up before any 202. It helps to recognise these because they need different fixes:
| HTTP | Code | Meaning |
|---|---|---|
| 400 | BadStructure | The JSON does not match the schema |
| 400 | MaximumSizeExceeded | The submission is larger than the allowed size |
| 403 | IncorrectSubmitter | Credentials do not belong to this taxpayer or intermediary |
| 403 | Forbidden | The taxpayer profile is restricted |
| 422 | DuplicateSubmission | Identical submission sent again within ten minutes |
A DuplicateSubmission is worth a special mention: an integration that retries automatically on a network timeout can trigger it. The correct behaviour is to look up the earlier submission by submissionUUID before sending again.
A checklist for handling 202 correctly in Odoo
Whether you build your own module or buy one, the integration should do the following.
- Store the
submissionUUIDand each documentuuidon the invoice at the moment of the 202. - Set the invoice's ETA status to "Submitted", not "Sent" or "Done". Language matters to your accountants.
- Poll Get Document Details (or receive the ETA notification) until the status is Valid, Invalid, Rejected or Cancelled.
- Show
validationStepson the invoice form, unfiltered. A message like "ETA error" is useless; "GS1 code validator: code 6221234567890 not found" is actionable. - Block printing the ETA reference on the PDF until status is Valid.
- Never auto-retry a submission on a timeout; look up the original submission first.
- Keep the exact signed JSON you sent. When an accountant asks "what did we send?", you need the answer.
How to check status by hand today
If you need to know right now whether a specific invoice is filed:
- Log in to the ETA invoicing portal (production, or preprod if you are testing).
- Open Documents and search by your internal ID (the Odoo invoice number) or by the document UUID.
- Read the status column. If it says Invalid, open the document and read the validation results.
- If the document is Valid, copy the UUID back into Odoo if your integration did not do it for you.
Fixing an Invalid document
An Invalid document is not a filed document, so you do not cancel it; you issue a corrected one. The usual sequence in Odoo:
- Fix the root cause (product code, customer ID, date handling, totals).
- Regenerate the ETA document from the same posted invoice. Most integrations allow re-submission of an Invalid document because the ETA never accepted it as a tax document.
- Submit again and follow the status until Valid.
If the invoice itself was wrong (price, quantity, customer), issue a credit note and a new invoice in Odoo so your books match what the ETA holds.
Before your next submission, run the pre-filing checklist.
Frequently asked questions
Does 202 mean my invoice was accepted by the ETA?
No. 202 means the submission was received and queued. The verdict arrives later as a status of Valid or Invalid. Only Valid documents are considered filed.
How long does the ETA take to validate an invoice?
The SDK does not commit to a fixed time. In practice it is often minutes, but delays happen. Poll the document status or consume the ETA notification rather than assuming.
Why is my invoice Invalid because of item codes when I registered them?
Most often the EGS code is still awaiting ETA approval, or it was approved under a different tax registration number. Check the code's status on the portal for the exact taxpayer that issued the invoice.
Can I resubmit an Invalid invoice?
Yes. An Invalid document was never accepted as a tax document, so you correct the data and submit again. Do not cancel it; cancellation applies to Valid documents.
If you'd rather not build this yourself