Skill Tracer
Skills › Knowledge Work Plugins › month-end-prep › zoho-books-reconcile.md

zoho-books-reconcile.md

168 lines · small-business/skills/month-end-prep/reference/zoho-books-reconcile.md at 2574e29

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# Zoho Books — Reconciliation Reference
2
3Sibling of [quickbooks-reconcile.md](quickbooks-reconcile.md) and
4[xero-reconcile.md](xero-reconcile.md). Same close sequence, same packet;
5the reads and the "needs attention" signal differ because the connector's
6surface does.
7
8Every call takes `organization_id`; get it once from
9`list_organizations` (or `get_organization`, which also returns the locale
10fields) and reuse it.
12---

Zoho Books — Reconciliation Reference

Sibling of quickbooks-reconcile.md and xero-reconcile.md. Same close sequence, same packet; the reads and the "needs attention" signal differ because the connector's surface does.

Every call takes organization_id; get it once from list_organizations (or get_organization, which also returns the locale fields) and reuse it.


Raw lines 1 to 13
14## What the connector holds, and what it does not
16| Holds | Does not hold |
17|---|---|
18| Invoices, estimates, sales orders, customer payments | Bills, vendor payments |
19| Expenses, purchase orders | Bank transactions or a bank feed |
20| Bank and cash accounts with balances and an uncategorised count | Journals |
21| Contacts (customers and vendors, with a 1099 flag) | Any report: P&L, cash flow, aging |
22| Chart of accounts with balances (`list_chart_of_accounts` with `showbalance`) | |
23| Organisation record: country, currency, fiscal year start | |
25State this in the packet: an accountant needs to know which parts came from
26the connector and which from an export.
28---

What the connector holds, and what it does not

HoldsDoes not hold
Invoices, estimates, sales orders, customer paymentsBills, vendor payments
Expenses, purchase ordersBank transactions or a bank feed
Bank and cash accounts with balances and an uncategorised countJournals
Contacts (customers and vendors, with a 1099 flag)Any report: P&L, cash flow, aging
Chart of accounts with balances (list_chart_of_accounts with showbalance)
Organisation record: country, currency, fiscal year start

State this in the packet: an accountant needs to know which parts came from the connector and which from an export.


Raw lines 14 to 29
30## Reports to pull

Reports to pull

Raw lines 30 to 31
32### Profit & Loss — from an export
34There is no P&L endpoint. Ask for the **Profit and Loss** export (Reports →
35Profit and Loss → Export, target month) before Step 2 runs, even when the
36connector is connected. Say why in one line: *"Zoho Books doesn't expose
37reports through the connector, so I need the P&L export; everything else I
38can read directly."*
40A stand-in when the owner cannot export: invoiced revenue from
41`list_invoices` (`date_start`/`date_end`, `response_option=3` for the summed
42`total`) minus recorded expenses from `list_expenses` for the same range.
43Label it *"invoiced minus recorded, not a P&L"* everywhere it appears.

Profit & Loss — from an export

There is no P&L endpoint. Ask for the Profit and Loss export (Reports → Profit and Loss → Export, target month) before Step 2 runs, even when the connector is connected. Say why in one line: "Zoho Books doesn't expose reports through the connector, so I need the P&L export; everything else I can read directly."

A stand-in when the owner cannot export: invoiced revenue from list_invoices (date_start/date_end, response_option=3 for the summed total) minus recorded expenses from list_expenses for the same range. Label it "invoiced minus recorded, not a P&L" everywhere it appears.

Raw lines 32 to 44
45### The register — three document lists
47| Part | Tool | What it holds |
48|---|---|---|
49| Invoices | `list_invoices` with `date_start` / `date_end`, `per_page` up to 200 | Customer invoices, all statuses; `status` filter for `paid`, `unpaid`, `overdue`, `draft`, `void` |
50| Expenses | `list_expenses` with `date_start` / `date_end` | Money spent, coded to an `account_name`, with `vendor_name` and `status` |
51| Purchase orders | `list_purchase_orders` for the month | Open commitments to vendors |
53Exclude `draft` and `void` documents from the close. Page until
54`page_context.has_more_page` is false; a single page is not the month.
56Key fields:
58| Field | Notes |
59|---|---|
60| `date`, `due_date` | Document dates |
61| `status`, `current_sub_status` | `overdue` carries `due_days` as text ("Overdue by 323 days") |
62| `customer_name` / `vendor_name` | Counterparty |
63| `total`, `balance` | Document total and what is still unpaid |
64| `has_attachment` | Receipt or document attached |
65| `reminders_sent`, `last_reminder_sent_date` | Invoice chase history |
66| `currency_code`, `exchange_rate` | Per document; `bcy_*` fields are base currency |
68---

