IntegrationsAccounting & finance

Zoho Books
Zoho Books is cloud accounting software for small and growing businesses — sole traders, limited companies, and the accountants who look after them. Invoicing, quotes, bills and purchase orders, bank reconciliation, inventory, projects and time billing, with UK Making Tax Digital and VAT filing built in.
One thing catches people out. Zoho runs regional data centres, so a UK or EU organisation sits on zohoapis.eu and its tokens only work against that region — point a connector at the wrong one and it never gets in. We sort that out at setup.
The stat card
You raise an invoice at 10:04. Everything below is the kind of fact that tells you when it will show up on the board in reception — a number or a named mechanism, measured on a live production tenant, not quoted off a brochure. A dash means we don't know yet. We won't guess.
- Refresh speed
- Every 15 minutes, 06:00–18:00 Mon–Fri (Europe/London), incremental watermark sync with a 10-minute overlap buffer — live production cadence, not a lab number.
- Read coverage
- 25 objects synced of ~35 the API exposes: contacts, invoices, bills, items, expenses, estimates, credit notes, debit notes, purchase orders, sales orders, projects, chart of accounts, bank accounts, bank transactions, journals, customer payments, vendor payments, taxes, currencies, organisations, users, and the four recurring/retainer document types. Not synced: fixed assets, time entries, bank rules, custom modules, reporting tags.
- Incremental vs full-load
- 13 objects sync incrementally via the API’s last_modified_time filter (all the transactional documents: invoices, bills, expenses, estimates, credit/debit notes, purchase/sales orders, journals, recurring docs, retainer invoices). 12 objects have no modified-time filter in the API and re-pull in full each run (contacts, items, payments, bank transactions, and the small settings tables).
- Write-back
- Yes. Reverse-ELT pushes changed and new records back into Zoho Books (live in production: customer/supplier contacts, changed-then-new ordering, dry-run gated). Curated gateway actions on top: raise invoices, draft quotes/estimates, email customer statements, initiate GoCardless direct-debit collection — all approval-gated. The connector itself supports POST/PUT.
- Deletes handling
- Complete-ID compare, nightly: re-list every ID in Zoho, remove warehouse rows Zoho no longer has, guarded against sync/VTT overlap. The API offers no delete audit log or soft-delete surface, so id-compare is the honest ceiling. Status: built, awaiting rollout — not yet merged/scheduled.
- Auth
- OAuth 2.0 (authorisation-code grant) with automatic refresh-token renewal; region-specific accounts servers; scoped per module (ZohoBooks.invoices.ALL, etc.); every call carries organization_id. We ship OAuth start/callback helper scripts.
- Rate-limit reality
- 100 requests/minute per organisation; daily call caps by Zoho plan (Free 1,000 / Standard 2,000 / Professional 5,000 / Premium+ 10,000); 5–10 concurrent. Separate, aggressive OAuth refresh throttle — repeated grants lock you out 20–30+ minutes. The connector honours Retry-After on 429, backs off with exponential retry, and shares one cached token instead of re-granting per request.
- Historical backfill
- Full history on first sync: full-load mode walks every page (200 records/page) with no API depth limit; practical bound is the daily call cap on very large books. Watermarks take over from run two.
Rated 18/25
Five axes, nought to five each, against a fixed rubric. Only what is built and running for a real customer scores — a thing the API would merely permit, or that we have written but not yet switched on, takes the lower rung. Nothing is rounded up.
- Coverage
- 4 / 5
25 of ~35 objects, all core accounting; fixed assets, time entries, bank rules, custom modules named as gaps.
- Freshness
- 3 / 5
15-minute production incremental on all transactional documents, but contacts/payments/bank transactions are full-load-only in the API — capped at 3 by the rubric.
- Write-back
- 4 / 5
Live reverse-ELT plus curated gateway actions (invoices, statements, direct-debit collection); not full-surface — reconciled transactions are immutable via API (UI only), and writes are approval-gated by design.
- Deletes fidelity
- 2 / 5
Nightly complete-ID reconcile built but not yet merged/scheduled — scores the lower rung until live (“built, awaiting rollout”). Ceiling is 3: the API has no audit log.
- Setup friction
- 3 / 5
Self-serve OAuth app + org ID + region + scopes with our helper scripts; under an hour, but the refresh-token throttle punishes mistakes.
What lands in the model
It all lands in the Tesylate Data Model — one shape for everybody's data, so an invoice is an invoice whether it came out of Zoho Books or a spreadsheet on somebody's desktop. That is why dashboards, Matrix reports and AI answers work the same on every source. You never see the plumbing.
| Zoho Books objects | Where they land |
|---|---|
| Invoices, credit notes, sales orders, estimates | Sales transactions and pipeline documents |
| Bills, debit notes, purchase orders, expenses | Purchase and cost transactions |
| Customer payments, vendor payments, bank transactions | Cash movements and settlement |
| Contacts | Customers and suppliers |
| Items | Products and services |
| Chart of accounts, taxes, currencies | Accounting dimensions |
| Projects | Project entities |
What you can then do
- Ask Claude or ChatGPT which customers are over 60 days, and get the answer off your live Zoho Books data — that is what MCP does, it lets an assistant read the model.
- Pivot sales, costs and cash by customer, item, account or month in a Matrix report, then drill down until you are looking at the invoice itself.
- The same numbers on a wallboard, in your dashboard and in a morning email snapshot, all off the same 15-minute cycle.
- App Builder modules (small apps you build without code) that look up a live customer, item or invoice balance while your team is on the phone.
- Zoho Books × Simpro (field service) in one warehouse, in production today, so a job and the invoice for it finally land in the same report.
The honest gaps
Where this connector falls short today. When these change, so does the score.
- Not synced: fixed assets, time entries, bank rules, custom modules and reporting tags.
- Contacts, items, payments and bank transactions re-pull in full every run. The Zoho API gives them no modified-time filter, so there is nothing to be incremental against.
- The nightly deletes tidy-up is written but not switched on yet. Until it is, an invoice you delete in Zoho still sits in the warehouse.
- Once a transaction is reconciled, the Zoho API will not let anything change it. Write-back cannot touch it, and nor can we. That one you do in Zoho.