← Back to Documentation
Zoho logo

Zoho Integration with UAE FTA E-Invoicing via TrustBill

Connect Zoho Books, Invoice, Inventory, Billing, One, CRM, Commerce and Expense to TrustBill for FTA PINT-AE e-invoicing · Version 1.0 · September 2026

Overview

This guide describes how Zoho Books and the wider Zoho Finance / Zoho One ecosystem connect to TrustBill, a UAE FTA-accredited service provider (ASP), so Zoho users can issue PINT-AE compliant e-invoices without leaving Zoho.

Zoho Books UAE edition already handles VAT, TRN, and VAT201 filing. It does not ship with native Peppol / PINT-AE e-invoicing. TrustBill sits between Zoho and the FTA: invoices are pushed from Zoho Books via the Marketplace app (or webhooks / Deluge / Zoho Flow), translated to PINT-AE XML, validated in real time, delivered over the Peppol network via a certified ASP (Tron-Stride or Storecove), and the FTA acknowledgement is written back into a custom field on the Zoho invoice.

What this integration delivers

  • Native Zoho Marketplace app — installed with two clicks, no code
  • OAuth 2.0 authentication — no API keys stored inside Zoho
  • Sales invoices, credit notes and recurring invoices all mapped to PINT-AE document types
  • UAE VAT treatments (Standard 5%, Zero-Rated, Exempt, Reverse Charge, Designated Zone) mapped to FTA tax categories automatically
  • Live FTA status written back into custom fields on the Zoho invoice (TrustBill Status, TrustBill Ack Ref)
  • Bulk migration for historical Zoho invoices via CSV
  • Works with Zoho Books multi-organization setups (one Zoho org per TRN)
  • Compatible with Zoho Flow, Zoho CRM and Zoho Inventory as upstream sources

Supported Zoho Products & Editions

Zoho Books is the system of record for VAT and invoicing. Every other Zoho app in the list below is supported through Zoho Books — an invoice created in CRM, Inventory or Commerce lands in Books, and Books is what TrustBill reads.

Zoho productRole in the flowSupport level
Zoho Books (UAE edition)System of record — invoices, VAT, TRN, VAT201Full — primary integration surface
Zoho InvoiceStandalone invoicing (no VAT ledger)Supported — recommend migrating to Zoho Books for UAE VAT compliance
Zoho InventorySales orders → Books invoicesFull — TrustBill reads from Books after the order is invoiced
Zoho Billing (formerly Subscriptions)Recurring / subscription invoices synced to BooksFull — see Recurring Invoices
Zoho CRMQuotes / Sales Orders → Books invoicesFull — via Zoho CRM ↔ Books sync
Zoho CommerceE-commerce orders → Books invoicesFull — via Zoho Commerce ↔ Books sync
Zoho ExpenseVendor bills / reimbursements → BooksSupported for purchase-side e-invoicing
Zoho Finance PlusBundle (Books + Inventory + Billing + Expense + Checkout)Full — all components covered
Zoho OneFull suite — includes all of the aboveFull — TrustBill Marketplace app is Zoho One compatible
Zoho FlowNo-code automation between Zoho apps and TrustBillFull — TrustBill Flow connector available

Zoho Books UAE edition is required. The connector reads tax treatments, TRN and VAT rates that only exist on the UAE-localised edition. If your Zoho Books organization is set to a different country, switch it to Settings → Organization → Country of Operation = United Arab Emirates before installing the connector (this can only be done at organization creation on new Zoho Books orgs).

Data Center & Residency

Zoho does not (yet) host data in the UAE. The TrustBill Marketplace app works across all Zoho data centers, and TrustBill stores the invoice data in the UAE (AWS me-central-1) once it reaches our platform.

