Accounts and the chart of accounts
ShippedWorks today.
An account is opened by name before anything can post to it, it lives in the ledger as a line of text you can read — and the currency you open it with is permanent.
The five roots
Every account name begins with one of five words, and the rest is yours:
Assets:Bank:Checking
Liabilities:CreditCard:Amex
Equity:Opening-Balances
Income:Consulting
Expenses:Software:Subscriptions
The colon is a hierarchy, not decoration — Expenses:Travel:Flights rolls up
into Expenses:Travel, which rolls up into Expenses, in every report and
every query, without you configuring anything.
Opening one
open_accounts takes ordinary Beancount text and commits it:
2026-01-01 open Assets:Bank:Checking USD
2026-01-01 open Expenses:Travel
list_accounts returns everything currently open. Opens, closes and
commodity declarations are routed into accounts.beancount, transactions
into transactions.beancount, prices into prices.beancount — so the diff on
a change tells you what kind of change it was before you read a line of it.
An account must exist before anything posts to it. A transaction naming an
account that was never opened is refused by bean-check, and the book is left
unchanged.
Closing one
2026-06-30 close Liabilities:CreditCard:Amex
A closed account keeps its history — closing is a statement about the future, not an erasure. There is no delete.
The currency trap
This is the one that costs people an afternoon, so it is stated in full.
An account opened as
open Expenses:Foo USDis pinned to USD. A later EUR posting to it failsbean-checkwith “Invalid currency”, and there is no tool to amend an existingopen.
Open anything that might see more than one currency with no constraint at all:
2026-01-01 open Expenses:Travel:Berlin
An unconstrained account accepts every currency. A constrained one is a promise you are making to your future self about a bank account that really does only ever hold one currency — which is worth making for a chequing account and a mistake for an expense category.
What a book will not accept
A book takes ledger entries, not configuration. Only dated directives are
accepted — open, close, commodity, balance, pad, note, document,
price, event, and transactions. An option, plugin, include or
custom line is refused by name, because those lines can change what
validation even means, and the text arriving here was composed by a language
model from someone’s prose.
What there is not
No rename, no merge, no amend. There is no tool that changes an existing
open line — not its currency, not its name. A mis-named account is fixed by
opening the right one, moving the balance with a transaction, and closing the
wrong one. The wrong name stays in history, which is the trade plain text
makes.
No account templates. There is no jurisdiction-specific chart you can pick off a list. The agent composes a starter chart from what you tell it, and you edit it by asking.
No sub-account limits and no numbering scheme. If your accountant wants
4000 style codes, they go in the account name or in metadata; nothing
enforces or generates them.
Something here wrong or missing? Put it on the board — it is public, and the reply is in the thread.