docs
/
AI skills

Financial reports

Read the business's statements from Business Made Books › Reports. Profit & Loss, Balance Sheet, Cash Flow and Trial Balance, for a date range or as of a date, for one location or all, compared with the period before. What each figure is made from, the data-quality flags to pass on, CSV and PDF downloads, and how to trace a number back to its entries.

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.

StatementCallAnswer
Profit & LossGET reports/pl?fromDate=&toDate=&businessLocationId=&groupByLocation=totals { revenue, cogs, grossProfit, opex, netIncome, grossMarginPct }, byAccount[], dataQuality, comparison
Balance SheetGET reports/balance-sheet?asOfDate=&businessLocationId=assets, liabilities, equity (with this year's earnings so far), balanced, variance
Cash FlowGET reports/cash-flow?fromDate=&toDate=&businessLocationId=operating, investing and financing sections, netChangeInCash, openingCash, closingCash, unexplained, dataQuality
Trial BalanceGET reports/trial-balance?asOfDate=&businessLocationId=rows[], totalDebit, totalCredit, balanced, variance
By locationGET reports/by-location?fromDate=&toDate=a P&L for each business location
Budget vs actualGET reports/budget-actuals?fromDate=&toDate=actual spend per location and account, for Books › Budgets
  • Each date can also be sent as from and to, or asOf.
  • With no dates, a range is this month so far and an as-of date is today. A date that isn't YYYY-MM-DD is 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):

RangeCompared with
From 1 January (year to date)The same dates a year earlier
Within one month, from the 1stThe same days of the month before. A whole month compares with the whole month before.
Anything elseThe 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.

FlagMeansSay
grossMarginPct: null, dataQuality.costNeverRecordedThis 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, revenueWithoutCostSome sales have no cost of goods behind them.Gross profit is overstated by the missing costs.
dataQuality.costFromBillsOutsidePeriodCost is booked from supplier bills, and none falls in this range.Margins look high for this range.
balanced: false, varianceThe Balance Sheet or Trial Balance doesn't tie.Stop and look for drift (GET business-made/books/balance-drift).
unexplained not 0, dataQuality.unresolvedAccountsCash 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= or GET reports/balance-sheet/pdf?asOfDate=. Tested: it came back application/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.ts 229, 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.