The statements are worked out from posted journal entries each time they're asked for. Nothing is stored. They are in Business Made Books › Reports (/books/reports?view=pl|bs|cashflow|tb&from=<YYYY-MM-DD>&to=<YYYY-MM-DD>). For the same screen from the Business Made side, see Reports, tax and budgets. The endpoints are under business-made/books/reports (appengine business-made/controllers/books.controller.ts, services/reports.service.ts), called with call_appengine. For sales, traffic and other non-accounting dashboards, see Dashboards and reports.
A statement counts entries that are posted, reconciled or reversed. A reversed entry stays in its own month, and its reversal counts in the month it was made (fetchPostedJournals, 229). Drafts don't count.
Ask first
- Which statement, and for when? A date range (P&L, Cash Flow) or an as-of date (Balance Sheet, Trial Balance).
- One location, or the whole business?
- Compared with what? By default, the period before.
- For whom? An owner reading on screen, or a PDF or CSV to send. Sending it is the person's job.
Steps
1. Books › Reports: pick the statement and the dates
The tabs are Profit & Loss, Balance Sheet, Cash Flow and Trial Balance. P&L and Cash Flow take From → To. Balance Sheet and Trial Balance take As of. The range stays the same when switching tabs. The top bar's location picker scopes every statement, and a banner says so, with Show all locations.
| Statement | Call | Answer |
|---|---|---|
| Profit & Loss | GET reports/pl?fromDate=&toDate=&businessLocationId=&groupByLocation= | totals { revenue, cogs, grossProfit, opex, netIncome, grossMarginPct }, byAccount[], dataQuality, comparison |
| Balance Sheet | GET reports/balance-sheet?asOfDate=&businessLocationId= | assets, liabilities, equity (with this year's earnings so far), balanced, variance |
| Cash Flow | GET reports/cash-flow?fromDate=&toDate=&businessLocationId= | operating, investing and financing sections, netChangeInCash, openingCash, closingCash, unexplained, dataQuality |
| Trial Balance | GET reports/trial-balance?asOfDate=&businessLocationId= | rows[], totalDebit, totalCredit, balanced, variance |
| By location | GET reports/by-location?fromDate=&toDate= | a P&L for each business location |
| Budget vs actual | GET reports/budget-actuals?fromDate=&toDate= | actual spend per location and account, for Books › Budgets |
- Each date can also be sent as
fromandto, orasOf. - With no dates, a range is this month so far and an as-of date is today. A date that isn't
YYYY-MM-DDis refused.
Hands on: say the range out loud with the figures, as "1–31 October 2026", not "last month".
Check: tested, October's P&L answered revenue 120, opex 109.99 and comparison: null (September had nothing). The Balance Sheet answered balanced: true. The Cash Flow answered opening 0, closing 10.01 and unexplained: 0.
2. Books › Reports: compare
Compare puts the prior period beside each figure (report-periods.ts comparisonWindow, 53):
| Range | Compared with |
|---|---|
| From 1 January (year to date) | The same dates a year earlier |
| Within one month, from the 1st | The same days of the month before. A whole month compares with the whole month before. |
| Anything else | The window of the same length just before it |
A Balance Sheet compares with the last day of the month before its as-of date. comparison is null when the prior period has no entries.
Check: the two columns' dates are the ones the person meant.
3. Books › Reports: read the flags before the figures
Pass these on as they are. Don't paper over them.
| Flag | Means | Say |
|---|---|---|
grossMarginPct: null, dataQuality.costNeverRecorded | This business has never posted a cost of sales, so gross profit is just revenue. | The margin is blank because costs aren't recorded, not because it's 100%. |
dataQuality.costCoveragePct below 100, revenueWithoutCost | Some sales have no cost of goods behind them. | Gross profit is overstated by the missing costs. |
dataQuality.costFromBillsOutsidePeriod | Cost is booked from supplier bills, and none falls in this range. | Margins look high for this range. |
balanced: false, variance | The Balance Sheet or Trial Balance doesn't tie. | Stop and look for drift (GET business-made/books/balance-drift). |
unexplained not 0, dataQuality.unresolvedAccounts | Cash moved through accounts the cash flow can't place. | The cash flow doesn't fully explain the change in cash. |
Tested: the October P&L answered grossMarginPct: null, costNeverRecorded: true.
4. Books › Ledger: trace a number
A figure comes from accounts, and an account's balance comes from its lines. Open Books › Ledger for the account (/books/ledger?account=<code>, GET business-made/books/ledger/<code>). It lists every posted line with its date, reference, memo, location, debit, credit and balance. Each entry opens in Books › Journal (/books/journal?openId=<sk>). There you can see its source (a sale, a bill, the bank feed, payroll, a manual entry).
Check: the lines add up to the account's figure on the statement.
5. Books › Reports: CSV, PDF, print
- Export CSV (the sheet icon) downloads the statement on screen, with the prior column when Compare is on. Hide empty (Trial Balance only) drops accounts with nothing in them.
- PDF (P&L and Balance Sheet only) is a branded PDF from
GET reports/pl/pdf?fromDate=&toDate=&businessLocationId=orGET reports/balance-sheet/pdf?asOfDate=. Tested: it came backapplication/pdf. - Files are named for the range: "Profit-and-Loss-Oct-2026.pdf" for a whole month, "Profit-and-Loss-2026-01-01-to-2026-09-30.csv" otherwise, "Balance-Sheet-2026-09-30.csv" for an as-of statement.
- Print prints the page.
Hands on: the person downloads the file in Studio. The AI doesn't email statements.
6. Books: the overview figures
Books (/books, GET business-made/books/overview?range=mtd|last|ytd) shows this month so far, last month or the year to date at a glance, with what's owed to and by the business. For a figure someone will act on, use the statement.
When it's done
- The person has the statement for the dates and location they asked for, with its prior period.
- Every flag in step 3 is said out loud.
- Any file they wanted is downloaded.
What it can't do yet
- Large books are cut short. Every statement reads at most 5,000 journal entries, the most recently changed first (
reports.service.ts229,pageSize: 5000). Once an org has more, older entries silently drop out of the P&L, Balance Sheet, Cash Flow and Trial Balance. For an org that size, check the Trial Balance against the ledger before trusting a figure. - No PDF for Cash Flow or Trial Balance. CSV only.
- No saved or scheduled reports. They're worked out each time.
- By location needs business locations. With none, it answers
[](tested).
Don'ts
- Don't report a margin, profit or cash figure without its flags.
- Don't call an unbalanced Balance Sheet final.
- Don't pick the dates for the person. Say the range you used.
- Don't send statements to anyone. The person shares them.
- Don't post an entry to "fix" a report. Find the cause in the ledger and ask first.