SAE Books is modern accounting infrastructure: an API-first ledger you own and control. Invoicing, payroll, time tracking, STP Phase 2 — all in the same binary, runtime-flagged by tier. Every screen is a thin client over a public REST API, the same one your scripts and automations hit. On-prem licensed. Self-hosted by default. No vendor lock-in, no data held hostage.
// Same endpoint your scripts hit. Same one the UI hits. POST /api/v1/invoices // HTTP/2 Authorization: Bearer sk_live_… Idempotency-Key: 0193c8b4-… { "contact_id": "4f3a…", "date": "2026-05-08", "lines": [ { "account": "4-1000", "qty": 8, "price": 185.00, "tax_code": "GST" } ] }
// 201 Created · 38 ms { "id": "INV-001047", "status": "draft", "total": 1628.00, "gst": 148.00, "je_id": "j_91f2…", "webhook": "invoice.created" }
The web UI is a thin client over a public REST API. Anything you can do in a browser, your scripts can do too — same endpoints, same auth, same OpenAPI schema. No screen-scraping, no “export to CSV and pray”.
The accounting ledger does one thing well: keeps the books. Document vault, bank-feed relay, lodgement, payroll — all separate services that talk to it over the API. Swap any of them; the books stay yours.
Your books live in a Postgres database you control. AGPLv3 means the source is yours. Full export to CSV, JSON, OFX, or a complete DB dump — cancel any time and your data walks with you. No vendor can revoke access to your own ledger, ever.
Multi-company ledger, audit trail, period locks, FX. The Australian tax bits sit on top of that — not the other way round.
Every screen is a thin client over the same OpenAPI-documented endpoints your scripts call. Bearer tokens, webhooks, idempotency keys.
Run multiple entities under one login. Reciprocal journals. Consolidated reports. Row-level isolation, not just a filter.
Close a period, lock it, audit it. Every change to a posted journal leaves a tamper-evident trail.
Multi-currency posting with end-of-period revaluation. ECB and RBA daily rates included.
NAT 1004 PAYG formula engine, SG 12% super calc, leave accrual (NES annual + personal), STP Phase 2 payload assembly. Pay-run finalise posts the journal entries and builds the lodgement record automatically. Payroll engine in beta — verify ATO tax-table coefficients before production use.
Weekly hour grid: log by day, project, and contact. Approval workflow (Draft → Submitted → Approved → Locked). Bulk convert billable entries to a draft invoice line — rate snapshot preserved at entry time.
Generate the BAS, review the worksheet, lodge it. Settlement journals are automatic. Direct ATO/SBR submission ships with our DSP-accredited Enterprise tier.
SISS/ACSISS-backed daily feeds for every major Australian bank. Delivered via our relay service while we onboard new tenants under the data-aggregator agreement.
One-field ABN/ACN lookup auto-fills contacts. Fixed asset register with depreciation schedules, disposals, and write-downs — both wired through the public API.
Issue a PO, receive in batches, partial-bill, close. The state machine mirrors how procurement actually works — nothing hits the GL until you convert a receipt to a bill.
What you sent is what you sent. The rendered PDF is stored byte-identical in the document vault — reprintable forever, unchanged. Built for dispute defence. Major cloud vendors silently rewrite the original when terms or notes change. SAE Books doesn’t.
First-period sign-ups, mid-period plan changes, deferred revenue. Three primitives that every recurring-revenue ledger needs — full Decimal precision, no rounding drift.
The full double-entry product — cashbook, invoicing, time tracking, GST/BAS and a real reports library — in one app you run. Real screens from the live demo — shown in your own theme, light or dark:
Start free with the self-hosted Community edition — the full double-entry stack, no licence key, no nag screens. Same codebase as the paid tiers, runtime-flagged for what you need. Paid tiers are self-hosted by default.
Hosted editions are in private beta — access by request. Self-host free today.
Hosted editions are in private beta — access by request. Self-host free today.
The ledger does the books. Everything else — the document vault, bank feeds, lodgement, payroll — is an independent service that talks to it over the API. Replace any of them, build your own, or wire in third-party tools. The books stay yours regardless.
Browse, try, and copy every endpoint at dev.saebooks.com.au. Bearer-token auth, idempotency keys, page cursors.
Subscribe to invoice.created, bill.approved, payment.matched. Signed payloads, retries with exponential backoff, full delivery log.
POST /api/v1/billsEvery change — UI or API — tagged with actor, request id, before/after diff. Period-locked rows are immutable end-to-end.
docker compose up. Bring your own Postgres 14+ or use the bundled image for one-person setups. Authentik or any OIDC provider for SSO. Ships with a backup runbook.
$ docker compose pull $ docker compose up -d ✓ saebooks-app started on :8042 ✓ saebooks-web started on :8043 ✓ postgres healthy ✓ migrations applied (head)Read the install guide
Same code, signed releases, hourly off-site backup, Authentik SSO, Australian data residency. Pay monthly or annually. Cancel and take a full DB dump with you.
Every action in the UI is a documented REST call. Want to push 200 invoices from your job-management system? Hit POST /api/v1/invoices. Want a webhook when a bill is approved? Subscribe. Want to retire the UI entirely and drive it from a script? You can. The accounting ledger is the product; the screens are one of many possible clients. OpenAPI schema lives at dev.saebooks.com.au.
Run it however you want — internally, with clients, anywhere. The licence only kicks in if you modify the code and offer the modified version as a network service to others. Most users will never trigger it. Hosting it for your own clients is fine; selling a hosted SAE Books fork as a SaaS without contributing back is not.
Always. Export to CSV, JSON, OFX, QIF, or a full Postgres dump from the Settings → Export screen. Importable into a fresh instance with one command. Data portability is a first-class feature, not a goodbye gift.
Yes — the chart of accounts, tax codes, and BAS labels ship from the Odoo AU localisation. STP Phase 2 payroll is included from the Business tier and up. BAS e-lodgement and bank feeds are gated to Enterprise while we complete ATO DSP accreditation and the data-aggregator agreement; until then BAS is “generate, review, lodge via the ATO portal”. The accounting core itself is fully AU-compliant on every tier.
Tagged Docker images. docker compose pull && up -d. Migrations run on boot. We test every migration against a parallel-run copy of Richard’s own books before publishing — so if it eats your data, it eats his first.
The major cloud vendors share three assumptions: your data lives on their servers, their UI is the only interface, and switching costs you everything. That’s a reasonable trade-off until you need to automate, integrate, or leave. SAE Books makes different assumptions: the ledger is a Postgres database you own (AGPLv3), every action is an API call you can script, and your data exports completely at any time. Your accountant can stay in their preferred tool via two-way sync — the saebooks-xero adapter ships as a separate service. Nothing is held hostage to keep you subscribed.
Community: GitHub issues + the forum at discourse.saebooks.com.au. Mostly self-supported. Business and Pro: priority email, signed LTS branches, named upgrade window. Enterprise: SLA-backed, named contacts, agreed response times. For all tiers: the data is a Postgres database, so any DBA on the planet can help you in a pinch. Nothing is locked in a vendor format.
Yes. Cashbook ships the same Community binary, so employees, super funds, NAT 1004 PAYG calculation, SG 12% super, leave accrual, and STP Phase 2 payload assembly are all there — a sole trader with one employee can run STP without paying a cent. One caveat: the PAYG tax-table coefficients in the current beta are mathematically self-consistent but have not yet been verified against the official ATO tax-tables spreadsheet (NAT 1008). Verify those coefficients before running production payroll.
Both are the same binary. The Community edition is the free self-hosted SAE Books with no licence key. The Cashbook bundle is that exact same edition, pre-configured for sole traders: cash-basis mode on by default (invoices are document-only until payment hits the bank, then post a single Dr Bank / Cr Income / Cr GST entry), single-user lock, sole-trader chart of accounts. If your accountant later asks for accrual reports, flip one config setting and you have full double-entry on the same data — no migration, no export/import, the A/R backfill runs automatically for any open invoices.
The formula structure is correct: it implements the NAT 1004 §2 + §6 algorithm (WH = round(a×x − b)) and the STP Phase 2 payload fields match the ATO specification. The PAYG tax-scale coefficients seeded in the current release are derived placeholders — mathematically self-consistent but not sourced directly from the ATO’s NAT 1008 tax-tables spreadsheet, so LITO and Medicare-levy shading are not yet included. These are a values-only patch once you have the ATO XLS; no formula or structural changes are needed. We will replace them with verified values before the payroll engine leaves beta.