# The Biloh finance engine: accounting you can run by chat

> Biloh does not stop at the invoice. It carries a service business all the way to the books: a bank feed tied by the bank's own running balance, money in matched to invoices, money out coded with its GST evidence, inter-account transfers paired, a month, quarter and financial-year close ladder, the BAS worksheet on the real ATO labels, a cash P&L, a balance sheet, TPAR, a depreciation schedule and a one-ZIP period pack for the accountant. Every one of those is a tool an AI agent can call, so "close September and give me the BAS" is a sentence, not a project. Cash basis, Australian GST and BAS today; no payroll, no accruals, no inventory, stated on the face of every report.

URL: https://biloh.com.au/docs/explanation/finance-engine-overview
Category: Explanation | Audience: evaluator | Updated: 2026-09-18

## What is the finance engine?

Most field-service platforms end at the invoice. The job is done, the invoice
goes out, and the moment the money lands you are handed to a separate
accounting package, a bookkeeper, or a spreadsheet. Biloh keeps going. The
same platform that quoted the work and dispatched the contractor also
**reconciles the bank, codes the spend, closes the period, and produces the
BAS and the year-end reports**, and every step is available to an AI agent
over the [Model Context Protocol](/docs/reference/mcp-overview).

The practical difference is who does the bookkeeping. With Biloh connected to
an AI assistant, the operator says:

> "Import this week's bank statement into the everyday account, match the
> deposits to invoices, code the rest, and tell me what is still unexplained."

and then, at the end of the quarter:

> "Close September, close the July to September quarter, and give me the BAS
> figures and the pack for my accountant."

The agent calls the same tools the web app uses. The figures it reads back are
the figures the accountant sees.

## What does it actually cover?

| Stage | What Biloh does | Read more |
| --- | --- | --- |
| Bank feed | Register each real account (everyday, tax set-aside, contractor buffer), import a statement CSV, tie every line by the bank's running balance | [The balance chain](/docs/concepts/the-balance-chain) |
| Money in | Rank deposits against outstanding invoices, match, learn the payer for next time | [Reconcile money in](/docs/how-to/reconcile-money-in) |
| Money out | Settle contractor bills against debits, code supplier spend to a category with its GST, pair receipts from the shoebox, split mixed lines | [Reconcile money out](/docs/how-to/reconcile-money-out) |
| Own money | Pair the two halves of a transfer between your own accounts so it reaches no report | [Envelopes](/docs/concepts/envelopes-tax-set-aside-and-contractor-buffer) |
| Close | Month, quarter and financial-year closes on one ladder, refused while the bank feed has a hole | [Close a month and a quarter](/docs/how-to/close-a-month-and-a-quarter) |
| BAS | G1, 1A, 1B and net GST on the ATO labels, with an exceptions list for GST held out for missing evidence | [Cash-basis BAS from the bank feed](/docs/concepts/cash-basis-bas-from-the-bank-feed) |
| Reports | Cash P&L ex-GST, balance sheet that balances by construction, TPAR, depreciation schedule, aged payables | [Finance MCP tools](/docs/reference/finance-mcp-tools) |
| Accountant | One ZIP per month, quarter or year with every report, the evidence and a manifest | [Prepare the BAS and the accountant pack](/docs/how-to/prepare-the-bas-and-the-accountant-pack) |
| Compliance | A calendar of BAS, super and TPAR due dates that seeds itself, plus your own renewals | [Prepare the BAS and the accountant pack](/docs/how-to/prepare-the-bas-and-the-accountant-pack) |

## Why is "refuses" a feature?

An accounting engine that will do anything you ask is one that will quietly
produce a wrong BAS. Biloh is built to refuse, and to say why, before any row
is written:

- A statement that does not chain onto the account's last balance is refused
  with `wrong_account_or_gap`, naming the expected and actual figures. Zero
  rows land. Either it is the wrong file or a week is missing, and both have
  the same fix.
- A period close is refused with `bank_completeness_failed` while any line in
  the range fails to tie, naming the first break's date and the gap in cents.
- A purchase above the receipt-only threshold with no tax invoice has its GST
  held **out** of 1B and named in the exceptions list. The worksheet never
  overstates a claim and never silently drops one.
- An asset is never depreciated by a method nobody chose. `create_asset`
  requires the method, and an instant write-off above the tenant's threshold
  is refused with the threshold named.
- The income-tax provision in the tax envelope is zero until you and your
  accountant set the percentage. The platform never guesses a tax rate.

The full list is in [bank import and close refusal codes](/docs/reference/bank-import-and-close-refusal-codes).

## What is it honest about not doing?

Every report says its basis on its face, and the balance sheet carries a
`not_here_note` naming what it does not hold. Today the engine is:

- **Cash basis.** Income is recognised when the money lands, a purchase when
  it is paid. Accrual reporting exists for the AR and AP reconciliation view,
  but the close, BAS and P&L are cash.
- **Australian.** GST at 10%, the ATO's BAS labels, financial years ending 30
  June, TPAR by 28 August, super quarters. The tax locale is a tenant setting
  and the design is not tied to one jurisdiction, but Australia is what ships.
- **Not payroll, not inventory, not accruals.** No wages, no stock, no work in
  progress, no loans or hire-purchase the platform has not been told about.
- **CSV bank feed.** Bank lines come from an internet-banking export (or a
  data-recipient feed where enabled), never from a general ledger, and the
  chain guard means a skipped export is caught, not assumed.

If a business needs those, Biloh can still be the operational system and mirror
invoices and bills to Xero. The [Xero connection tools](/docs/reference/finance-mcp-tools#xero-mirror)
exist for exactly that shape.

## How does an agent drive it?

Every stage above is an MCP tool with a plain-English description, a
"use when / don't use when" block, its preconditions and its side effects.
An agent that has never seen Biloh can read `get_bookkeeper_worklist`, work
each stream, and close the month, and Biloh's own smoke runner does exactly
that with a fresh, context-free agent every fire.
[Closing the books by chat](/docs/explanation/closing-the-books-by-chat)
walks through the conversation end to end.

## Where does it sit against the rest of Biloh?

The finance engine consumes what the operational side produces. A completed
job becomes an invoice; a released work order becomes a payable; a signed
proposal sets the expected income. So the books are not a parallel record to
be reconciled against operations, they are the operations, priced and dated.
That is why a matched deposit can name the client, the site and the visit it
paid for, and why the TPAR is produced from the payment ledger rather than
assembled by hand in August.

## Next steps

- New to Biloh's books: [close your first month](/docs/getting-started/close-your-first-month).
- Evaluating the tool surface: [finance MCP tools](/docs/reference/finance-mcp-tools).
- Tuning behaviour per business: [finance settings](/docs/reference/finance-settings).
