Overview
This guide describes how Daftra — the UAE-born, Arabic-first cloud accounting + ERP platform — connects to TrustBill, a UAE FTA-accredited service provider (ASP), so Daftra users can issue PINT-AE compliant e-invoices without switching ERPs.
Daftra was built regionally with UAE VAT, TRN handling and Arabic-first UX baked in from day one. Its invoices already carry seller / buyer TRN and 5% VAT correctly. What it does not include natively is PINT-AE XML generation or transmission through an FTA-accredited ASP over the Peppol network. TrustBill is that missing piece.
Invoices flow out of Daftra through its REST API (or webhooks + REST fetch-back). TrustBill translates the payload into PINT-AE XML, validates it in real time, delivers it over Peppol via a certified ASP (Tron-Stride or Storecove), and the FTA acknowledgement is written back onto the Daftra invoice as a custom field.
What this integration delivers
- Zero-code setup — no plug-in to install on the Daftra side; the customer just pastes an API key
- Real-time push via Daftra webhooks + fetch-back over Daftra REST API
- Arabic + English legal names preserved end to end (PINT-AE requires the Arabic seller name)
- Sales invoices, credit notes and simplified tax invoices all mapped to PINT-AE document types
- Daftra tax rows (5% VAT, Zero-Rated, Exempt, Reverse Charge, Out of Scope) auto-mapped to FTA tax categories
- Live FTA status written back onto Daftra invoice custom fields — visible in the Daftra invoice list
- Bulk migration path for historical Daftra invoices via CSV export
- Multi-branch and multi-currency Daftra accounts supported
What is Daftra?
Daftra is a MENA-region cloud accounting and ERP suite delivered as SaaS on a per-company subdomain (<yourco>.daftra.com). It bundles accounting, invoicing, inventory, POS, HR, CRM and projects modules — with pricing tiers that scale by number of users and modules enabled.
- Arabic-first UX with English translations across the board
- Built with UAE VAT, TRN and FTA-aligned invoice layouts baked in — no extra localisation module required
- Native REST API (versioned
/api/v2/) that exposes invoices, clients, products, taxes, credit notes, purchases, expenses - Webhook subscriptions on invoice / credit-note / client events
- Every account gets a unique subdomain; API calls are region- and account-scoped by subdomain
Why Daftra fits well with TrustBill: Daftra already handles TRN, Arabic, and UAE VAT correctly — the compliance-shape gap between what Daftra emits and what PINT-AE expects is small. Most customers reach acknowledged on their first real invoice.
Supported Daftra Plans & Modules
The TrustBill connector works on every Daftra plan that exposes the Sales Invoice module + API access. That's every paid plan; the free trial can also connect but is capped by Daftra's own request rate.
| Daftra plan | API access | Webhooks | Support level |
|---|---|---|---|
| Free / Trial | Rate-limited | No | Testing only — upgrade for production |
| Basic | Yes | Limited | Full via polling fallback |
| Standard / Business | Yes | Yes | Full — recommended |
| Premium / Enterprise | Yes + higher rate limits | Yes + custom fields | Full — recommended for > 500 invoices/month |
| Daftra POS module | Yes — POS receipts appear as Invoices with a POS flag | Same as parent plan | Full — simplified tax invoice profile emitted for < 10,000 AED B2C |
Daftra modules the connector reads from
| Module | Role in the flow |
|---|---|
| Invoicing / Sales | Primary source of out_invoice documents |
| Credit Notes | Source of credit_note documents |
| Purchases | Optional source of purchase documents (roadmap) |
| Clients | Buyer TRN, Arabic + English name, address, country |
| Products | Item SKU, description, UOM |
| Taxes | Tax rate + name → TrustBill taxCategory |
| POS | Retail receipts flow as simplified invoices |
Prerequisites
On the Daftra side
- An active Daftra paid plan (Standard or higher recommended for webhook support)
- Company profile completed with legal name (Arabic + English), country = United Arab Emirates, and the 15-digit UAE TRN under Settings → Company Info → Tax Number
- Clients populated with a 15-digit TRN for every B2B customer (leave empty for B2C)
- Tax rows configured for UAE — 5% VAT, Zero-Rated (Export / Healthcare / Education), Exempt, Reverse Charge
- An admin user who can generate an API key from My Profile → API Keys
- Daftra webhook feature enabled (Settings → Webhooks) if you want real-time push
On the TrustBill side
- A TrustBill SME account (one account = one TRN = one Daftra subdomain)
- Completed KYB (business verification) — trade licence + TRN certificate uploaded
- Submission mode set to
testorsandboxduring onboarding,livefor production - Per-tenant API credential (issued during the Sources → Add Daftra flow)
Integration Architecture
Because Daftra is SaaS-only with a first-class REST API, the flow mirrors the Zoho / QBO pattern: webhook triggers, TrustBill fetches, pipeline runs, write-back.
Outbound flow (Daftra → TrustBill → FTA)
- An invoice is created or updated in Daftra (Sales → New Invoice → Save).
- Daftra fires a webhook to the URL registered by TrustBill during connection setup.
- TrustBill's webhook receiver verifies the HMAC signature (using the Daftra webhook secret) and acknowledges immediately.
- Asynchronously, TrustBill fetches the full invoice + client + line items via the Daftra REST API using the stored API key.
- Payload is translated into TrustBill's
InvoiceCreateInputshape. - TrustBill calls its internal
POST /v1/invoices— invoice stored asdraft. - If auto-submit is enabled,
POST /v1/invoices/submitfires immediately. - Pipeline:
queued → transformed → validated → delivered. ASP forwards to FTA over Peppol.
Inbound flow (FTA → TrustBill → Daftra)
- The ASP posts an inbound webhook to TrustBill on FTA acknowledgement.
- TrustBill's Daftra worker calls the Daftra API to update the invoice's custom fields (
trustbill_status,trustbill_ack_ref,trustbill_reject_reason). - Daftra users see the status in the invoice list view; a filter can be added to show only invoices needing attention.
Connection Methods
Five paths, ordered from easiest (webhook + API) to most bespoke (Zapier).
1. Webhook + REST API (recommended)
TrustBill registers a webhook URL in Daftra Settings and stores your Daftra API key. Real-time push on invoice change, plus periodic delta polling as a safety net.
- Real-time — status appears in TrustBill within seconds of Daftra Save
- HMAC-signed webhooks — TrustBill verifies each payload
- Safety-net poll (every 15 min) catches invoices where the webhook was dropped by transient network issues
- Auto-detects your Daftra subdomain from the API key introspection
2. REST API polling only (no webhooks)
If your Daftra plan doesn't include webhooks, TrustBill can drive the sync purely by polling /api/v2/invoices?updated_since=<timestamp> every 5 minutes.
- Zero Daftra-side setup beyond the API key
- Up to 5 minutes of latency
- Works on Basic plans
3. Zapier / Make (no-code)
TrustBill publishes Daftra connectors on Zapier and Make — build a "New Daftra invoice → Create TrustBill invoice → Submit" zap in minutes.
- Best when your team already standardises on Zapier / Make
- Handles retry, error branching, Slack/email notification on failure
- Adds latency (Zapier polls Daftra every 1–15 min on paid plans)
4. Daftra Workflow Automation (paid plans)
Daftra Standard and above expose Workflow Automation — configure an action on Invoice status = Approved / Sent that POSTs to your TrustBill webhook URL. Useful when you want the trigger to be a specific status, not just any save.
5. CSV Export (one-off migrations)
Export invoices from Sales → Invoices → Export → CSV, run the TrustBill daftra-csv-normaliser to remap column headers, and upload via bulk import.
Which method should I use?
On Standard / Business / Premium plans, use the Webhook + REST API path. On Basic, use the REST API polling path. Use Zapier / Make only if your team already standardises on it. Use CSV only for one-off historical migrations before go-live.
Authentication (API Key + Subdomain)
Daftra uses API keys for programmatic access. Each key is tied to a specific user and inherits that user's permissions. TrustBill recommends creating a dedicated integration user (e.g. "TrustBill Sync") so its permissions can be audited independently.
Creating a Daftra API key
- Log into Daftra as the integration user
- Top-right avatar → My Profile
- Open the API Keys tab (some plans call it Integrations)
- Click Generate New Key and copy the token — Daftra shows it once
- Paste it into TrustBill Sources → Add Daftra along with your subdomain
Connection parameters TrustBill stores
| Parameter | Example |
|---|---|
| Daftra subdomain | yourcompany (from https://yourcompany.daftra.com) |
| API base URL | https://yourcompany.daftra.com/api/v2 |
| API key | Stored KMS-encrypted; never re-shown after save |
| Webhook secret | TrustBill generates and returns it once at Sources setup; paste into Daftra Webhook config |
Daftra API request header
GET /api/v2/invoices?updated_since=2026-09-08T00:00:00Z HTTP/1.1
Host: yourcompany.daftra.com
APIKEY: {{stored_api_key}}
Accept: application/jsonDaftra also accepts the token as a ?apikey= query parameter — TrustBill uses the header form so keys never appear in web logs.
Idempotency-Key derivation for Daftra
Every TrustBill write endpoint requires an Idempotency-Key. Derive it from the Daftra invoice ID (integer, stable across renumbering):
Idempotency-Key: daftra::{subdomain}::invoice::{id}Daftra webhook retries and the safety-net poll reuse the same key — TrustBill returns the cached response, so retries never create duplicate FTA submissions.
Daftra → PINT-AE Field Mapping
The connector translates Daftra's JSON invoice shape (/api/v2/invoices/{id}) into TrustBill's InvoiceCreateInput, which is then rendered into PINT-AE XML.
Header-level mapping
| Daftra field | TrustBill field | Notes |
|---|---|---|
no / code | number | Daftra's human-readable invoice number ("INV-2026-00042"); 1–64 chars |
id | Idempotency-Key + sellerInvoiceReference | Daftra internal integer |
date | issueDate | ISO YYYY-MM-DD |
due_date | dueDate | Optional |
currency_code | currency | Must be AED; multi-currency invoices converted at exchange_rate |
type | invoiceType | Standard Invoice → sale; POS receipts still sale with simplified profile |
Company.legal_name_ar | seller.legalNameArabic | Required by PINT-AE |
Company.legal_name | seller.name | English legal name |
Company.tax_number | seller.trn | 15-digit UAE TRN |
client_id → Client | buyer | Fetched from /api/v2/clients/{id} |
Client.business_name_ar | buyer.legalNameArabic | Arabic buyer legal name — preserved end to end |
Client.business_name | buyer.name | English buyer name |
Client.tax_number | buyer.trn | 15-digit TRN; leave empty for B2C |
Client.country | buyer.country | ISO 3166-1 alpha-2 (Daftra stores full country name; connector normalises) |
Client.address1, address2, city, state, zip | buyer.address.{line1,line2,city,state,postalCode} | — |
reference_no | buyerReference | Customer PO or reference |
notes / terms | notes | Concatenated; visible in FTA-facing XML |
Line-level mapping (items[])
| Daftra field | TrustBill field | Notes |
|---|---|---|
item / name | lines[].description | Supports Arabic natively |
description | Appended to lines[].description | Some Daftra deployments use a separate description; connector merges |
quantity | lines[].quantity | Must be > 0 |
unit_price / price | lines[].unitPrice | VAT-exclusive; connector strips VAT if the invoice header flags inclusive pricing |
discount | lines[].discountAmount | Absolute per-line discount, applied before VAT |
product_id / sku | lines[].sellerItemId | Preserved for traceability |
unit (from Product master) | lines[].unit | Daftra unit code mapped to UN/ECE Rec 20 |
tax1_id + tax1_percent (and tax2) | lines[].vatRate + lines[].taxCategory | Mapped via the Daftra Tax Mapping table; Daftra supports up to two stacked taxes per line |
Totals are computed server-side
Do not send Daftra's subtotal / tax_total / total. TrustBill re-computes totals from lines[] and returns them so the connector can reconcile. If Daftra's total differs from TrustBill's by more than ±0.01 AED, the connector logs a variance and blocks submission until you re-save the invoice in Daftra.
Bilingual (Arabic + English) Handling
PINT-AE requires the Arabic legal name of the seller (and buyer, when applicable). Daftra stores both languages on the Company and Client masters — the connector reads both and preserves them end to end.
| Field | Daftra source | PINT-AE target |
|---|---|---|
| Seller Arabic legal name (required) | Company.legal_name_ar | Party/PartyName/Name with @languageID="ar" |
| Seller English legal name | Company.legal_name | Party/PartyName/Name with @languageID="en" |
| Buyer Arabic legal name (optional) | Client.business_name_ar | Emitted when populated |
| Line description | items[].item — accepts Arabic natively | InvoiceLine/Item/Description |
| Notes / Terms | notes — accepts Arabic natively | Note element |
If Company.legal_name_ar is empty, TrustBill blocks submission with arabic_seller_name_required. Fill it in Daftra Settings → Company Info → Arabic Legal Name. This is an FTA rule, not a TrustBill one.
Create Invoice (draft)
Endpoint: POST /v1/invoices
A real Daftra invoice mapped to the TrustBill payload. Daftra invoice: INV-2026-00042 — Sale of translation services to a Dubai buyer at 5% VAT.
Request body
{
"number": "INV-2026-00042",
"issueDate": "2026-09-08",
"dueDate": "2026-10-08",
"currency": "AED",
"invoiceType": "sale",
"buyer": {
"name": "Gulf Media Group LLC",
"legalNameArabic": "مجموعة إعلام الخليج ذ.م.م",
"trn": "100324156700007",
"country": "AE",
"email": "ap@gulfmedia.example",
"address": {
"line1": "Media City, Building 8, Office 401",
"city": "Dubai",
"country": "AE"
}
},
"seller": {
"name": "Daftra Language Services LLC",
"legalNameArabic": "دفترة لخدمات اللغة ذ.م.م",
"trn": "100100100100015",
"country": "AE"
},
"lines": [
{
"description": "Arabic-English translation — 8,000 words",
"sellerItemId": "SVC-TRANS-8K",
"quantity": 1,
"unit": "C62",
"unitPrice": 3200.00,
"vatRate": 0.05,
"taxCategory": "standard_5"
}
],
"sellerInvoiceReference": "Daftra invoice_id 12847",
"notes": "شكرًا لتعاملكم / Thank you for your business"
}Response (201 Created) — abbreviated:
{
"id": "a7c3e5b1-....-uuid",
"number": "INV-2026-00042",
"status": "draft",
"invoiceType": "sale",
"totals": { "subtotal": 3200, "tax": 160, "total": 3360, "currency": "AED" },
"pipeline": [],
"errors": [],
"submissionMode": "sandbox",
"source": "daftra-connector"
}Credit Notes
Daftra credit notes are first-class documents at /api/v2/credit_notes. The connector reads them via the same webhook + fetch path as invoices.
| Daftra document | invoiceType | Required extra fields |
|---|---|---|
Credit Note linked to an invoice (related_invoice_id set) | credit_note | referencedInvoiceNumber = original invoice's no, reasonCode |
| Standalone Credit Note | credit_note | reasonCode = OtherAdjustment |
Sign convention: Daftra credit notes carry positive quantities and positive prices — send the same to TrustBill. The invoiceType tells the FTA that the document reverses the reference invoice; PINT-AE handles the sign in the XML.
Recurring Invoices
Daftra supports Recurring Invoices (Standard plan and above). Each cycle generates a child invoice — the connector treats each child as a fresh event:
- Daftra fires the invoice-created webhook for every generated child
- Each child gets its own
id— fresh Idempotency-Key, fresh TrustBill draft, fresh FTA submission - The recurring template itself is not pushed to TrustBill — only the concrete invoices it produces
- Pro-rated first / last cycles flow through the same mapping
Auto-submit tip: for recurring cycles, enable TrustBill's auto-submit on ingest. Otherwise every generated child sits as a draft in TrustBill waiting for a human to click Submit.
Submit Invoice(s) for Delivery
Creating a draft in TrustBill does not deliver the invoice to the FTA. Submission is an explicit second call.
Endpoint: POST /v1/invoices/submit
{ "ids": ["a7c3e5b1-....-uuid"] }Recommended trigger for Daftra: use Daftra's Workflow Automation to fire the webhook only when the invoice reaches Sent or Approved status (not Draft). Then enable auto-submit on the TrustBill tenant so Sent-in-Daftra is effectively "Send to FTA".
Status Tracking & Custom Field Write-back
During Sources setup, the connector creates three custom fields on the Daftra invoice module. Every TrustBill status change writes back via the Daftra API.
| TrustBill status | Meaning | Daftra custom field written |
|---|---|---|
| draft | Created in TrustBill, not submitted | trustbill_status = Draft |
| queued | Submitted, waiting for pipeline | trustbill_status = Queued |
| validated | Passed schema + Schematron | trustbill_status = Validated |
| delivered | Sent to FTA via ASP | trustbill_status = Delivered |
| acknowledged | FTA confirmed receipt / validity | trustbill_status = Acknowledged, trustbill_ack_ref = <FTA ref> |
| rejected | FTA or ASP rejected the invoice | trustbill_status = Rejected, trustbill_reject_reason = <code> |
Add the three fields to the invoice list column layout so you can filter and colour-code by TrustBill status directly inside Daftra: Sales → Invoices → Column Layout → Add Column → trustbill_status / trustbill_ack_ref / trustbill_reject_reason.
Bulk Migration from Daftra
To migrate historical Daftra invoices (up to 12 months back) into TrustBill:
- In Daftra: Sales → Invoices → filter by date range → Export → CSV
- Run the TrustBill daftra-csv-normaliser script to remap Daftra's column headers to the TrustBill schema below
- Upload in
testmode viaPOST /v1/invoices/bulk - Review the summary; repeat in
sandboxandlive
TrustBill CSV column headers
number,issueDate,dueDate,invoiceType,currency,sellerTrn,sellerName,sellerLegalNameArabic,buyerTrn,buyerName,buyerLegalNameArabic,buyerCountry,buyerAddressLine1,buyerCity,lineDescription,lineQty,lineUnit,lineUnitPrice,lineVatRate,lineTaxCategory,referencedInvoiceNumber,notes| Limit | Value |
|---|---|
| Max rows per file | 1,000 invoices |
| Max file size | 5 MB |
| Partial success | Yes — bad rows reported without rolling back the batch |
Test / Sandbox / Live Modes
Daftra does not provide a separate sandbox account — production is the only environment. Use TrustBill's mode switch to isolate testing invoices from the FTA network.
| Mode | Purpose | Reaches FTA? |
|---|---|---|
test | Local integration testing — no ASP call | No |
sandbox | End-to-end dry run against the ASP sandbox | FTA sandbox only |
live | Real, legally binding e-invoicing | Yes — the FTA production network |
Recommended workflow: start in TrustBill sandbox for the first VAT-return period. Post real Daftra invoices as normal — they'll reach the FTA sandbox, not production. Reconcile Daftra's Reports → Tax Report against TrustBill's Delivered Invoices report, then switch to live.
Daftra Tax Mapping (UAE)
Daftra ships a preset of UAE VAT taxes on new company setups. The connector auto-maps them by rate + name. Custom-named taxes (common in older Daftra accounts) need a one-time mapping in TrustBill Settings → Daftra → Tax Mapping.
| Daftra tax name (typical) | Rate | TrustBill vatRate | TrustBill taxCategory |
|---|---|---|---|
| ضريبة القيمة المضافة 5٪ / VAT 5% | 5% | 0.05 | standard_5 |
| صفر بالمائة - تصدير / Zero-Rated Export | 0% | 0 | zero_rated_export |
| صفر بالمائة - رعاية صحية / Zero-Rated Healthcare | 0% | 0 | zero_rated_healthcare |
| صفر بالمائة - تعليم / Zero-Rated Education | 0% | 0 | zero_rated_education |
| معفى - مالي / Exempt Financial | Exempt | 0 | exempt_financial |
| معفى - إيجار سكني / Exempt Residential Rent | Exempt | 0 | exempt_residential_rent |
| آلية الاحتساب العكسي - منطقة معينة / Reverse Charge (Designated Zone) | 0% | 0 | reverse_charge_designated_zone |
| خارج النطاق / Out of Scope | Out of Scope | 0 | out_of_scope |
The connector reads Tax.name and Tax.rate to guess the mapping. If your Daftra was set up years ago with custom-named taxes, add each name to the TrustBill mapping table once — the mapping survives Daftra plan upgrades.
UAE-Specific Scenarios
Free Zone / Designated Zone sellers
Set the flag on your TrustBill tenant (Settings → Company → Zone Type = Designated) — not in Daftra. It flows through as seller.designatedZone: true so PINT-AE emits the free-zone declaration correctly.
Margin scheme (used cars, antiques, second-hand goods)
Add a Daftra custom field Margin Scheme (boolean) to Products. When ticked, the connector sends lines[].marginScheme: true and uses the item's Cost Price as the margin base.
Reverse charge on imports
Purchase bills from non-UAE vendors using the Reverse Charge tax row map to invoiceType: purchase + taxCategory: reverse_charge_designated_zone. PINT-AE emits the ReverseCharge markers.
B2C simplified tax invoices (Daftra POS)
POS receipts and invoices where the client has no tax number automatically emit the PINT-AE simplified profile when the total is under 10,000 AED — no config needed.
Multi-Branch & Multi-Currency
Multi-branch
Daftra supports branches within a single account (Standard plan and above). Each branch typically shares the parent company's TRN, so a single TrustBill tenant is enough. If a branch has its own separate TRN (rare), set up one TrustBill tenant per branch and connect them with separate API keys.
Multi-currency
Daftra supports invoicing in currencies other than AED — the invoice header carries currency_code and an exchange_rate. The connector applies the exchange rate line-by-line to convert to AED before submission, since PINT-AE requires AED reporting. The original currency is preserved in the invoice notes for reconciliation.
Error Handling
TrustBill errors follow the shape { code, humanMessage, meta? }. The connector writes the code to the trustbill_reject_reason custom field on the Daftra invoice.
| HTTP | Typical code | Daftra root cause | Action |
|---|---|---|---|
| 400 | invalid_body | Client missing tax_number, or line missing tax1_id | Fix the client / line in Daftra; connector auto-retries on next update |
| 400 | arabic_seller_name_required | Company Arabic legal name empty | Fill it in Daftra Settings → Company Info → Arabic Legal Name |
| 400 | totals_mismatch | Daftra per-line rounding vs TrustBill per-invoice | Re-save the invoice in Daftra; totals refresh |
| 400 | unknown_tax | Custom-named Daftra tax row not mapped | Add mapping in TrustBill Sources → Daftra → Tax Mapping |
| 401 | daftra_api_key_invalid | API key revoked or user disabled | Regenerate the API key in Daftra Profile → API Keys, update in TrustBill Sources |
| 401 | daftra_subdomain_wrong | Subdomain changed (rare — e.g. rebrand) | Update the subdomain in TrustBill Sources |
| 403 | kyb_required | TrustBill tenant not yet approved by compliance | Contact TrustBill support |
| 403 | daftra_permission_denied | Integration user lacks Invoicing module access | Grant the user Invoicing → View + Update permissions in Daftra |
| 409 | invoice_mode_mismatch | Daftra production invoices being pushed but TrustBill still in sandbox | Switch mode in TrustBill dashboard |
| 409 | invoice_number_duplicate | Two Daftra branches share a numbering sequence | Use branch prefixes in Daftra Settings → Invoice Numbering |
| 429 | daftra_rate_limited | Daftra API rate limit hit (typical on Basic plan) | Automatic exponential backoff — no user action needed |
Setup Checklist
- Confirm Daftra plan (Standard or higher recommended for webhook support)
- Complete Company Info in Daftra — legal name in both Arabic and English, country = United Arab Emirates, tax_number = 15-digit UAE TRN
- Populate customer TRNs in the Clients module for every B2B customer
- Confirm UAE tax rows exist (5% VAT, Zero-Rated, Exempt, Reverse Charge, Out of Scope) — Daftra ships them on new company setup, older accounts may need to add manually
- Create a dedicated integration user (e.g. "TrustBill Sync") with Invoicing + Clients + Products view/update permissions
- Generate an API key as that user from Profile → API Keys
- Create your TrustBill SME account and complete KYB (trade licence + TRN certificate)
- Open TrustBill Sources → Add Daftra and paste your subdomain + API key
- Copy the webhook URL + secret that TrustBill returns; paste them into Daftra Settings → Webhooks (event: Invoice created / updated)
- Confirm the tax mapping — connector auto-maps standard names, custom names need one-time mapping
- Enable sandbox mode in TrustBill
- Save a test invoice in Daftra — confirm
trustbill_status = Acknowledgedwithin 3 minutes - Reconcile Daftra's Tax Report against TrustBill's Delivered Invoices
- Switch to live mode when FTA registration is complete
Suggested test cases before go-live
- B2B invoice with Arabic + English client names — expect both preserved in PINT-AE XML
- B2C invoice under 10,000 AED (client with no tax_number) — expect simplified profile
- Credit note linked to an earlier invoice — expect matching pair
- Export sale (client country = SA, USA, etc.) — expect
zero_rated_export - Designated-zone customer — expect reverse-charge markers
- Multi-line invoice with mixed VAT (5% + 0%) — expect two
taxCategoryvalues - Recurring invoice cycle — expect fresh FTA submission per cycle
- Multi-currency invoice (USD, converted via Daftra exchange_rate) — expect AED-normalised totals
- POS receipt at < 10,000 AED with anonymous client — expect simplified profile
- Bulk upload of 500 historical invoices via CSV — expect partial success reported per row
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Invoice saved in Daftra, nothing in TrustBill | Webhook not delivered, or on a plan without webhooks | Check Daftra → Settings → Webhooks → Delivery Log; if Basic plan, safety-net poll fires every 15 min |
| Custom fields don't appear on the invoice | Sources setup was skipped or user lacks custom-field permission | Re-run TrustBill Sources → Daftra → Verify Setup; the button re-creates missing fields |
Arabic client name renders as ??? | Rare — pasted from a legacy Windows-1256 source into Daftra | Re-type or paste from a UTF-8 source; Daftra itself stores UTF-8 |
arabic_seller_name_required | Company Arabic legal name empty (very common on English-first setups) | Fill it in Company Info; connector re-emits on next invoice |
Invoice stuck in queued | Insufficient TrustBill credit or KYB pending | Check the TrustBill dashboard banner; top up credit |
Invoice reaches rejected with "buyer_trn_invalid" | Client TRN has spaces or is 14 digits | Fix on the Client record; connector auto-retries on next update |
totals_mismatch on inclusive-tax invoices | Daftra per-line rounding vs TrustBill per-invoice | In Daftra: Settings → Invoicing → Tax Rounding → Total-of-Invoice |
| Webhook fails with 401 after some time | Webhook secret was rotated in TrustBill | Regenerate the webhook secret in TrustBill Sources; paste new value into Daftra webhook config |
| Duplicate FTA submissions after a network blip | Custom middleware forgot the Idempotency-Key | Use daftra::subdomain::invoice::id formula |
| Status write-back not appearing on Daftra invoice | Integration user lacks Invoice update permission | Grant Invoicing → Update on the user's role in Daftra |
Support & Contact
Technical Support
- WhatsApp: +971 52 260 9313
- Email: info@trustbill.ae
- Documentation hub: trustbill.ae/en/documentation
- Daftra integration marketing page: trustbill.ae/en/integrations/daftra
- Zoho integration: /documentation/zoho
- Odoo integration: /documentation/odoo
- QuickBooks Online integration: /documentation/quickbooks-online
- QuickBooks Desktop integration: /documentation/quickbooks-desktop
- Tally integration: /documentation/tally
- ERP Partner API guide: /documentation/erp-partner-api
Escalation
For Daftra go-live escalations, please include: your TrustBill tenant ID, your Daftra subdomain, the Daftra invoice id of the failing invoice, and the timestamp of the failed pipeline run. TrustBill support responds to Daftra-tagged tickets within one business hour during UAE working days.