QuickBooks Reporting & Lookups

Working QuickBooks Online — the query-first approach to lookups, standard financial report recipes (P&L, balance sheet, A/R aging), CSV export for reconciliation, and the sync-token rule for safe edits.

How to get answers out of QuickBooks Online (QBO) and make changes without fighting its concurrency model. The one habit that makes this easy: reach for quickbooks_query first, fall back to reports for the standard statements, and respect the sync token on every write.

Signatures are on quickbooks; this page is the recipes.

Query first

QBO exposes queryable tables, and quickbooks_query runs a SQL-like query against them. It’s the workhorse for almost every lookup — far more flexible than per-record getters.

# Open invoices (non-zero balance)
quickbooks_query(query="SELECT * FROM Invoice WHERE Balance > '0'")

# A customer by name
quickbooks_query(query="SELECT * FROM Customer WHERE DisplayName = 'Acme Corp'")

# Recent invoices, paged
quickbooks_query(query="SELECT * FROM Invoice ORDER BY TxnDate DESC",
                 max_results=50, start_position=1)

Standard financial reports

For the canonical statements, use quickbooks_report — it hits QBO’s report endpoints directly, which is cleaner than reconstructing a P&L from raw rows.

# Profit & Loss for a period
quickbooks_report(report_type="ProfitAndLoss",
                  start_date="2026-01-01", end_date="2026-03-31",
                  accounting_method="Accrual")

# Balance sheet as of a date
quickbooks_report(report_type="BalanceSheet", date="2026-03-31")

# A/R aging — who owes what, as of today
quickbooks_report(report_type="AgedReceivables")
report_type (examples)Date paramsUse
ProfitAndLossstart_date + end_dateIncome/expense for a period
BalanceSheetdate (as-of)Point-in-time position
AgedReceivablesdate (as-of)Outstanding customer balances

report_type is the QBO report endpoint name. summarize_column_by (e.g. Month, Customer) groups columns; accounting_method is Cash or Accrual; params is the escape hatch for any report-specific option. Report names beyond the three above exist — confirm the exact endpoint name against QBO rather than guessing.

Bulk pulls for reconciliation

When a single query page isn’t enough — reconciling against another system, analyzing a full ledger — export to CSV with automatic pagination:

quickbooks_export(entity_type="Invoice", max_records=1000)

max_records caps the total (default 1000). This is the tool for “give me everything” rather than a filtered page.

Editing safely (the sync-token rule)

QBO uses optimistic concurrency: every entity carries a SyncToken that must match on update or delete. The tools fetch the current token for you when you omit it — so omit it unless you’re managing concurrency yourself. Passing a stale token fails.

# Sparse update — only the fields in `data` change
quickbooks_update(entity_type="Invoice", id="145",
                  data={"DueDate": "2026-04-30"}, sparse=True)

id is a string in QBO (its IDs are string-typed), unlike the integer IDs in RepairShopr.

Where this connects

QBO is the accounting view of the same business RepairShopr tracks operationally — invoices originate in RS workflows and reconcile here.