The register — three document lists

PartToolWhat it holds
Invoiceslist_invoices with date_start / date_end, per_page up to 200Customer invoices, all statuses; status filter for paid, unpaid, overdue, draft, void
Expenseslist_expenses with date_start / date_endMoney spent, coded to an account_name, with vendor_name and status
Purchase orderslist_purchase_orders for the monthOpen commitments to vendors

Exclude draft and void documents from the close. Page until page_context.has_more_page is false; a single page is not the month.

Key fields:

FieldNotes
date, due_dateDocument dates
status, current_sub_statusoverdue carries due_days as text ("Overdue by 323 days")
customer_name / vendor_nameCounterparty
total, balanceDocument total and what is still unpaid
has_attachmentReceipt or document attached
reminders_sent, last_reminder_sent_dateInvoice chase history
currency_code, exchange_ratePer document; bcy_* fields are base currency

Raw lines 45 to 69
70## The "needs attention" signal: uncategorised transactions per account
72`list_bank_accounts` (`filter_by=Status.Active`) returns each bank and cash
73account with `current_balance`, `bank_balance`, and
74`uncategorized_transactions`. That count is the attention signal — bank-feed
75lines the owner has not yet coded.
77Step 2 for a Zoho Books ledger reports:
79```
80Uncategorised bank transactions: 9 across 2 accounts (Operating 7, Savings 2)
81```
83The lines themselves cannot be listed through the connector. Tell the owner
84the count and the account, and that they are categorised in Zoho Books
85(Banking → account → Uncategorized) before the close advances. The Step 6
86summary block's "Needs attention" row carries this count.
88`Undeposited Funds` is a cash account in this list, not a bank. A large
89balance there at month end means customer payments received and not yet
90deposited — name it as an open item, not as cash on hand.
92---

The "needs attention" signal: uncategorised transactions per account

list_bank_accounts (filter_by=Status.Active) returns each bank and cash account with current_balance, bank_balance, and uncategorized_transactions. That count is the attention signal — bank-feed lines the owner has not yet coded.

Step 2 for a Zoho Books ledger reports:

Uncategorised bank transactions:   9 across 2 accounts (Operating 7, Savings 2)

The lines themselves cannot be listed through the connector. Tell the owner the count and the account, and that they are categorised in Zoho Books (Banking → account → Uncategorized) before the close advances. The Step 6 summary block's "Needs attention" row carries this count.

Undeposited Funds is a cash account in this list, not a bank. A large balance there at month end means customer payments received and not yet deposited — name it as an open item, not as cash on hand.


Raw lines 70 to 93
94## Duplicate detection: scan documents
96Same rule as Xero — a document keyed twice is two documents. Step 4 scans
97invoices and expenses separately:
99- Same `customer_name` (invoices) or `vendor_name` (expenses)
100- Same `total` (within 0.01 in the base currency)
101- Dated within 5 calendar days of each other
102- Both unpaid, or one paid inside the window
104Recurring expenses (`recurring_expense_id` set) and invoices created from a
105recurring invoice (`recurring_invoice_id` set) are the usual false positive;
106show the id so the owner sees why.
108---

Duplicate detection: scan documents

Same rule as Xero — a document keyed twice is two documents. Step 4 scans invoices and expenses separately:

  • Same customer_name (invoices) or vendor_name (expenses)
  • Same total (within 0.01 in the base currency)
  • Dated within 5 calendar days of each other
  • Both unpaid, or one paid inside the window

Recurring expenses (recurring_expense_id set) and invoices created from a recurring invoice (recurring_invoice_id set) are the usual false positive; show the id so the owner sees why.


