Your data, your API, your server. Built for the next 20 years, not the last 20.

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.

Free Community — self-host AGPLv3 on GitHub REST · OpenAPI · Webhooks Australian data residency
POST api.saebooks.com.au/v1/invoices
// 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"
}
Why SAE Books

Three things major cloud vendors can't say.

API-first, not GUI-first

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”.

Service-oriented by default

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 data. Permanently 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.

What’s in the box

A platform first. A BAS app second.

Multi-company ledger, audit trail, period locks, FX. The Australian tax bits sit on top of that — not the other way round.

Public REST API

Every screen is a thin client over the same OpenAPI-documented endpoints your scripts call. Bearer tokens, webhooks, idempotency keys.

Multi-company Pro

Run multiple entities under one login. Reciprocal journals. Consolidated reports. Row-level isolation, not just a filter.

Period locks & audit ledger

Close a period, lock it, audit it. Every change to a posted journal leaves a tamper-evident trail.

FX revaluation Pro

Multi-currency posting with end-of-period revaluation. ECB and RBA daily rates included.

STP payroll Business

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.

Time tracking

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.

BAS e-lodgement Enterprise

Generate the BAS, review the worksheet, lodge it. Settlement journals are automatic. Direct ATO/SBR submission ships with our DSP-accredited Enterprise tier.

Bank feeds Enterprise

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.

ABR lookup & fixed assets Business

One-field ABN/ACN lookup auto-fills contacts. Fixed asset register with depreciation schedules, disposals, and write-downs — both wired through the public API.

Purchase orders

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.

Immutable invoice snapshots

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.

Proration that math-proofs itself

First-period sign-ups, mid-period plan changes, deferred revenue. Three primitives that every recurring-revenue ledger needs — full Decimal precision, no rounding drift.

Inside the app

Not a mockup. The whole ledger.

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:

Cashbook
Cashbook — money in / out
Invoices
Invoicing & receivables
Reports library
A real reports library
BAS worksheet
GST/BAS, built in
Take the full tour Try the live demo
Pricing

One codebase. Pick the licence that fits.

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.

Cashbook Community bundle
Free
The Community edition pre-configured for sole traders: cash-basis mode, single-user lock, sole-trader chart of accounts. Not a different binary — same Community codebase, opinionated defaults. Switch to full accrual any time with one config flag.
Try the demo
  • Bookkeeping (cash-basis defaults)
  • Cash in / cash out (single-entry view)
  • Invoices & expenses (cash-basis)
  • Receipt photos
  • GST tally & BAS summary
  • One-page reports (PDF + CSV)
  • Payroll & people (Community-tier features)
  • Employees & super funds
  • NAT 1004 PAYG engine (beta)
  • SG 12% super calc
  • STP Phase 2 payload
  • Leave accrual (NES baseline)
  • Weekly time tracking grid
  • Bundle defaults
  • Single-company, single-user lock
  • Self-host, free for life
AGPLv3. Forum support. Flip to full Community (accrual) with one config setting — same data, same server.
Community
Free
Single-company self-hosted. No licence key, no nag screens.
Download from GitHub
  • Core books
  • Chart of accounts, journals, GL
  • Sales, purchases, contacts
  • Bank reconcile
  • GST/BAS report generation
  • Full export (CSV, JSON, OFX, DB dump)
  • Immutable audit ledger
  • Postgres 14+
AGPLv3. Forum support. Bring-your-own infra.

All paid features ship in the same AGPL binary, gated by a licence-key flag. Self-compile and flip the flag — that’s what AGPL means.

Anatomy

An accounting core. A service orbit around it.

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.

GET/api/v1/health
GET/api/v1/contacts
POST/api/v1/contacts
name stringrequired
abn string   email string
GET/api/v1/invoices
POST/api/v1/invoices
DEL/api/v1/invoices/{id}

OpenAPI explorer

Browse, try, and copy every endpoint at dev.saebooks.com.au. Bearer-token auth, idempotency keys, page cursors.

14:32:08invoice.createdINV-00104720038ms
14:31:55bill.approvedBL-00081220024ms
14:31:42payment.matchedPY-00220120019ms
14:30:15invoice.createdretry 1/550282ms
14:29:58invoice.createdINV-00104520041ms
14:29:30contact.updated4f3a…20012ms
14:28:12je.postedj_91f2…20015ms

Webhook deliveries

Subscribe to invoice.created, bill.approved, payment.matched. Signed payloads, retries with exponential backoff, full delivery log.

AC
ar-clerk@acme14:32:08
Updated INV-001047 · status: draft approved
API
curl/8.514:31:55
Created BL-000812 via POST /api/v1/bills
idempotency 0193c8b4…
JE
period-close-bot14:28:12
Posted JE j_91f2 (period 2026-Q1, locked)

Audit ledger

Every change — UI or API — tagged with actor, request id, before/after diff. Period-locked rows are immutable end-to-end.

Run it your way

Self-host or hosted by us.

Run it yourself

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

Or let us run it

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.

  • · Hourly snapshot · 30-day retention
  • · Cairns, QLD data residency
  • · Authentik SSO included
  • · Migration assistance from Xero / MYOB
See hosted plans
FAQ

The questions worth asking.

What does “API-first” actually buy me?

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.

What does AGPLv3 mean for my business?

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.

Can I get my data out?

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.

Is it actually compliant with AU tax?

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.

How do upgrades work?

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.

Why not just use a major cloud accounting product?

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.

What if something goes wrong?

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.

Can I run payroll on the free Cashbook bundle?

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.

What’s the difference between Cashbook and Community?

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.

Is the payroll engine ATO-verified?

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.

Get started Try the demo