ERP prerequisites
Set these up in your own accounting system before you send anything. Almost all of it is on the customer record and is a one-time job per customer — but until it is done, that customer's invoices cannot be filed, because a buyer with no tax number and no address cannot be identified to the FTA.
Do this once, per customer, before you invoice them
The platform reads your buyers out of the ERP. It never asks you to re-enter them here, which is the point of connecting a system you already use — but it also means an empty field in your ERP is an empty field on the invoice.
Every path below can be changed. The PINT Mapping page in the dashboard lets you point any field at a different source in your own data. The paths are the defaults, not a fixed contract — so if your TRN lives somewhere else entirely, repoint it rather than move your data.
Each system also has its own page in the sidebar, with a button that copies that system's checklist as plain text — that is what to send a client who is setting themselves up.
Create a custom field named “Tax ID number” on the customer
Customer details → Custom fields → add a field named Tax ID number, then enter that customer's 15-digit TRN in it. Repeat for every customer you invoice.
Read from
CustomerInfo.CustomField[0].StringValueIf it is missing: “The Customer Tax Number (TRN) is missing from the custom field. Please add a custom field on the QuickBooks customer details page named “Tax ID number” and enter the customer’s TRN in that field.”
Keep it as the FIRST custom field
The default mapping reads custom field number one. If the TRN sits in your second or third custom field, either reorder them or repoint buyer_tax_id on the PINT Mapping page — both work, but one of the two has to be done.
Read from
CustomField[0] — position matters, the field name is not searched forFill in the customer's billing address
Street, city, state and country. Country is mandatory; for a UAE buyer the state is the emirate.
Read from
CustomerInfo.BillAddr.Line1 / .City / .CountrySubDivisionCode / .CountryIf it is missing: “Customer Address Country is missing.”
Give every invoice a number no other invoice has used
QuickBooks only auto-increments the number while custom transaction numbers are off. Turn them on — many accounts do, to keep their own numbering — and the field is typed by hand on every invoice, which is where repeats come from. Switch on Settings → Sales → Sales form content → “Warn if duplicate invoice number is used” so QuickBooks catches it before we do. Unlike the rest of this list, this one is per invoice, not per customer.
Read from
DocNumberIf it repeats: The invoice is rejected with 409 and the invoice already holding that number is returned with the error. Nothing is filed until the number is changed.
Apply tax on the invoice, not just on the total
Each line needs a tax code, and the invoice needs its tax detail — that is where the taxable base comes from. An invoice with no tax detail has no net amount to report.
Read from
TxnTaxDetail.TaxLine[0].TaxLineDetail.NetAmountTaxable, Line[].SalesItemLineDetail.TaxCodeRef
Enter the customer's tax number on the contact
Contact → Financial details → Tax Number. 15 digits for a UAE buyer.
Read from
Contact.TaxNumberIf it is missing: “Contact TaxNumber (TRN) is missing.” / “…must be 15 characters long.”
Use the STREET address, not only the postal one
A Xero contact holds two addresses. The platform reads the street address, so a contact with only a PO Box filled in reads as having no address at all.
Read from
Contact.Addresses[STREET].AddressLine1 / .City / .Region / .CountryIf it is missing: “Contact Address Country is missing.”
Give every line an item and a tax rate
The line's item name and tax rate are both read. A free-text line with no item can still be sent, but you have to repoint the item name to the line description on the PINT Mapping page.
Read from
LineItems[].Item.Name, LineItems[].Description, LineItems[].TaxType
Enter the customer's Tax Registration Number
Customer → Other details → Tax Registration Number. 15 digits for a UAE buyer.
Read from
tax_reg_noIf it is missing: “Contact TaxNumber (TRN) is missing.”
Complete the billing address
Street, city, state and country on the customer's billing address — not the shipping one.
Read from
billing_address.address / .city / .state / .countrySet a unit on each line
Zoho's unit label is translated to the standard code the FTA expects. An unrecognised label falls back to “each”, so set it deliberately where the unit matters.
Read from
line_items[].unit
Fill in Tax ID on the customer contact
Contact → Sales & Purchase → Tax ID. 15 digits for a UAE buyer.
Read from
partner.vatComplete the contact address
Street, city, state and country. The country must be set on the contact, not inherited.
Read from
partner.street / .city / .state / .country_codeKeep line labels and taxes populated
The line label is used as both the item name and its description — it auto-fills from the product, and holds your own text on a free-text line. The line's tax is read by name.
Read from
line_items[].name, line_items[].tax_name, line_items[].uom_name
Enter the contact's Tax Registration Number
Contact → Tax registration number. 15 digits for a UAE buyer.
Read from
contact.tax_registration_numberFill in address, city and country on the contact
For a UAE buyer put the emirate in the city field — that is the field the platform reads for the emirate, because Wafeq has no state field and the district field is usually blank.
Read from
contact.address / .city / .countryNothing to do about the net total
Wafeq publishes only the tax-inclusive amount, so the platform derives the net from the lines itself. Mentioned only so the figures look familiar when you compare them.
Read from
net_amount — derived, not read
Enter the customer's tax number on the contact
Contact → Tax Number. 15 digits for a UAE buyer.
Read from
Contact.TaxNumberFill in the street address on the contact
Address line, city, region and country.
Read from
Contact.Addresses[STREET].AddressLine1 / .City / .Region / .CountryWrite a description on every line
Naqood exposes one label per line, so it becomes both the item name and the description. A line with no description has neither.
Read from
LineItems[].Description
What is the same for all of them
A UAE buyer's TRN is 15 digits. Fourteen or sixteen is rejected — the length is checked, not just the presence.
A buyer outside the UAE has no UAE TRN and is not expected to. Put its own national tax number in the same field and the platform builds its Peppol address from that, under its country's scheme. If the buyer is on the Peppol network under an identifier of its own, that is better still. Leave the field empty and nothing fails: a buyer outside the UAE is never refused for a missing tax number, and is addressed by the export placeholder instead.
Some countries publish a company-register or e-invoicing identifier rather than a tax number — Denmark, Sweden, Norway, Finland, Singapore and others — so no address can be built from a tax number alone. Those invoices are still filed: the buyer is addressed by the FTA's export placeholder, which means the document reaches the authority but is not delivered to the buyer over the network. Supplying a real participant id, where the buyer has one, is what turns that into a delivery.
The country is mandatory on every buyer, and for a UAE buyer the emirate is what the FTA reads as the region.