ThatFiscal Knowledge Base

Zoho Books ZIMRA Fiscalisation — Integration Guide

~10 minutes · native

Overview. Two Zoho Workflow Rules (one for invoices, one for credit notes) each fire a Webhook to ThatFiscal. No plugin portal, no extra user accounts — just your API key and two custom fields.

Before You Begin: Zoho Books admin access and your ThatFiscal API key (Portal → Settings & Branding).

Step 1

Create the Buyer TIN and VAT Custom Fields

Zoho Books has no TIN or VAT field for Zimbabwe, so you must add them once. Go to Settings → Preferences → Invoices → Field Customization → + New Custom Field and create two text fields on the Invoice module:

LabelAPI Name to UseWhat It Carries
Buyer TINcf_tinThe buyer's 10-digit ZIMRA TIN
Buyer VATcf_vatThe buyer's VAT registration number

Zoho derives the API name from the label, so a label of "Buyer TIN" gives you cf_buyer_tin. That is fine — we accept any of cf_tin, cf_buyer_tin, cf_customer_tin, cf_tin_number or cf_tax_id for the TIN, and cf_vat, cf_buyer_vat, cf_vat_number, cf_vat_no or cf_customer_vat for the VAT number. Check the exact API name Zoho generated under Field Customization before you go live.

Step 2

Add the Line-Item Custom Fields (Optional)

Under Settings → Preferences → Items → Field Customization (line-item level) add cf_hs_code for the HS code and cf_zimra_tax_id for the ZIMRA tax ID. Zoho's built-in hsn_or_sac field only exists in the India, Kenya and South Africa editions — a Zimbabwe organisation will not have it, which is why the custom field matters. If you skip both, we auto-fill the HS code and resolve the tax ID from the rate.

Step 3

Create the Invoice Webhook

Zoho Books → Settings → Automation → Workflow Rules → New. Module: Invoices. Trigger: When an Invoice Is Created or Edited, condition Status Is Sent (or your preferred point of no return).

Step 4

Point It at ThatFiscal

Action → Webhook → URL https://api.thatfiscal.com/webhooks/zoho, method POST, format JSON, body Invoice JSON (all fields). Add header X-Api-Key: tf_…. Sending all fields matters: the custom fields arrive in custom_field_hash and custom_fields, and line-level ones in item_custom_fields. Zoho never exposes them as plain root cf_* keys, so a hand-trimmed payload silently loses the TIN.

Step 5

Repeat for Credit Notes

Second Workflow Rule on the Credit Notes module, same webhook URL and header. ThatFiscal detects the document type and fiscalises it as a credit note with the correct sign. Always raise the credit note from the original invoice so Zoho fills invoices_credited — that array is how we link back. A free-text reference_number is used only as a fallback.

Step 6

Send a Test Invoice

Mark any invoice Sent. It appears in Portal → Invoices with QR + verification code. Add the QR to your Zoho template using the fields we email back, or let customers verify via the code.

Receipt Timing: we deliberately ignore Zoho's date, created_time and last_modified_time when stamping the receipt. Zoho's date is a date with no time, which resolved to midnight — earlier than the fiscal day opening (RCPT014) and earlier than the previous receipt of the day (RCPT030), which blocked every Zoho invoice after the first one. The receipt is stamped with the real submission time instead. If you genuinely need to control it, send a full datetime in an invoice_datetime field.
Discounts and Shipping: both are carried through. A Zoho percentage discount ("10%") is applied as a percentage of the line total, not as a flat $10, and a shipping charge becomes its own line so the receipt still balances (RCPT039).
HS Codes in Zoho: use the cf_hs_code line-item custom field — or ignore it and let ThatFiscal's auto-fill handle it (Items Master → Zimbabwe classifier → your default).
Need a Hand? Email support@thatfiscal.com or call +263 78 674 5282. If it is quicker, we will do the setup with you on the call.
← All Knowledge Base Guides