Excel & CSV Integration
UAE E-Invoicing from Excel or CSV — No ERP Required
If your invoices live in Excel, Google Sheets or a CSV export from a POS, TrustBill converts them to compliant PINT-AE XML and submits them to the FTA network through our accredited ASP partner. No accounting SaaS, no ERP migration, no code — just an upload. Free for 50 invoices/month.
How the Excel / CSV workflow works
You upload an Excel workbook (`.xlsx`) or CSV file to TrustBill; the platform reads each row as an invoice, converts it to PINT-AE XML, validates against the 51 mandatory FTA fields, and — for rows that pass — submits through our accredited ASP path. Rows that fail validation land in a fix-and-resubmit queue with row-level error explanations.
The workflow is designed for finance teams that already produce their invoicing in spreadsheets and do not want to add an ERP to the stack just for the mandate. Common patterns: SMEs on Google Sheets, professional-services firms with a per-project invoice tab, retailers exporting nightly POS settlements as CSV, accounting consultancies preparing bulk runs for many client TRNs at once.
The upload is idempotent by invoice number — re-uploading the same row does not create a duplicate submission. Corrections re-submit only the fixed rows.
The TrustBill Excel / CSV template
TrustBill publishes a canonical spreadsheet template that maps 1:1 to the PINT-AE data dictionary. Download it, populate the rows with your invoice data, upload, and TrustBill handles the rest. The template covers all mandatory PINT-AE fields plus the common conditional ones (free-zone flag, advance-payment linking, credit-note reference).
Google Sheets users: File → Download → Comma-separated values (.csv). Excel users: Save As → CSV UTF-8 (Comma delimited) to preserve Arabic characters. Non-UTF-8 CSV exports lose Arabic legal names, which then fails validation — always use UTF-8.
Spreadsheet column → PINT-AE mapping
The exact mapping TrustBill applies when converting each row of your Excel / CSV to PINT-AE XML. The template ships with these column headers pre-populated in row 1 — you fill row 2 downwards. Extra columns are ignored (safe to keep your internal notes); missing mandatory columns fail on upload.
| Column header (row 1) | PINT-AE / UBL 2.1 field | Note |
|---|---|---|
| invoice_number | cbc:ID | Your invoice number. Must be unique across all uploads. |
| issue_date | cbc:IssueDate | ISO date (YYYY-MM-DD). Must not be in the future. |
| invoice_type_code | cbc:InvoiceTypeCode | 388 for commercial invoice, 381 for credit note, 386 for advance payment. |
| buyer_trn | cac:AccountingCustomerParty/cac:PartyTaxScheme/cbc:CompanyID | Buyer TRN — 15 digits. Missing TRN = #1 rejection cause. |
| buyer_name | cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName | Buyer's legal name. UTF-8; Arabic supported. |
| buyer_country | cac:AccountingCustomerParty/cac:Party/cac:PostalAddress/cac:Country/cbc:IdentificationCode | ISO 3166-1 alpha-2. AE for domestic; other codes trigger export/reverse-charge treatment. |
| line_description | cac:InvoiceLine/cbc:Description | Line-item text. Multiple lines per invoice go on consecutive rows sharing the same invoice_number. |
| line_quantity | cac:InvoiceLine/cbc:InvoicedQuantity | Number of units (integer or decimal). |
| line_unit_price | cac:InvoiceLine/cac:Price/cbc:PriceAmount | Unit price in the invoice currency. |
| line_tax_category | cac:ClassifiedTaxCategory/cbc:ID | S (5% standard), Z (0% zero-rated), E (exempt), or O (out of scope). |
| line_tax_rate | cac:ClassifiedTaxCategory/cbc:Percent | Numeric — 5, 0, 0, 0 respectively. |
| currency | cbc:DocumentCurrencyCode | AED for domestic. Non-AED requires an fx_rate column. |
| fx_rate | cac:PricingExchangeRate/cbc:CalculationRate | Only required if currency ≠ AED. |
| free_zone | Extension namespace flag; VAT category derived | TRUE / FALSE. Set on buyer_ or line_ scope as needed. |
| advance_uuid | cac:DocumentReference (type 386) | For invoices that recover a prior advance — populate with the advance-invoice UUID. |
| parent_invoice_id | cbc:InvoiceTypeCode="381"; cac:BillingReference/cac:InvoiceDocumentReference | Required on credit-note rows (invoice_type_code=381) — the UUID of the invoice being credited. |
Common upload errors and how to fix them
The eight most-hit upload errors when a spreadsheet row fails PINT-AE checks, with the exact fix in your Excel or CSV file. TrustBill's upload UI highlights each affected row with a plain-English error message; the table below is the reference version.
| Error code | Meaning | Fix in Excel / CSV / Google Sheets |
|---|---|---|
| PAE-BR-01 | buyer_trn column is missing or not 15 digits on this row. | In your spreadsheet, set the buyer_trn cell to the 15-digit TRN. Format the column as Text so Excel doesn't drop leading zeros. |
| PAE-BR-04 | Seller TRN missing in TrustBill company settings. | Set your TRN once in TrustBill → Settings → Company. It is not carried in the spreadsheet; it applies to every uploaded invoice. |
| PAE-BR-11 | Line-total mismatch (qty × unit_price ≠ line total from the sheet). | Correct rounding on line_quantity or line_unit_price so the line total reconciles. TrustBill recomputes; if the recomputed value differs from your sheet by more than 0.01, the row fails. |
| PAE-BR-12 | Unrecognised line_tax_category value. | Only S / Z / E / O are accepted. Replace any freeform values (e.g. "5%", "Zero Rated", "Exempt") with the single-letter code. |
| PAE-BR-14 | currency ≠ AED but no fx_rate provided. | Add an fx_rate column and populate it with the rate as of the invoice's issue_date. |
| PAE-BR-21 | Credit-note row (invoice_type_code=381) missing parent_invoice_id. | Set parent_invoice_id on the credit-note row to the UUID of the invoice being credited. This is the UUID from TrustBill's response, not your local invoice_number. |
| PAE-BR-22 | Advance-recovery row missing advance_uuid reference. | Set advance_uuid to the UUID of the earlier advance-payment invoice (invoice_type_code=386). |
| PAE-BR-31 | free_zone=TRUE but buyer address is not in a free zone. | Correct the buyer's address in TrustBill's Contacts, or set free_zone=FALSE on the row. |
Key features for Excel and CSV users
TrustBill's Excel / CSV workflow includes:
- **Idempotent uploads** — Re-uploading the same invoice_number does not duplicate the submission. - **Fix-and-resubmit queue** — Failed rows appear in a dashboard with row-level errors; fix the sheet, re-upload, only the failed rows re-submit. - **Google Sheets compatibility** — Native `.csv` export works. UTF-8 required to preserve Arabic. - **Bilingual template** — Column headers ship in EN + AR; either variant is accepted on upload. - **Bulk validation** — All 51 mandatory PINT-AE fields checked per row before any submission. - **API-optional** — The same JSON payload the API accepts can also be posted as CSV; both paths land on the same accredited ASP. - **Multi-tenant** — Accounting firms upload one file with a client_trn column and invoices route to the right client automatically. - **VAT 201 aggregation** — Uploaded invoices feed the same VAT 201 draft as API- and ERP-connector-sourced ones.
Pricing for Excel / CSV users
The free tier — 50 invoices/month, no credit card — was built for exactly this profile: a small business, sole trader or per-project consultant who invoices in a spreadsheet and needs mandate coverage without an accounting SaaS subscription. Paid plans start at AED 200/month for 500 invoices; larger runs and accounting-firm multi-tenant plans scale in AED-transparent tiers. No setup fees. No commitment.
Frequently asked questions
Do I need to buy Excel to use this?
No. Any spreadsheet that can save as CSV works — Google Sheets, LibreOffice Calc, Numbers, or Excel. The template is a CSV; you can open it in whatever tool you already have.
What if I have hundreds of invoices per month — is CSV still practical?
Yes. TrustBill's CSV pipeline handles tens of thousands of rows per file. High-volume shops typically automate the upload via API instead of a manual file drop, but the same CSV format works either way.
Do line items need to be on the same row as the invoice header?
No. Multiple line items go on consecutive rows sharing the same invoice_number — TrustBill groups them into one PINT-AE document at upload time. Header-level fields on rows 2..N are ignored (only row 1 for the invoice_number carries them).
How is Arabic preserved in the CSV?
Save as CSV UTF-8. In Excel: File → Save As → CSV UTF-8 (Comma delimited). Non-UTF-8 (Windows-1252, etc.) will corrupt Arabic legal names and fail validation. Google Sheets exports UTF-8 by default.
Can accounting firms upload one file for many client TRNs?
Yes. Add a client_trn column; TrustBill routes each row to the correct client tenant in a multi-tenant consultancy workspace. This is one of the reasons UAE accounting firms use TrustBill instead of one-per-client ERPs.