Zoho Books Export Limits: the 25,000-Row Cap and How to Get All Your Data Out

You needed three years of invoices in a spreadsheet, hit Export, and got a file that stops dead at 25,000 rows. Or you exported the same report four times while tweaking a filter and Zoho Books refused to give you a fifth. Two different caps, in two different parts of the product, and neither is a bug you can click past.

This post covers what each limit is and five routes around it: slicing the export by date, the official backup, the REST API, Power Query against it, and Zoho Analytics. For the wiring walkthrough, see the Zoho Books to Excel tutorial.

The two limits are not the same limit

Most of the confusion online comes from mixing them up: the documented cap applies to module data export (the Invoices, Bills or Contacts list), the undocumented one to report exports. Separate mechanisms, separate parts of the product.

The 25,000-row module cap

On the Export Data help page:

"You can only export the first 25,000 rows of data from Zoho Books. If you've recorded data more than this limit, you must initiate a backup of your data."

No plan qualification is given, and no page says the cap varies by tier. Note the wording: the first 25,000 rows. There is no error and no empty file — you get a truncated export that looks complete, and one that reconciles to nothing with no banner telling you why.

The path, verbatim: "In the module's list page, click the More icon in the top right corner and select the Export option from the dropdown." The dialog offers a transaction status filter, a date range, an export template, an option to include personally identifiable information (PII), and a password to encrypt the file. Formats: "The available options include CSV, XLS, and XLSX formats" — no PDF for module data.

The report export limit nobody documents

Export reports repeatedly and Zoho Books throws:

"You can only export a maximum of 5 reports that has more than 2000 rows, in a day."

That grammar is Zoho's, not mine. The caveat that matters: Zoho does not document this limit anywhere in its help centre. The only sources are users quoting the in-product error in its community forums — no staff confirmation, no dates. Treat it as behaviour people hit, not published policy, and get your report filters right first, because you have roughly five swings at anything sizeable.

Route 1: split the export by date range

The dialog accepts a date range, so the cap is per file, not per year. Open the module list page (e.g. Invoices), click the More icon top right, choose Export, set the date range to a quarter — a month if you are high-volume — and pick CSV. Repeat per period with consistent names: invoices-2025-Q1.csv. If a file comes back at exactly 25,000 data rows, slice that period finer.

To combine them, do not copy-paste. Put every file in one folder and use Power Query's From Folder connector — Data > Get Data > From File > From Folder — which appends them all and re-reads new files on refresh (the mechanics, plus Power Query for beginners if it is new to you).

Then fix two things before you total anything. Amounts and dates often arrive as text: with amounts in column D, =SUMPRODUCT(--ISTEXT(D2:D5000)) returns how many of those cells Excel is treating as text, and 0 on a clean column — convert them properly rather than reformatting (cleaning messy data in Excel). And overlapping date ranges give you duplicate invoice numbers, so deduplicate on invoice number plus amount.

Route 2: the official escape hatch — a full data backup

Zoho's own answer to "more than 25,000 rows" is a backup: Settings (top right) > Data Backup (under Developer Space) > Backup Your Data. It takes roughly 30 minutes; the link is emailed to your registered address. "The compressed file will consist of CSV files that belong to various modules of Zoho Books" — one ZIP, many CSVs, one per module. Two constraints:

So it is a twice-a-month tool: good for a year-end archive or a migration, useless for a Monday-morning aging report. Zoho points you to backup as the remedy for exceeding 25,000 rows, which implies the ZIP is not capped the same way — but no page states a row limit for backups either way, so check the CSV row counts against your own record counts.

The release notes are worth checking. From What's New in Zoho Books, 7 October 2024: "If your import file has more than 1,000 records or your export file exceeds 25,000 records, the task will be scheduled" — custom modules are processed asynchronously. And on 1 February 2024, "Bulk export options that allow you to export more than 50,000 rows" arrived for the Inventory Aging and Inventory Valuation Summary reports. Zoho is chipping away at the cap module by module, so check yours before assuming 25,000 is the ceiling.

Route 3: the Zoho Books REST API

No 25,000-row cap is documented for the API; it is governed by request quotas instead.