Zoho DCDomainRecommended for UAE?
Zoho Indiabooks.zoho.inYes — closest DC, lowest latency to UAE
Zoho Saudi Arabiabooks.zoho.saYes — GCC region
Zoho EUbooks.zoho.euSupported
Zoho USbooks.zoho.comSupported
Zoho Australiabooks.zoho.com.auSupported
Zoho Japan / China / Canadabooks.zoho.jp / com.cn / caSupported

The Marketplace app auto-detects your Zoho DC from the OAuth handshake and points to the correct region-specific Zoho Books API base URL (e.g. https://www.zohoapis.in vs https://www.zohoapis.com). No manual configuration required.

Prerequisites

On the Zoho side

  • An active Zoho Books UAE organization with Settings → Taxes → VAT enabled
  • Valid 15-digit UAE TRN saved at Settings → Organization → VAT Registration Number
  • Contacts populated with a TRN (for B2B), country, billing address and correct Tax Treatment
  • Tax rates configured: Standard Rate (5%), Zero Rate (0%), Exempt (—)
  • Admin-level Zoho user (only an Admin can install a Marketplace app)
  • Optional: Zoho Flow subscription if using the no-code path

On the TrustBill side

  • A TrustBill SME account (one account = one TRN = one Zoho Books organization)
  • Completed KYB (business verification) — trade licence + TRN certificate uploaded
  • Submission mode set to test or sandbox during onboarding, live for production
  • OAuth client credentials are provisioned automatically when you install the Marketplace app; no manual API key needed

Integration Architecture

The Zoho ↔ TrustBill integration is event-driven where possible (Zoho webhooks) and falls back to polling only for status write-back.

Outbound flow (Zoho Books → TrustBill → FTA)

  1. An invoice moves to status Sent in Zoho Books (draft invoices are not pushed).
  2. Zoho fires the invoice.sent webhook (registered by the Marketplace app during install).
  3. TrustBill's Zoho webhook receiver fetches the full invoice + line items + contact via the Zoho Books REST API, using the OAuth access token.
  4. Payload is translated into TrustBill's InvoiceCreateInput shape.
  5. TrustBill calls its own POST /v1/invoices internally — stored as draft.
  6. If auto-submit is enabled on the TrustBill tenant, POST /v1/invoices/submit fires immediately; otherwise a TrustBill operator can review first.
  7. Pipeline runs: queued → transformed → validated → delivered (PINT-AE XML built, Schematron-validated, handed to the ASP).
  8. ASP forwards the XML to the FTA over Peppol.

Inbound flow (FTA → TrustBill → Zoho Books)

  1. The ASP posts an inbound webhook to TrustBill when the FTA acknowledges or rejects the invoice.
  2. TrustBill verifies the ASP's HMAC signature and updates the status to acknowledged or rejected.
  3. TrustBill's Zoho worker calls PUT /invoices/{id} to update the custom fields cf_trustbill_status and cf_trustbill_ack_ref on the Zoho invoice.
  4. Zoho users see the status in the invoice list view (once you add the custom fields to the column layout).

Connection Methods

Six ways to connect Zoho to TrustBill, ordered from easiest (no-code) to most flexible (custom):

1. Zoho Marketplace App (recommended)

Install TrustBill E-Invoicing for Zoho Books from the Zoho Marketplace. OAuth 2.0 handshake, custom fields auto-created, webhooks auto-registered, custom button added to the invoice screen.

  • No code, no server, no keys to manage
  • Works on all Zoho DCs (US/EU/IN/SA/AU/JP/CA/CN)
  • Adds a Submit to FTA button on every invoice
  • Adds a TrustBill widget on the invoice sidebar showing FTA status + timeline
  • Compatible with Zoho One / Zoho Finance Plus bundles

2. Zoho Webhooks (direct)

If you cannot install a Marketplace app (e.g. locked-down org), register the TrustBill webhook manually at Settings → Automation → Webhooks. Point it at your TrustBill tenant's dedicated Zoho webhook URL.

  • Send full JSON payload on invoice.sent, invoice.updated, creditnote.created
  • Add a Zoho Workflow Rule as the trigger (e.g. "when Invoice Status becomes Sent")
  • TrustBill signs its inbound webhooks with HMAC-SHA256; verify in your Zoho workflow if you loop back

3. Deluge Custom Function

Write a small Deluge script attached to a Zoho Books workflow. The script calls the TrustBill REST API directly when an invoice is marked Sent.

  • Best when you need custom logic (e.g. skip certain customers, transform line notes)
  • You manage the OAuth token / API key inside Zoho's Secret Store
  • Use invokeUrl with the TrustBill Bearer JWT
  • Sample Deluge snippet available from TrustBill support

4. Zoho Flow (no-code)

TrustBill publishes a Zoho Flow connector — drag-drop a "New Zoho Books invoice → Create TrustBill invoice → Submit" flow in minutes.

  • Best for orgs that already standardise integrations on Zoho Flow
  • Includes retry, error branching, and Slack / email notification on failure
  • Works across Zoho apps — e.g. Zoho CRM Quote → Books Invoice → TrustBill in one flow

5. CSV Export

Export invoices from Sales → Invoices → Export and upload the file to TrustBill's bulk import endpoint. Best for one-off historical migrations.

  • Zero technical setup
  • Runs through TrustBill's POST /v1/invoices/bulk — up to 1,000 rows / 5 MB per file
  • See Bulk Migration

6. Upstream: Zoho CRM / Inventory / Commerce

Sales orders or quotes originating in CRM, Inventory or Commerce sync to Books as invoices via Zoho's built-in module sync. TrustBill still reads from Books — no separate connector required.

  • Zoho CRM → Books: enable Sync Setup → Sales Order → Invoice
  • Zoho Inventory → Books: automatic when both apps use the same organization
  • Zoho Commerce → Books: enable Settings → Integrations → Zoho Books

Which method should I use?

For 95% of Zoho Books UAE customers, install the Marketplace app. Use Zoho Flow if you already standardise on it. Use Deluge only if you need custom logic (e.g. exclude specific customer groups). Use webhooks only when the Marketplace app is blocked by your Zoho admin policy.

Authentication (OAuth 2.0)

The Zoho side uses OAuth 2.0 authorization code flow. The Marketplace app requests these scopes on install:

ZohoBooks.invoices.READ ZohoBooks.invoices.UPDATE (for write-back) ZohoBooks.creditnotes.READ ZohoBooks.contacts.READ ZohoBooks.settings.READ (tax rates, organization) ZohoBooks.settings.CREATE (create custom fields on install) ZohoBooks.customviews.CREATE (add TrustBill view to invoice list)

TrustBill stores only the refresh_token. Access tokens are minted on demand and cached in memory for their 60-minute lifetime.

The TrustBill side (internal, invisible to the Zoho user) uses Bearer JWT — the Marketplace app forwards Zoho payloads to the TrustBill API with a per-tenant JWT.

Idempotency-Key derivation for Zoho

Every TrustBill write endpoint requires an Idempotency-Key. For Zoho, derive it from the Zoho invoice ID (stable across renumbering):

Idempotency-Key: zoho::{organization_id}::{invoice_id}

Zoho webhook retries (up to 5) reuse the same key — TrustBill returns the cached response, no duplicate FTA submission.

Zoho Books → PINT-AE Field Mapping

The connector translates Zoho Books' JSON invoice shape into TrustBill's InvoiceCreateInput, which TrustBill then renders into PINT-AE XML.

Header-level mapping

Zoho Books fieldTrustBill fieldNotes
invoice_numbernumber1–64 chars, unique per tenant + mode
dateissueDateISO YYYY-MM-DD (already Zoho's format)
due_datedueDateOptional
currency_codecurrencyMust be AED; multi-currency invoices converted at Zoho's exchange_rate
Organization.vat_reg_noseller.trn15-digit UAE TRN (Settings → Organization)
customer_namebuyer.nameContact display name
Contact.tax_reg_nobuyer.trn15-digit TRN; leave empty for B2C contacts
Contact.tax_treatmentbuyer.taxScheme hintSee VAT Treatment Mapping
Contact.billing_addressbuyer.address.{line1,line2,city,country}Country normalised to ISO 3166-1 alpha-2
reference_numbersellerInvoiceReferencePreserved for traceability
notes / termsnotesConcatenated; visible in FTA-facing XML
invoice_idIdempotency keyUsed as zoho::<org_id>::<invoice_id>

Line-level mapping (line_items[])

Zoho Books fieldTrustBill fieldNotes
name / descriptionlines[].descriptionUses name; falls back to description. Supports Arabic.
quantitylines[].quantityMust be > 0
ratelines[].unitPriceVAT-exclusive; connector strips VAT if is_inclusive_tax = true
unitlines[].unitZoho unit code mapped to UN/ECE Rec 20 (Nos → C62, kg → KGM, hrs → HUR)
tax_percentagelines[].vatRateZoho stores as percentage (5), connector converts to fraction (0.05)
tax_treatment / line vat_treatmentlines[].taxCategoryMapped via the table in the next section
discountlines[].discountAmountPer-line discount, applied before VAT (Zoho's absolute or percent → connector normalises)
item_id / skulines[].sellerItemIdPreserved for traceability

Totals are computed server-side

Do not send subtotal / vat_amount / total. TrustBill re-computes totals from lines[] and returns them so Zoho can reconcile. If Zoho's total differs from TrustBill's by more than ±0.01 AED (usually a rounding-mode mismatch on inclusive-tax invoices), the connector logs a variance and blocks submission until the invoice is corrected in Zoho.

Create Invoice (draft)

Endpoint: POST /v1/invoices

A real Zoho Books invoice mapped to the TrustBill payload. Zoho invoice: INV-002194 — Sale of software licences to a Dubai buyer at 5% VAT.

Request body

{ "number": "INV-002194", "issueDate": "2026-09-08", "dueDate": "2026-10-08", "currency": "AED", "invoiceType": "sale", "buyer": { "name": "Meraas Digital LLC", "trn": "100456789200003", "country": "AE", "email": "ap@meraasdigital.example", "address": { "line1": "The Greens, Building 7, Office 305", "city": "Dubai", "country": "AE" } }, "seller": { "name": "Zoho Trader LLC", "trn": "100100100100007", "country": "AE" }, "lines": [ { "description": "Microsoft 365 Business Standard — Annual (5 seats)", "sellerItemId": "M365-BS-5", "quantity": 5, "unit": "C62", "unitPrice": 480.00, "vatRate": 0.05, "taxCategory": "standard_5" } ], "sellerInvoiceReference": "Zoho invoice_id 5f7a9c...", "notes": "Renewal — 30 days net" }

Response (201 Created) — abbreviated:

{ "id": "e4b1f9c0-....-uuid", "number": "INV-002194", "status": "draft", "invoiceType": "sale", "totals": { "subtotal": 2400, "tax": 120, "total": 2520, "currency": "AED" }, "pipeline": [], "errors": [], "submissionMode": "sandbox", "source": "zoho-marketplace-app" }

Credit Notes & Debit Adjustments

Zoho Books has a first-class creditnotes API. Debit adjustments on the purchase side are handled via vendorcredits or as expense adjustments — the connector maps both:

Zoho objectinvoiceTypeRequired extra fields
Credit Note (applied to invoice)credit_notereferencedInvoiceNumber = original invoice number, reasonCode
Vendor Credit / Debit Note (purchase side)debit_notereferencedInvoiceNumber = original vendor bill number
Standalone Credit Note (no reference)credit_notereasonCode = OtherAdjustment

Sign convention: Zoho creditnotes carry positive quantities and positive rates. Send the same to TrustBill — do not negate. The invoiceType tells TrustBill and the FTA that the document reverses the reference invoice; PINT-AE handles the sign in the XML.

Recurring & Subscription Invoices

Zoho Books and Zoho Billing (formerly Subscriptions) generate child invoices from a recurring profile. The connector treats each generated invoice as a fresh event:

  • Zoho fires invoice.created and (once sent) invoice.sent for every generated child
  • Each child invoice gets its own invoice_id — so a fresh Idempotency-Key, a fresh TrustBill draft, a fresh FTA submission
  • The recurring profile itself is not pushed to TrustBill — only the concrete invoices it produces
  • For Zoho Billing subscriptions with pro-rated changes, ensure the invoice line description carries the pro-ration period (Zoho does this by default)

Auto-submit tip: for recurring invoices, enable TrustBill's auto-submit on ingest setting. Otherwise every child sits as a draft in TrustBill waiting for a human to click Submit — defeats the purpose of recurring.

Submit Invoice(s) for Delivery

Creating a draft in TrustBill does not deliver the invoice to the FTA. Submission is an explicit second call so a user can review before sending.

Endpoint: POST /v1/invoices/submit

{ "ids": ["e4b1f9c0-....-uuid"] }

Accepts 1–200 UUIDs per call. Non-draft invoices are silently skipped, so retry is safe.

Zoho Marketplace app UX: the app adds a Submit to FTA button on every Zoho invoice screen — one click, no need to jump to the TrustBill dashboard. Auto-submit-on-ingest is the default for tenants with more than 50 invoices/month.

Status Tracking & Custom Field Write-back

On install, the Marketplace app creates three custom fields on the Zoho Books Invoice module. Every TrustBill status change writes back to these fields via the Zoho Books API.

TrustBill statusMeaningZoho custom field written
draftCreated in TrustBill, not submittedcf_trustbill_status = Draft
queuedSubmitted, waiting for pipelinecf_trustbill_status = Queued
validatedPassed schema + Schematroncf_trustbill_status = Validated
deliveredSent to FTA via ASPcf_trustbill_status = Delivered
acknowledgedFTA confirmed receipt / validitycf_trustbill_status = Acknowledged, cf_trustbill_ack_ref = <FTA ref>
rejectedFTA or ASP rejected the invoicecf_trustbill_status = Rejected, cf_trustbill_reject_reason = <code>

Add the three custom fields to the invoice list column layout: Invoices → Column Layout → Add Column → cf_trustbill_status / cf_trustbill_ack_ref / cf_trustbill_reject_reason. You can then filter and colour-code by status directly inside Zoho.

Bulk Migration from Zoho Books

To migrate historical Zoho Books invoices (up to 12 months back) into TrustBill:

  1. In Zoho Books: Sales → Invoices → filter by date range → Export → CSV
  2. Run the TrustBill zoho-csv-normaliser script to remap Zoho's column headers to the TrustBill schema below
  3. Upload in test mode via POST /v1/invoices/bulk
  4. Review the summary; repeat in sandbox and live

TrustBill CSV column headers

number,issueDate,dueDate,invoiceType,currency,sellerTrn,sellerName,buyerTrn,buyerName,buyerCountry,buyerAddressLine1,buyerCity,lineDescription,lineQty,lineUnit,lineUnitPrice,lineVatRate,lineTaxCategory,referencedInvoiceNumber,notes
LimitValue
Max rows per file1,000 invoices
Max file size5 MB
Multiple lines per invoiceRepeat the number column
Partial successYes — bad rows reported without rolling back the batch

Test / Sandbox / Live Modes

Every TrustBill tenant has one active submission mode. Invoices are hard-partitioned — a live invoice cannot be viewed from sandbox, and vice-versa.

ModePurposeReaches FTA?
testLocal integration testing — no ASP callNo
sandboxEnd-to-end dry run against the ASP sandboxFTA sandbox only
liveReal, legally binding e-invoicingYes — the FTA production network

Zoho best practice: keep the connector in sandbox for the full first VAT-return period. Reconcile TrustBill's "Delivered invoices" report against Zoho Books' Reports → Taxes → VAT Return before switching to live.

VAT Treatment Mapping

Zoho Books UAE captures the VAT scheme as tax_treatment on the contact and (optionally) as vat_treatment on the line. Map each Zoho treatment to a TrustBill taxCategory once, at connector setup:

Zoho tax_treatment / vat_treatmentvatRateTrustBill taxCategory
vat_registered0.05standard_5
zero_rated (export)0zero_rated_export
zero_rated (healthcare)0zero_rated_healthcare
zero_rated (education)0zero_rated_education
exempt (financial)0exempt_financial
exempt (residential rent)0exempt_residential_rent
designated_zones0reverse_charge_designated_zone
out_of_scope0out_of_scope
non_gcc0zero_rated_export
gcc_vat_registered0.05standard_5
gcc_vat_not_registered0zero_rated_export

Where line-level vat_treatment exists, it wins over the contact-level default (this matches Zoho's own precedence rule). If a line has no explicit treatment and the contact treatment is unmapped, the connector flags the invoice and blocks submission.

UAE-Specific Scenarios

Free Zone / Designated Zone sellers

Set Settings → Organization → Free-Trade Zone = Yes. The connector propagates it as seller.designatedZone: true so PINT-AE emits the free-zone declaration correctly.

Margin scheme (used cars, antiques, second-hand goods)

Zoho Books does not have a built-in "margin scheme" flag. TrustBill's Marketplace app adds a per-item custom field cf_margin_scheme — when checked, the connector sends lines[].marginScheme: true and uses the item's Purchase Rate to compute the margin base.

Reverse charge on imports

Purchase invoices where the vendor tax_treatment = non_gcc and the line vat_treatment = "Purchase from Outside GCC — Reverse Charge" are mapped to invoiceType: "purchase" + taxCategory: "reverse_charge_designated_zone". TrustBill emits the required ReverseCharge markers.

B2C simplified tax invoices

Zoho contacts with no TRN and tax_treatment = non_gcc or vat_not_configured are treated as B2C. Invoices under 10,000 AED are simplified tax invoices under FTA rules; TrustBill emits the correct PINT-AE profile automatically.

Multi-organization Zoho Books

Each Zoho Books organization = one TRN = one TrustBill tenant. Install the Marketplace app once per organization. The app stores the mapping zoho_org_id → trustbill_tenant_id so you can run several TRNs from a single Zoho login.

Error Handling

TrustBill errors follow the shape { code, humanMessage, meta? }. The Marketplace app surfaces the humanMessage in the invoice sidebar widget and writes the code to cf_trustbill_reject_reason.

HTTPTypical codeZoho root causeAction
400invalid_bodyZoho contact missing TRN, or invoice line missing tax rateFix the contact / line in Zoho; the app auto-resubmits
400totals_mismatchZoho inclusive-tax invoice rounded per-line; TrustBill rounded per-invoiceSet Zoho Settings → Preferences → Tax → Round-off preference to Total of the Invoice
400unknown_tax_treatmentCustom tax treatment on the contact not in the connector's mappingAdd it in TrustBill Marketplace app → Settings → Tax Treatment Mapping
401zoho_oauth_expiredRefresh token revoked (admin rotated it in Zoho)Reconnect the Marketplace app in Settings → Integrations → TrustBill → Reconnect
403kyb_requiredTrustBill tenant not yet approved by complianceContact TrustBill support
409invoice_mode_mismatchZoho is on live invoices but tenant still in sandboxSwitch mode in TrustBill dashboard
409invoice_number_duplicateTwo Zoho orgs pushed the same invoice numberUse per-org numbering prefixes in Zoho Settings → Preferences → Invoices → Prefix
413bulk_payload_too_largeCSV export > 1,000 rows or > 5 MBSplit by month and re-upload
422idempotency_requiredCustom Deluge script missed the headerAlways send Idempotency-Key = zoho::org::invoice_id

Setup Checklist

  1. Confirm Zoho Books org is UAE edition and Country of Operation = United Arab Emirates
  2. Fill in Organization TRN and VAT registration date in Zoho Books settings
  3. Confirm all UAE contacts have a tax_treatment and (for B2B) a valid 15-digit TRN
  4. Create your TrustBill SME account and complete KYB (trade licence + TRN certificate)
  5. Install the TrustBill Marketplace app in Zoho Books (Marketplace → TrustBill E-Invoicing → Install)
  6. Approve the OAuth scopes requested by the app (must be a Zoho Admin)
  7. Confirm custom fields cf_trustbill_status, cf_trustbill_ack_ref, cf_trustbill_reject_reason now exist on the Invoice module
  8. Add the custom fields to the invoice list column layout
  9. Enable sandbox mode in the TrustBill dashboard
  10. Send a test invoice in Zoho Books — mark it Sent → confirm it reaches acknowledged in TrustBill within 3 minutes
  11. Reconcile Zoho's VAT Return report against TrustBill's "Delivered invoices" report
  12. Switch to live mode when FTA registration is complete

Suggested test cases before go-live

  • B2B invoice, single line, 5% VAT — expect acknowledged
  • B2C invoice under 10,000 AED, no TRN — expect PINT-AE "simplified" profile
  • Credit note applied to an earlier invoice — expect matching pair
  • Export sale (contact tax_treatment = non_gcc) — expect zero_rated_export
  • Designated-zone sale — expect reverse-charge markers
  • Multi-line invoice with mixed VAT rates (5% + 0%) — expect two taxCategory values
  • Recurring invoice child — expect fresh FTA submission per child
  • Inclusive-tax invoice — expect totals to match Zoho within 0.01 AED
  • OAuth token expiry — expect automatic refresh, no user action
  • Bulk upload of 500 historical invoices via CSV — expect partial success reported per row

Troubleshooting

SymptomLikely causeFix
Marketplace app install failsUser is not a Zoho AdminLog in as an Admin (Marketplace apps require org-wide scope)
Invoice sent in Zoho, nothing in TrustBillWebhook rejected (Zoho retries 5× then gives up)Check Settings → Automation → Webhook Logs in Zoho; look for 4xx responses
Custom fields don't appearApp scope missing settings.CREATERe-install with all requested scopes approved
Invoice stuck in queuedInsufficient TrustBill creditCheck the TrustBill dashboard banner; top up credit
Invoice reaches rejected with "buyer_trn_invalid"Zoho contact TRN is 14 digits or has spacesFix in Zoho: Contacts → Edit → Tax Registration Number. Connector auto-retries.
Arabic descriptions render as ???Zoho line description was pasted from a legacy Windows-1256 sourceRe-type or paste from a UTF-8 source; Zoho itself stores UTF-8
totals_mismatch on inclusive-tax invoicesZoho's per-line rounding vs TrustBill's per-invoice roundingZoho: Settings → Preferences → Tax → Amount Rounding → Total of the Invoice
Duplicate FTA submissions after a network blipCustom Deluge script forgot the Idempotency-KeyUse zoho::org::invoice_id derivation
Status write-back not appearing on Zoho invoiceOAuth scope missing invoices.UPDATEReconnect the Marketplace app and re-approve scopes

Support & Contact

Technical Support

Escalation

For go-live escalations, include your TrustBill tenant ID, the Zoho organization ID + invoice ID of the failing invoice, and the timestamp of the failed pipeline run. TrustBill support responds to Zoho-tagged tickets within one business hour during UAE working days.