UAE E-Invoicing (PINT AE) for Odoo 19 Community documentation
A guide to UAE E-Invoicing (PINT AE): identifiers and tax categories, the readiness checklist and the batch check, the validation of the files and the official Schematron, the outbox, the statuses given by your ASP, the XML and ZIP export, and what is not implemented or not verified.
Documents version 1.0.0Updated Oct 29, 2026
Start here
Who it is for: companies in the United Arab Emirates that run their invoicing in Odoo 19 and must prepare e-invoices for their ASP, and the accountants and partners who set them up.
The examples: the pictures show a demo company, Al Noor General Trading LLC in Dubai, in AED. Its names, TRNs and licence numbers are fictitious and only have the right format. It has eleven customer invoices and one credit note from 14 September to 29 October 2026; the documents were prepared on 30 October 2026 by Amira Saleh (administrator). The ASP is shown as Your appointed ASP and its answers were typed by hand: nothing was sent anywhere. The figures in the text are those of the pictures.
What you get
| Feature | What it does |
|---|---|
| PINT AE XML | Customer invoices (type 380), credit notes (381) and fully out-of-scope documents (480 / 81) in the PINT AE Billing 1.0.4 format (UBL 2.1). |
| Identifiers | TIN, TRN, e-invoicing address and legal registration (trade licence, Emirates ID, passport, cabinet decision) on the company and the customers; emirate codes from the address. |
| Tax categories | S, Z, E, O and AE on the sale taxes, with the exemption reason and the reverse charge goods type; pre-set on the UAE taxes of Odoo. |
| Readiness checklist | About 45 checks on each invoice before any file is made: document, credit note, seller, buyer, export, payment, lines and taxes, the 14 business days estimate. |
| Batch check | The same checks for a period or a selection of invoices, with the list of problems and a button to generate the ready ones. |
| Local validation | Every file is checked against the official OASIS UBL 2.1 XSD (shipped) and, when you install it, the official PINT AE Schematron. |
| Four results | Valid, Valid with warnings, Invalid, Not fully validated. Never more than what really ran. |
| Outbox | One record per invoice with its status (draft, ready, sent, accepted, rejected, error), the ASP reference, the dates, the SHA-256 of the file, the validation log and a log nobody can edit. |
| Statuses by hand | A manager records what the ASP answered; only allowed changes, a reference format check, a reason for a rejection or an error. |
| Downloads | The XML of one document, or a ZIP of many with a manifest.json; an integrity check of the stored file. |
| Connector hook | A documented place for a future ASP connector. No ASP connector is included. |
| Arabic | The module is translated; the screens work right to left. |
Requirements
| Item | Details |
|---|---|
| Odoo | 19.0 (Community or Enterprise) |
| Apps needed | Invoicing / Accounting (account), Import/Export electronic invoices with UBL/CII (account_edi_ubl_cii) and United Arab Emirates - Accounting (l10n_ae). They are installed with the module when missing. |
| License | OPL-1 (Odoo Proprietary License v1.0) |
| Item | What it needs |
|---|---|
| Company | A company in the United Arab Emirates with the UAE chart of accounts and taxes (l10n_ae), a TRN in the Tax ID field and an emirate on its address. |
| Customers | A TRN or TIN, an address with an emirate (or a state / region abroad), and the e-invoicing address when it is not the automatic one. |
| Official Schematron (optional) | The PINT AE validation files of OpenPeppol, downloaded or uploaded by a manager from the module. They are not included in the package. |
| saxonche (optional) | The Python package saxonche (SaxonC-HE, an XSLT 2.0 engine) on the Odoo server, to run the Schematron: pip install saxonche in the Python of Odoo. Without it, files are checked with the XSD only and show Not fully validated. |
| An ASP | A contract with an Accredited Service Provider. The module prepares the files for it; it does not replace it. |
Install
- Unzip the package. Inside is
taqnix_uae_einvoicing.zip; unzip it to get the foldertaqnix_uae_einvoicing. - Copy the folder into one of the
addons_pathfolders of your Odoo server and restart Odoo. - Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
- Remove the “Apps” filter, search UAE E-Invoicing and press Install.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_uae_einvoicing --stop-after-init
After the installation:
- Open Accounting → Accounting → E-Invoicing (UAE) → Settings and tick Use UAE e-invoicing for this company; enter the legal registration and the name of your ASP and press Save.
- Press Tax categories and check the category of each sale tax (see Tax categories).
- Optional: press PINT AE Schematron and install the official rules (see Install the official Schematron).
- Fill in the identifiers of your customers (see Company and customer identifiers).
How it fits with your ASP
| Step | Who | Where in Odoo |
|---|---|---|
| 1. Post the customer invoice or credit note | You | The invoice, as usual |
| 2. Check it | Odoo (this module) | The tab UAE E-Invoicing of the invoice, or E-Invoicing (UAE) → Readiness |
| 3. Generate the PINT AE file and validate it | Odoo (this module) | Generate e-invoice on the invoice, or Generate the ready ones |
| 4. Give the file to the ASP | You (Manual connector) | Download XML, or a ZIP from the outbox |
| 5. Send it to the buyer and report it to the FTA | Your ASP | Outside Odoo |
| 6. Record the answer of the ASP | A manager | Set status on the document: sent, accepted, rejected or error |
A document moves through the statuses Draft (made but invalid, or the invoice was reset), Ready (made and not invalid), Sent to ASP, then Accepted, Rejected or Error. Once a document is sent, its invoice cannot be reset to draft or deleted: correct it with a credit note.
Company and customer identifiers
On a customer, open the tab UAE E-Invoicing:
| Field | Meaning |
|---|---|
| TRN format | The TRN is the Tax ID field of the contact. The badge says whether its format is right (15 digits, starting with 1 and ending with 03). Whether the number exists is only known by the FTA and your ASP. |
| UAE TIN | The 10-digit Tax Identification Number. Leave it empty to use the first 10 digits of the TRN (setting TIN source). |
| TIN used in e-invoices | The TIN the file will contain. |
| E-invoicing address | Automatic (UAE: TIN; abroad: Peppol ID, else the export address), UAE TIN (scheme 0235), Not subject to UAE e-invoicing (0235:9900000098), Export, buyer not on Peppol (0235:9900000099) or Peppol participant ID (the Peppol fields of Odoo). |
| Buyer identifier | For a buyer with a predefined address and no TRN: another identifier written in the file. |
| Legal registration | ID, type (TL trade licence, EID Emirates ID, PAS passport, CD cabinet decision) and the issuing authority (trade licence) or the passport country. |
The emirate is read from the state of the address (Dubai, Abu Dhabi, Sharjah, Ajman, Umm Al Quwain, Ras Al Khaimah, Fujairah) and written with its PINT AE code (for example DXB). A foreign customer needs a state / region on its address.
Tax categories
| Category | Use | Extra field |
|---|---|---|
| S - Standard rated (5%) | Domestic supplies at 5% | — |
| Z - Zero rated | Zero-rated supplies and exports (Odoo’s generic builder would write E for a domestic 0% tax: the module writes Z) | — |
| E - Exempt from VAT | Exempt supplies | Exemption reason (DL8.46.1 to DL8.46.4), required |
| O - Outside the scope of VAT | Supplies outside the scope; a document with only O lines becomes a 480 / 81 document | — |
| AE - Reverse charge | Domestic reverse charge on concerned goods | Reverse charge goods type (DL8.48.x), required |
Open Settings → Tax categories to see all sale taxes in one editable list. Pre-set the UAE taxes fills the category of the UAE taxes that have none; a category you chose is never overwritten. A tax without category blocks the file.
The readiness checklist on an invoice
On a posted customer invoice or credit note of a company that uses UAE e-invoicing, open the tab UAE E-Invoicing. You see the transaction type (BTAE-02), the export flag, the credit note reason for a credit note, the UUID once the file was made, the e-invoice status and the Readiness checklist. When everything passes, press Generate e-invoice in the header.
| Group | Examples of checks |
|---|---|
| Document | Customer invoice or credit note, posted, invoice date, currency, not negative, supported transaction type, at least one line |
| Credit note | Credit note reason (BTAE-03), the original invoice (except for a volume discount) |
| Seller | Country UAE, TRN format, TIN, legal registration and authority, address, emirate |
| Buyer | Name, country, address, emirate or region, TRN format, e-invoicing address, identifier |
| Export | Export address used only with the export flag, delivery address abroad |
| Lines and taxes | One PINT AE category per line, exemption reason, reverse charge with the buyer TRN, quantity, discount, GTIN, unit codes; the 5% VAT of the total within the official tolerance |
| Timing | Within 14 business days (estimate): a warning only |
The flags free trade zone, deemed supply, profit margin scheme, summary invoice, continuous supply, disclosed agent billing and e-commerce are shown under Not supported in this version: they are read-only and a document that would need them is blocked.
Check a batch
- Open Accounting → Accounting → E-Invoicing (UAE) → Readiness, or select invoices in the list of customer invoices and choose Check e-invoicing readiness in the Action menu.
- Choose the dates (or leave them empty) and keep Only documents not sent yet ticked.
- Press Run the checks: the counts Checked, Ready, With errors and Generated appear with the list of problems (document, customer, level, message).
- Press Generate the ready ones to make and validate the files of the invoices without errors.
A batch takes at most 2,000 documents; above that, choose a shorter period. The action Generate PINT AE e-invoices of the invoice list does the same without the dialog.
Validation results
| Result | When |
|---|---|
| Valid | The UBL 2.1 XSD passed and the official PINT AE Schematron ran and found no error and no warning. |
| Valid with warnings | Both checks ran without error, but the Schematron or the readiness checks gave warnings. |
| Invalid | The XSD or the Schematron found an error. The document stays in Draft and cannot be sent through a connector. |
| Not fully validated | A check did not run: the Schematron is not installed, saxonche is missing, a check is switched off in the settings, or the engine failed (the reason is in the log). |
The tab Validation log of the document shows each check and every failed rule with its identifier. After you install the Schematron, or fix a customer, press Validate again (or Regenerate after a change of the invoice). A document already sent keeps the validation it had.
Install the official Schematron
- Install the Python package
saxoncheon the Odoo server and restart Odoo. The dialog shows saxonche installed when it is found. - Open E-Invoicing (UAE) → Settings → PINT AE Schematron.
- Either download the file yourself from the official address shown (docs.peppol.eu/poac/ae/pint-ae/resources.zip) and upload it (Upload your file, then Install the uploaded ZIP), or tick Allow downloading the Schematron from docs.peppol.eu in the Settings and press Download from docs.peppol.eu (the server downloads it).
- The SHA-256 of the ZIP is compared with the expected one of PINT AE Billing 1.0.4. Only the four compiled rule files and the unit code list are kept; their own SHA-256 is checked again before every use.
- Press Validate again on the documents prepared before, or select them in the outbox and use the action Validate again.
Stop using the installed rules switches the Schematron off. The files stay on the server in the Odoo data folder (taqnix_uae_einvoicing/<database>/).
The outbox
Open Accounting → Accounting → E-Invoicing (UAE) → Outbox. The list shows the document, the invoice date, the customer, the type, the total, the Validation and the Status badges, the ASP reference and the date it was generated. Rejected, error and invalid documents are red; accepted ones are grey.
| Filter | Shows |
|---|---|
| To hand to the ASP | Ready documents |
| Sent | Documents sent and waiting for an answer |
| Problems | Rejected, error or invalid documents |
| Not fully validated | Files whose Schematron or XSD did not run |
| Invoices / Credit notes | Types 380 and 480 / 381 and 81 |
Group by status, validation or customer; search by name, customer, ASP reference or UUID. Documents are created by the module only: there is no New or Delete button.
An e-invoice document
| Block | Fields |
|---|---|
| Document | Invoice / credit note, customer, type, invoice date, total, direction, company |
| Validation | Validation, UBL 2.1 XSD passed, Schematron run and its version, UUID (BTAE-07), file name, SHA-256 |
| Accredited Service Provider | ASP, ASP reference, sent on, answered on, last message |
| Generated | Generated on, generated by |
| Button | What it does |
|---|---|
| Download XML | Downloads the file after checking its SHA-256; the download is logged. |
| Regenerate | Makes the file again from the invoice (not after it was sent). |
| Validate again | Validates the stored file again (not after it was sent). |
| Set status | Records the answer of the ASP (managers). |
| Check file integrity | Confirms that the stored file still has its recorded SHA-256. |
| Send to ASP / Check status | Only shown when an ASP connector is installed and chosen in the settings. |
The UUID is made once from the database and the invoice and never changes, even when the file is regenerated. The tabs History and Note hold the log and a free note (managers).
Record the answer of your ASP
- Give the file to your ASP (portal, e-mail or the channel your ASP gives you).
- On the document press Set status, choose Sent to ASP and type the reference the ASP gave you; press Apply.
- When the ASP answers, press Set status again and choose Accepted, Rejected or Error with the ASP’s message.
| From | Allowed changes |
|---|---|
| Ready | Sent to ASP |
| Sent to ASP | Accepted, Rejected, Error |
| Error | Ready, Sent to ASP |
| Rejected | Draft (to correct and regenerate) |
| Draft, Accepted | None |
A rejection or an error needs the ASP’s message. The reference is checked against the ASP reference format of the settings (# a digit, A a letter, * a letter or a digit). Nobody can change or delete the log.
Download and export
In the outbox, select documents and choose Download XML files (ZIP) in the Action menu (at most 1,000 at a time). The ZIP holds one XML file per document and a manifest.json with, for each file, the document, type, UUID, SHA-256, status, validation and company, and the note that the files were prepared for the ASP and are not sent or certified. Validate again in the same menu re-validates the selection.
The file itself is a PINT AE Billing 1.0.4 UBL invoice or credit note: CustomizationID urn:peppol:pint:billing-1@ae-1, ProfileID urn:peppol:bis:billing, the transaction type flags, the UUID, the seller with endpoint scheme 0235 and its TIN, the TRN, the legal entity, the buyer, the tax totals and the lines. A document not in AED also carries the tax currency AED, the exchange rate, a second tax total in AED and the AED total.
Settings
Open Accounting → Accounting → E-Invoicing (UAE) → Settings:
| Setting | Meaning |
|---|---|
| Use UAE e-invoicing for this company | Shows the tab and the buttons on the invoices of this company. |
| Company TRN, TIN source, Company TIN | The TRN comes from the company’s Tax ID. From the TRN (first 10 digits) unless typed, or Typed on the contact only. TIN used in e-invoices shows the result. |
| Legal registration | ID, type and issuing authority (or passport country) of the company. |
| Accredited Service Provider (ASP) | The name of your ASP, shown in the outbox; the module never contacts it. |
| ASP reference format | Optional mask checked when a reference is typed, for example ASP-########. |
| Connector | Manual (download the XML for your ASP). Other choices appear only when an ASP connector module is installed. |
| Default payment means | The code written on invoices without a bank account (with a bank account: 30, credit transfer). |
| Validation | Validate with the UBL 2.1 XSD, validate with the PINT AE Schematron, allow downloading the Schematron from docs.peppol.eu, and the state of the installed rules. |
| 14 business days (estimate) | The weekend days and the official holidays (one date per line) used for the deadline warning. |
The footer buttons open the Tax categories, Pre-set the UAE taxes and the PINT AE Schematron dialog.
Who can do what
| Group | Given with | Can |
|---|---|---|
| Viewer | Accounting read-only rights | Open the outbox, download the XML and the ZIP, check the integrity of a file |
| User | Billing rights (Invoicing) | Also run the readiness checks, generate, regenerate and validate files |
| Manager | Accounting administrator | Also change the settings, record the statuses given by the ASP, send through a connector, install the Schematron, write the note |
Each user sees only the documents of the companies they have access to. The outbox records cannot be created, edited or deleted by hand, and the log can be neither changed nor deleted.
How the file is built
| Element | How the module fills it |
|---|---|
| Document type | 380 for an invoice, 381 for a credit note; 480 / 81 when every line is outside the scope (O), as in the official out-of-scope example. |
| Transaction type (BTAE-02) | Eight flags; only flag 8, Exports, is supported. The seven others block the file. |
| UUID (BTAE-07) | A UUID version 5 made from the database UUID and the invoice, stored at the first generation, never changed. |
| Seller | Endpoint 0235 with the 10-digit TIN; TRN in the tax scheme VAT; a seller without TRN can only issue 480 / 81 documents (with its TIN). |
| Buyer | TIN, or 0235:9900000098 (not subject), or 0235:9900000099 (export, not on Peppol), or its Peppol ID. |
| Lines | Net price with base quantity 1 and the gross price as a price allowance; the AED amounts BTAE-08 and BTAE-10 on every line (BTAE-08 left out for E), in AED as the BIS asks, whatever the invoice currency. |
| Other currency | Tax currency AED, exchange rate with 6 decimals, a second tax total in AED and the AED total BTAE-20. |
| Payment means | 30 when the invoice has a bank account, else the default of the settings. Odoo’s ZZZ is not in the PINT AE list. |
| Amounts due | The document total (with cash rounding). Payments made later are not reported in the file. No PDF is embedded. |
| Texts | Characters forbidden in XML removed, no empty element, the rest escaped. |
The 5% VAT of the standard rated total must equal the official tolerance (rule aligned-ibrp-s-09). With Odoo’s UAE default, Round per line, an invoice with many lines can drift: the module blocks it and asks you to set the tax rounding to Round Globally.
What was checked: seven reference documents made by the module (standard, credit note, zero rated, mixed exempt, out of scope 480, export in USD, reverse charge) pass the OASIS UBL 2.1 XSD and the official PINT AE 1.0.4 Schematron (both layers) with no failed rule; a broken file is reported invalid. The module has 163 automated tests, green on a fresh database.
Not implemented and not verified
What the module is not
| Point | Detail |
|---|---|
| No sending | It sends nothing. Your ASP sends the e-invoice to the buyer and reports it to the FTA. |
| No status of its own | It is not an ASP, not a Peppol access point and not certified or approved by the MoF or the FTA. |
| No ASP connected | Manual means you download the files and record the ASP’s answers. A connector for a real ASP needs that ASP’s API documentation and test access; none is included. |
| Nothing for the FTA | No Tax Data Document, no EmaraTax connection, no QR code and no digital signature (the UAE model has none). |
| No Odoo Peppol | Odoo’s Peppol service (IAP) cannot be used for the UAE. |
Documents and scenarios not covered
| Not covered | What happens |
|---|---|
| Self-billing (389 / 261), profit margin scheme and category N, free trade zone, summary invoices, continuous supply, disclosed agent billing, e-commerce, deemed supply | The flag is read-only and the file is blocked |
| B2C sales and Point of Sale receipts | Not prepared (B2C is excluded from UAE e-invoicing for now) |
| Early payment discounts, fixed-amount taxes | The invoice is blocked |
| An invoice with only exempt (and out-of-scope) lines | Blocked: the right document for it is not confirmed, ask your ASP |
| Vendor bills | Not imported from e-invoices |
Checks and validation
| Point | Detail |
|---|---|
| Formats only | TRN and TIN formats are checked, not whether they exist at the FTA. |
| GLN check digit | The check digit of a Peppol ID with scheme 0088 is not checked by the module: only the official Schematron catches it (see the invalid example). |
| Foreign customers | Need a state / region (rule ibr-144-ae). For a country without states in Odoo, create one in the Contacts configuration first. |
| Rounding | Round per line can drift more than 0.02 on long invoices: such files are blocked until you choose Round Globally. |
| Schematron not shipped | A manager downloads or uploads it. Without it, and without saxonche, files are Not fully validated, never Valid. |
| saxonche licence | Not stated on PyPI and not verified; saxonche is not included in the package. |
| Emirate rule | In the 1.0.4 Schematron the emirate code rule does not fire on the seller and buyer addresses; the module’s own check does. |
| Local result | A Valid status is a local check only; your ASP validates again. |
Points not confirmed by an official source (ask your ASP)
| Point | What the module does |
|---|---|
| UUID | Makes a fixed UUID per invoice, while the MoF guidelines say the ASP generates it: your ASP may replace it. |
| TIN source | First 10 digits of the VAT TRN unless typed; ask which TRN to use when your VAT and Corporate Tax TRNs differ (a warning appears when the TIN and TRN do not match). |
| AED total text (BTAE-20) | Written as “AED 1234.56”, copied from the only official example. |
| Reverse charge rate | The file carries the rate of the Odoo tax (often 0%); the official example shows 5%. The official rules accept both. |
| Export prices in AED | The official Exports example writes BTAE-08 / BTAE-10 in USD, the BIS text says AED; the module writes AED (the Schematron accepts both). |
| 14 business days | An estimate from the weekend days and holidays you enter; only a warning. |
| IssueTime | Whether the issue time is mandatory is not confirmed; it is not written. |
| ASP APIs | No ASP interface, real transmission or FTA confirmation was tested. |
Dates to check
Per the Ministry of Finance decisions listed in the module notes (Ministerial Decision No. 244 of 2025 as amended by Ministerial Decision No. 66 of 2026), as read on 29 October 2026: businesses with revenue of AED 50 million or more had to appoint an ASP by 30 October 2026 and implement e-invoicing from 1 January 2027; the other businesses appoint an ASP by 31 March 2027 and implement from 1 July 2027 (government entities from 1 October 2027). These dates have already changed once: check the current text on the Ministry of Finance website and with your ASP.
Troubleshooting
| Problem | What to do |
|---|---|
| No UAE E-Invoicing tab on the invoice | Tick Use UAE e-invoicing for this company in the Settings; the tab appears on its customer invoices and credit notes (the file is made once they are posted). Your user needs at least the Viewer group. |
| No E-Invoicing (UAE) menu | The menu sits under Accounting → Accounting, which Odoo shows to users with accounting rights. |
| Customer emirate error | Set the state of the customer address to one of the seven emirates. |
| Customer region error (abroad) | Set a state / region on the address; create it for the country if Odoo has none. |
| A tax has no PINT AE category | Settings → Tax categories, or Pre-set the UAE taxes. |
| Standard rated VAT not equal to 5% of the taxable amount | Set the tax rounding of the company to Round Globally and reset and post the invoice again. |
| Not fully validated | Install saxonche on the server and the official Schematron, then Validate again. The log says which check did not run. |
| Invalid | Read the failed rule in the Validation log, fix the invoice or the customer, then Regenerate. |
| SHA-256 mismatch | The stored file was changed after it was made: press Regenerate. |
| The ASP reference is refused | It does not match the ASP reference format of the Settings: correct the reference or the format. |
| The invoice cannot be reset to draft | Its e-invoice was sent: issue a credit note instead. |
Updating and removing
Replace the folder with the new version, restart Odoo and run -u taqnix_uae_einvoicing. Your outbox, its log, the identifiers on the contacts and the tax categories are kept.
When you uninstall the module, the prepared XML files stay as attachments of their invoices; the outbox and its log are removed. The downloaded Schematron files stay in the Odoo data folder (taqnix_uae_einvoicing/<database>/): delete them by hand if you want.
Support
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.