For Florida law firms
The reconciled trust ledger for accounting software: QuickBooks Online, Xero and the fiduciary ledger, from an executed accounting
firm lane · Deterministic — no model call
Current availability
ShippedConfigured and enabled: a firm's staff, on an executed accounting whose period end the ledger reconciles at.
- Where it lives
- The firm's Money tab (/admin/matter/[id]?tab=money → For accounting software) · /api/matter/statements/[id]/accounting-export
- What unlocks it
- the firm's staff on the firm's matters, behind the matter's wall
Status is evaluated against this deployment's configuration by the capability-status service at build time; the catalogue's facts were last reviewed on the date shown.
Capabilities
- ShippedThree files from an executed accounting: QuickBooks Online's bank-transaction format (Date, Description, Amount; day/month/year), Xero's bank statement (Date, Amount, Payee, Description, Reference; year/month/day), and the fiduciary ledger (every entry, its fiduciary account, and the statement's number and full SHA-256 on each row).
- ShippedOffered only over a reconciled ledger: the statement's bytes hash to their recorded SHA-256 and read whole; no amended statement replaces it; the ledger has not changed since it was executed; the newest reconciliation at its period end matched three ways; and that reconciliation still holds when run again over today's ledger.
- ShippedA statement from the trust's first entry must carry the reconciliation's own cash — receipts, payments, principal, income, what is in kind and the gains and losses — to the cent.
- ShippedEach file is read back before it is offered: its rows and the sum of its amounts must be the statement's own, or the file is not served.
- ShippedThe bank files carry money only; an entry in kind and a gain or loss are named in the panel and carried in the fiduciary ledger file. A zero amount is not a bank line.
- ShippedA statement that is not ready says exactly what opens it — record a reconciliation, resolve a difference, execute an amended statement — with a link to where.
- ShippedEvery export is recorded before it is served: who, which statement, which format, the statement's hash and the file's hash — never an amount.
Limits
- The figures are the statement's, unchanged: nothing is allocated, estimated or predicted, and no account in the firm's books is chosen for it — the firm maps the file when it imports it.
- QuickBooks Online takes at most 1,000 lines and 350 KB per file, and Xero 100,000 rows; a longer statement is refused for that format, and shorter periods are the way through.
- One trust, one file: separate shares or sub-trusts are not split apart.
- No direct connection to QuickBooks or Xero: the firm downloads the file and imports it (docs/business/ACCOUNTING-INTEGRATIONS-BUSINESS-CASE.md is the case for anything deeper).
- A worksheet aid for the firm's books: an export neither files nor approves a Florida trust accounting (§ 736.08135).
What EstateDraftFL refuses
| Reason code | HTTP | What it means |
|---|---|---|
| auth_required | 401 | Exporting needs a signed-in member of the firm's staff. |
| invalid | 400 | The format is not QuickBooks Online, Xero or the fiduciary ledger. |
| forbidden | 403 | The firm's staff export the reconciled ledger; a client, or the direct service, does not. |
| not found | 404 | The statement was not found, or the caller cannot open it. |
| no-reconciliation | 409 | No reconciliation is recorded at the statement's period end — record one; the export opens when all three readings agree. |
| bank-missing | 409 | The reconciliation at the period end has no bank statement balance — record one with the balances. |
| discrepancy | 409 | The reconciliation at the period end is off — the message names the amount and the leg; resolve it and record a new one. |
| reconciliation-stale | 409 | The ledger has changed since the reconciliation at the period end was recorded — record a new one. |
| reconciliation-unreadable | 409 | The reconciliation at the period end could not be read again — record a new one. |
| statement-untied | 409 | A statement from the trust's first entry does not carry the reconciliation's cash — record a new reconciliation, or execute an amended statement. |
| drifted | 409 | The ledger has changed since the statement was executed — execute an amended statement, then export that one. |
| superseded | 409 | An amended statement replaces this one — export the amended one. |
| not-accounting | 409 | A distribution statement is one beneficiary's — only an accounting is exported. |
| too-large | 409 | The statement is longer than that importer takes in one file — execute statements for shorter periods. |
| ledger-too-large | 409 | The ledger is too large to check again here (over 50,000 entries). |
| empty | 409 | A bank file has no money moving to carry — the fiduciary ledger file carries the entries. |
| integrity | 500 | The statement's bytes do not hash to its recorded SHA-256 — nothing is served. |
| unreadable | 500 | The statement's bytes could not be read whole — nothing is served. |
| untied | 500 | The file did not read back to the statement's own figures — it is not served. |
| drift-unknown | 503 | Whether the ledger has changed since the statement could not be checked just now — try again. |
| ledger-unavailable | 503 | The ledger could not be read in full just now — nothing was exported. |
| audit-unavailable | 503 | The export's record could not be written, so the file was not served. |
| unavailable | 503 | The statement, its reconciliation or the ledger could not be read just now — nothing was exported. |
Evidence
- src/lib/accounting-export.ts
- src/lib/accounting-export-server.ts
- src/lib/accounting-export.test.ts
- src/lib/phase21-accounting-export-route.test.ts
- src/app/api/matter/statements/[id]/accounting-export/route.ts
- src/components/AccountingExportPanel.tsx
- docs/business/ACCOUNTING-INTEGRATIONS-BUSINESS-CASE.md
Last reviewed 2026-10-03