Raw lines 94 to 109
110## Receipts: check the document, then the folder
112`has_attachment` on invoices and expenses says whether a file is attached.
113Above the attention threshold, read it first:
115- `true` → "receipt on file (Zoho Books)"
116- `false` → fall back to the folder scan, then to asking the owner
118---

Receipts: check the document, then the folder

has_attachment on invoices and expenses says whether a file is attached. Above the attention threshold, read it first:

  • true → "receipt on file (Zoho Books)"
  • false → fall back to the folder scan, then to asking the owner

Raw lines 110 to 119
120## Processor settlements: no bank feed, so the CSV match runs
122The connector has no bank-transaction list, so a payout cannot be found as a
123ledger line. Step 3 for a Zoho Books ledger goes straight to the CSV match in
124[paypal-settlements.md](paypal-settlements.md): the processor's settlement
125report against the **bank statement** the owner uploads. Ask for the
126statement in the same breath as the P&L export.
128Two things the connector does supply for this leg:
130- `list_customer_payments` for the month — payments recorded against
131 invoices, with `payment_mode` and `reference_number`. A processor payout
132 that was recorded as a customer payment shows here.
133- Invoices carry `payment_options.payment_gateways` — which gateways (Stripe,
134 PayPal) the invoice was set up to accept. That tells you which processor's
135 settlement to expect for it.
137---

Processor settlements: no bank feed, so the CSV match runs

The connector has no bank-transaction list, so a payout cannot be found as a ledger line. Step 3 for a Zoho Books ledger goes straight to the CSV match in paypal-settlements.md: the processor's settlement report against the bank statement the owner uploads. Ask for the statement in the same breath as the P&L export.

Two things the connector does supply for this leg:

  • list_customer_payments for the month — payments recorded against invoices, with payment_mode and reference_number. A processor payout that was recorded as a customer payment shows here.
  • Invoices carry payment_options.payment_gateways — which gateways (Stripe, PayPal) the invoice was set up to accept. That tells you which processor's settlement to expect for it.

Raw lines 120 to 138
139## Country, currency, and financial year
141`get_organization` returns `country_code`, `currency_code`, and
142`fiscal_year_start_month` as a zero-based month index (`0` = January, so the
143year end is the last day of the month before the index). Read them at the
144start of the close if the business context does not carry them, and use them
145for every amount, the thresholds, and whether Step 9 offers `/tax-prep`. The
146rule is `../../../shared/currency-and-locale.md`.
148---

Country, currency, and financial year

get_organization returns country_code, currency_code, and fiscal_year_start_month as a zero-based month index (0 = January, so the year end is the last day of the month before the index). Read them at the start of the close if the business context does not carry them, and use them for every amount, the thresholds, and whether Step 9 offers /tax-prep. The rule is ../../../shared/currency-and-locale.md.


Raw lines 139 to 149
Names a skill tax-prep :145
150## Graceful degradation — Zoho Books not connected
152Take this path only when no Zoho Books entry works. An unauthorized
153`small-business:zoho-books` beside the owner's own live Zoho Books is connected —
154call the owner's entry instead (`../../../shared/connector-neutrality.md`, "One
155connector, two registrations").
157Ask for **three exports**: the **Profit and Loss** report, the **Account
158Transactions** report (all accounts, the month), and the **bank statement**.
159The uncategorised count comes from the Banking screen; ask for it as a fourth
160item or say in the packet that it was not available.
162---

Graceful degradation — Zoho Books not connected

Take this path only when no Zoho Books entry works. An unauthorized small-business:zoho-books beside the owner's own live Zoho Books is connected — call the owner's entry instead (../../../shared/connector-neutrality.md, "One connector, two registrations").

Ask for three exports: the Profit and Loss report, the Account Transactions report (all accounts, the month), and the bank statement. The uncategorised count comes from the Banking screen; ask for it as a fourth item or say in the packet that it was not available.


Raw lines 150 to 163
164## Pagination and limits
166`per_page` goes to 200 on invoices; the default is 10. Set it, and page on
167`has_more_page`. Sums come cheaper from `response_option=3` (count and
168totals only) than from listing every document.

Pagination and limits

per_page goes to 200 on invoices; the default is 10. Set it, and page on has_more_page. Sums come cheaper from response_option=3 (count and totals only) than from listing every document.

Raw lines 164 to 168