Monthly numbers review
An owner asking how the business is doing is not asking for a profit and loss. They can already open one. They are asking what changed, whether it matters, and what to do about it. That is the job here.
Before reading a number, check it is real
Numbers from an unreconciled or half closed file are not wrong in a way you can see, they are wrong in a way that looks fine. Check first:
- Bank accounts reconciled to the period end
- Suspense and uncategorised accounts nil
- No large draft invoices sitting outside the period
- Supplier bills for the period entered
If these do not hold, say so at the top of the report and describe what it does to the numbers. Revenue with three unentered bills against it overstates profit, and an owner who is told profit is up when it is not will make a decision on it.
What to pull
| Report | Answers |
|---|---|
| Profit and loss, this period and prior | What happened |
| Profit and loss, same period last year | Whether it is seasonal or real |
| Balance sheet | Whether the business is stronger or weaker |
| Aged receivables | Whether profit turned into cash |
| Aged payables | What is owed and when |
| Sales by customer | Concentration risk |
| Cash position | Whether next month is safe |
Exact tools per vendor: references/xero.md, references/quickbooks.md.
Pull comparison periods in the same report call where the system supports it, rather than making three calls and diffing them yourself. It is fewer calls and it matches what the accountant will see.
Read it in this order
Reading a P&L top to bottom is how you end up with a report about office supplies. Read it in order of consequence.
1. Revenue
Up or down, against last month and last year. Then the more useful question: why. More customers, more per customer, price, or one large job. Those four have completely different implications and the P&L does not distinguish them. Sales by customer does.
2. Gross margin
The most important line on the page and the most ignored. Revenue minus direct costs, as a percentage.
Margin tells you whether the business is getting better or worse at what it does, independent of how much of it it did. Revenue up with margin down means the business is buying growth, which is a decision worth making deliberately and rarely one anybody made deliberately.
Move of more than two percentage points needs an explanation, and it is normally one of: price change, cost change, mix change, or a costing error.
3. Overheads
The costs that do not move with revenue. Look for movement, not level. A line that doubled is a story. A line that is large and stable is not.
Watch specifically for: subscriptions nobody cancelled, a duplicate bill, a one off treated as recurring, and an annual payment landing in one month and distorting it.
4. Net profit
Falls out of the three above. If you have explained revenue, margin and overheads, net profit needs one sentence.
5. Cash
Profit is not cash, and the gap is where businesses die. A profitable month with all of it in receivables is a cash problem wearing a good result.
Compare: net profit for the month, movement in the bank balance, movement in receivables, movement in payables. When profit is up and cash is down, the answer is in those last two, and that is usually the most valuable sentence in the report.
6. Balance sheet
Quickly. Is the business stronger than last month. Receivables growing faster than revenue means collections are slipping. Payables growing means the business is funding itself from suppliers, deliberately or not.
Writing it up
The shape that works:
The headline, in one sentence
The three things that explain it
What needs a decision
Rules:
- Lead with the answer. “Profit was $18k, down $4k on last month, because two large jobs slipped into September.” Then the detail
- Percentages and absolute numbers together. “Down 12 percent” is meaningless alone. “Down 12 percent, $4,200” is not
- Explain, do not describe. “Materials were 34 percent of revenue against 29 percent last month” is a description. “Materials cost 5 points more because the Henderson job was quoted on old pricing” is an explanation, and it is the one they can act on
- Three things, not ten. Everything else is available if they ask
- Say what you do not know. “Revenue is down 8 percent and I cannot see why from the accounts” is a useful, honest sentence
Red flags to raise every time you see them
Regardless of what was asked:
| Flag | Why |
|---|---|
| Gross margin down two periods running | Structural, not noise. Pricing or costs have moved |
| Receivables growing faster than revenue | Collections are failing, or a customer has stopped paying |
| One customer over 30 percent of revenue | Concentration risk. One conversation from a crisis |
| Cash falling while profit rises | Working capital being consumed |
| An overhead line up more than 50 percent | Usually an error. Occasionally a real problem |
| Suspense or uncategorised with a balance | The numbers are not final |
| Payroll rising faster than revenue | Capacity added ahead of work, deliberately or not |
What not to do
- Do not forecast unless asked. Reporting what happened and predicting what will are different jobs with different standards of evidence
- Do not give tax advice. Flag anything that looks like it has a tax consequence, and say it needs their accountant
- Do not soften a bad month. A quiet accurate report beats an encouraging one every time, and the owner already suspects
- Do not recompute a report the system can produce. Its version is what their accountant will compare against, and any difference will be assumed to be your error
Reference files
Everything the skill tells your AI to read, exactly as it ships in the zip.
references/quickbooks.md 3.0 KB
# Pulling the numbers from QuickBooks Online
## The core reports
```
quickbooks_get_profit_and_loss the period
quickbooks_get_profit_and_loss_detail the same, opened into transactions
quickbooks_get_balance_sheet
quickbooks_get_cash_flow
quickbooks_get_trial_balance
```
`quickbooks_get_profit_and_loss_detail` is the one that saves a whole round of queries. When a line has moved and you do not know why, it opens the line into the transactions behind it directly, instead of you querying the account and joining it back.
`quickbooks_get_cash_flow` is worth pulling every time. The profit to cash gap is the most useful thing in a monthly review and QuickBooks will compute it for you.
## Commercial detail
```
quickbooks_get_sales_by_customer concentration risk
quickbooks_get_sales_by_product mix, and what is actually selling
quickbooks_get_customer_balance one customer's position
quickbooks_get_vendor_balance one supplier's position
```
`quickbooks_get_sales_by_customer` answers the question a P&L cannot: whether revenue moved because of many customers or one. That distinction changes the advice completely.
## Working capital
```
quickbooks_get_aged_receivables authoritative debtor ageing
quickbooks_get_aged_payables authoritative creditor ageing
```
Both are already correct for credits and part payments. Use them rather than rebuilding ageing from invoice dates.
## Anything else
```
quickbooks_get_report the generic report escape hatch
quickbooks_get_general_ledger everything that hit an account
quickbooks_get_transaction_list filterable transaction listing
```
QuickBooks also exposes its own query language through the connector. When you need a filter the listing tools do not offer, a query is shorter than pulling everything and filtering afterwards, and it costs fewer metered reads.
## Segmenting
Classes and Departments are the QuickBooks departmental dimensions, and both are optional per file.
```
quickbooks_list_classes
quickbooks_list_departments
```
Check whether the file uses them before writing a report that ignores them. A business that has carefully classed everything and gets a company level report back has been given less than it already had.
## Practical notes
- **Reads are metered and billed.** Intuit charges for API reads on the current pricing, so pull once and reuse. This is a real cost, not a preference. It also means a loop over customers is an expensive mistake
- **Check the closing date** with `quickbooks_get_preferences`. A period past the closing date is final, which is good to know before explaining a movement in it
- **Fault codes carry the reason, not the HTTP status.** The connector surfaces the QuickBooks code and the `intuit_tid`. Quote the tid when reporting a failure, because Intuit support cannot trace a request without it
- **Accounting method matters.** QuickBooks reports on cash or accrual and the answer differs. Know which basis you pulled and say so in the report
- **The fiscal year start is a company setting.** Do not assume January
references/xero.md 2.8 KB
# Pulling the numbers from Xero
## The core reports
```
xero_get_profit_loss_report period, with comparison periods
xero_get_balance_sheet_report as at period end
xero_get_trial_balance_report completeness check
xero_get_budget budget versus actual, where one exists
```
Xero's profit and loss accepts comparison periods in the same call. Use that rather than three separate pulls: fewer calls, and the comparison is computed the same way the accountant's copy will be.
## Behind a number
When a line has moved and you cannot see why:
```
xero_list_journals ledger level, everything that hit an account
xero_get_account the account itself
xero_list_invoices ACCREC for revenue, ACCPAY for costs
xero_list_bank_transactions direct spending not through a bill
```
`xero_list_journals` is the honest answer to "what is in this line". It paginates, so page through it. Do not conclude from page one.
## Cash and working capital
```
xero_get_balance_sheet_report bank balances, receivables, payables
xero_list_invoices ACCREC unpaid, for the receivables detail
xero_list_payments what actually came in
```
Xero has no aged receivables tool in the connector, so build the ageing from authorised `ACCREC` invoices using `AmountDue` and `DueDate`, and net off unallocated credit notes. `AmountDue` is already net of payments applied, so use it rather than `Total`.
## Segmenting
```
xero_list_tracking_categories
```
Tracking categories are Xero's departmental dimension: division, location, service line. If the customer uses them, a P&L without the tracking breakdown hides the thing they most want to know, which is usually which part of the business makes money.
Check whether they are in use before writing a report that ignores them.
## Projects
```
xero_list_projects
xero_get_project
```
Where Xero Projects is in use, job level profitability lives here rather than in the P&L. A business that runs projects and is reviewed only at company level cannot see which jobs lose money.
## Practical notes
- **Rate limits are per tenant.** Pull the reports you need once and work from them
- **Report tools beat reconstruction.** A P&L assembled from journals will differ from Xero's own in some edge case, and every difference will be assumed to be your error
- **Check the organisation's financial year end** with `xero_get_organisation`. Year to date means nothing until you know when the year starts, and it is not always July or January
- **Watch the accounting basis.** Cash and accrual reports differ, sometimes enormously for a business with long payment terms. Know which one you pulled and say so
- **Multi currency** reports in base currency by default. For a business invoicing in several currencies, exchange movements can explain a variance entirely