The base URL is data-centre specific. Not api.zoho.com, not books.zoho.com, but https://www.zohoapis.com/books/v3. Swap the top-level domain for your region — the introduction page lists .com (US), .eu, .in, .com.au, .jp, .ca, .com.cn and .sa — so a European org calls https://www.zohoapis.eu/books/v3, and a token issued in one data centre will not work against another.

The auth header is not Bearer. Zoho uses its own scheme, Authorization: Zoho-oauthtoken 6e80xxxxxxxxxxxxxxxxxxxxxxxx8a80. Pasting a generic OAuth snippet with Bearer is a common reason a first call fails.

organization_id is mandatory on every call. Verbatim: "The parameter organization_id along with the organization ID should be sent in with every API request to identify the organization." Get it from GET /organizations.

Authentication is OAuth 2.0, with data-centre-specific accounts URLs: send the user to {Accounts_URL}/oauth/v2/auth, then POST to {Accounts_URL}/oauth/v2/token ({Accounts_URL} is e.g. https://accounts.zoho.com for the US). Scopes look like ZohoBooks.invoices.READ. Two documented facts shape any script: "Each access token is only valid for one hour," and the ceiling is 20 refresh tokens per user — "If this limit is crossed, the first refresh token is automatically deleted to accommodate the latest one."

Pagination and the arithmetic of the quotas

Use page and per_pagecurl https://www.zohoapis.com/books/v3/contacts?page=2&per_page=25 — and loop until the response's page_context node reports has_more_page as false. Documented default is 200 items per response; no maximum per_page is documented, so don't build around a guess.

The documented quotas, per organization: 100 requests per minute (HTTP 429 on breach), a daily total by plan of 1,000 (Free), 2,000 (Standard), 5,000 (Professional) or 10,000 (Premium, Elite, Ultimate), and 5 concurrent calls on Free, 10 on paid. At 200 records per page one call is one page, so a Free org's 1,000 daily calls is on the order of 200,000 records a day — multiplication, not a Zoho-stated figure, but it shows the daily quota is rarely the blocker. The 100/minute ceiling is. Sleep between pages and retry on 429.

One gap to plan for: no documented endpoint returns a finished financial report. The v3 docs cover per-entity CRUD — invoices, bills, expenses, journals, contacts, items, projects, custom modules — so a P&L, balance sheet or aging schedule means pulling entities and rebuilding it with SUMIFS, much the same job as going from a trial balance to financial statements.

Route 4: Power Query against the API, and why it hurts

You can call the API from Excel with Web.Contents:

let
    Src = Json.Document(Web.Contents("https://www.zohoapis.com/books/v3",
        [ RelativePath = "invoices",
          Query = [ organization_id = "1234567890", page = "1", per_page = "200" ],
          Headers = [ #"Authorization" = "Zoho-oauthtoken 6e80xxxx8a80" ] ]))
in
    Table.FromRecords(Src[invoices])

That returns data — until the hour is up and the token expires. Power Query is built to fetch and transform, not to hold and rotate credentials, so you either paste a fresh token in every session (fine once, miserable as a habit), attempt the refresh POST inside M with a Content field (works in the editor, then breaks or prompts under scheduled refresh), or put a small service in front of the API that refreshes the token and exposes a plain URL. Only the third lasts, and it means maintaining software plus a pagination loop. Good if someone in-house enjoys this; if not, be realistic about the bus factor. Other accounting APIs pose the same trade-off — see connecting QuickBooks and Xero to Excel.

Route 5: Zoho Analytics (the official reporting answer, and it is paid)

Zoho's own reporting answer is Zoho Analytics: Settings > Integrations > Zoho Apps > Connect (next to Zoho Analytics) > Configure, select modules and fields, set the sync schedule, Save and Sync. The Books help page cites 75+ prebuilt financial reports.

Two caveats. Direction: "Your data from Zoho Books will be made available in Zoho Analytics via a one-way sync" — you can report, not write back. And cost:

"When you set up the integration, Zoho Analytics will provide you with a free 15-day trial. However, once the trial ends, you will no longer be able to use Zoho Analytics and will have to upgrade to one of their plans."

It is a separate product with its own tiers, from Basic (2 users / 0.5M rows) to Dedicated Compute (50 users / 500M rows), plus a Free plan capped at 2 users, 10,000 rows and 5 workspaces — a row cap lower than the 25,000 you can already export by hand. Check current prices on Zoho's pricing page. Analytics is right if you want dashboards and live in Zoho's UI, wrong if the deliverable is a spreadsheet your team edits.

Where HISAB 360 fits

If the destination is Excel and the routes above are too manual (backup, quarterly CSVs) or too technical (scripts, token services), a native in-Excel connection is a sixth option. HISAB 360 is a paid Excel add-in that connects to Zoho Books — plus QuickBooks Online, Xero, Odoo, FreshBooks and Sage — pulling invoices, bills, payments, journals, contacts and ledgers into a sheet and handling the OAuth authorisation, the region-specific endpoint, organization_id and pagination. It also writes back: create, update, void or delete records from the workbook where the API allows it, which neither the backup ZIP nor Zoho Analytics can do. Its AI panel builds the SUMIFS, PivotTable or Power Query step from a plain-English request.

Honest limits. It is Windows desktop Excel only — Excel 365 or 2019+, not Mac, not Excel on the web. It is paid: $7/month or $60/year if you bring your own AI provider key, $10/month for HISAB AI Basic, $20/month for Plus, or $199 perpetual. The trial is 15 days with every feature plus 50 HISAB AI credits, no credit card, once per machine; there is no permanently free tier after it. You authorise Zoho Books via OAuth yourself, every ledger write should be reviewed before you approve it and reconciled afterwards, and there is no continuous real-time sync — you refresh when you want data. Details on pricing and ERP reconciliation with write-back.

Choosing a route

You needBest route
One-off pull under 25,000 rowsMore > Export to CSV
Complete history, monthlySettings > Data Backup
Repeatable weekly pull, developer availableREST API + script
Dashboards inside ZohoZoho Analytics (paid)
Excel regularly, edits pushed backIn-Excel connection, e.g. HISAB 360 (paid)

Whichever route you pick, reconcile the row count you extracted against the record count Zoho reports for that filter, every time: a truncated export looks exactly like a finished one. That check belongs in your close — the month-end close checklist is a 20-task workbook with owner, status dropdown, due-day and a progress percentage. There is also a P&L template with live gross and net margin formulas and a Transactions sheet for a pasted ledger export, a balance sheet template whose check row prints "OK - balanced" or "OUT BY" the difference, and a bank reconciliation template that flags each statement line "matched" or "UNMATCHED" using COUNTIFS against your ledger sheet — amount-only matching, so one deposit covering several invoices still needs a human (see reconciling a bank statement in Excel).

Frequently asked questions

Can I raise the 25,000-row export limit on a higher Zoho Books plan?

Zoho states the cap with no plan qualification, so no documented upgrade lifts it for standard module exports. Some reports did get bulk options — the release notes name Inventory Aging and Inventory Valuation Summary going past 50,000 rows — and custom-module exports above 25,000 records are queued as scheduled tasks rather than blocked.

Is the "5 reports a day" limit official?

No. It is an in-app error message users quote in Zoho's community forums — "You can only export a maximum of 5 reports that has more than 2000 rows, in a day." Zoho does not document it and there is no staff confirmation on those threads, so plan around it but do not cite it as policy.

Does the API have the same 25,000-row limit?

Nothing equivalent is documented for the API, which is governed by request quotas: 100 requests per minute per organization, plus a daily total by plan (Free 1,000, Standard 2,000, Professional 5,000, Premium/Elite/Ultimate 10,000). The per-minute ceiling is what usually trips scripts.

Why does my Zoho Books API call return 401 when the token is fresh?

Three usual suspects. Authorization: Bearer instead of Zoho's Authorization: Zoho-oauthtoken scheme. The wrong data centre — the domain changes by region, and a token issued in one will not work against another. Or a missing organization_id, which Zoho requires on every request.

Can I get a P&L or aging report straight out of the Zoho Books API?

Not as a finished report. The documented v3 endpoints cover per-entity CRUD — invoices, bills, expenses, journals, contacts, items, projects, custom modules — so you pull the transactions and rebuild the report with SUMIFS or a PivotTable.

Try HISAB 360 on your own workbook

HISAB 360 is an AI assistant inside Excel for accountants and finance teams — it writes macros, Power Query and formulas from plain English, and connects two-way to QuickBooks, Xero, Zoho Books, Odoo, FreshBooks and Sage. The 15-day trial is the full product, no card required.

Start free → See pricing