Real-time books
How every money Event posts its own Entries, why the books reconcile daily, and why month-end close is a lock rather than a project.
A Startup's books stay closed in real time. Every Event that moves money posts its own Entries as it happens, so the month-end close only locks what is already true.
Every money Verb posts
A Verb that moves money declares the Entries it posts: one double-entry row per effect, with an amount computed from the call's records. Mandate.spend debits expense.spend and credits cash.cards for the amount spent. No one types a journal line for a charge, a refund, a payout or a card purchase.
| Event | Debit | Credit |
|---|---|---|
| A Customer's charge settles | cash.rail | revenue.deferred |
| Delivery earns the revenue | revenue.deferred | revenue.sales |
| A Card charge clears | expense.spend | cash.cards |
| A payout reaches the bank | cash.bank | cash.rail |
| A Supplier is paid | liability.supplier-earnings | cash.rail |
An account name is its class and a name: cash, asset, receivable, liability, equity, revenue or expense, then the account. Every Startup starts from the chart of accounts its Startup Template declares. A money Verb whose rule names an account outside that chart fails the registry check.
Categorize and reconcile every day
Bank and card Transactions arrive daily. Transaction.categorize codes each one to an account by the Startup's Policy. Below the Policy's confidence threshold, it opens a review Task for the Finance Lead.
Transaction.reconcile matches each Transaction to the Entries already posted. A nightly reconcile compares balances, payouts and open Invoices with Stripe and opens an Issue for every difference. A difference is a bug in a posting rule, so the fix is a Change, never a hand-typed line.
A manual Entry exists only for what no Verb caused, such as an opening balance. Entry.post records it once a second Role approves it.
Bills and cards
A Bill arrives by email or upload, is coded to an account, and is approved within a Mandate through Bill.approve. Bill.pay pays it on its due date. A Bill naming a bank that differs from the payee's record waits under Bank detail changes, whatever its amount.
Each Card charge posts a Cost to the Task that spent it, and the receipt attaches to the same Task. A charge without a receipt shows as missing on the day it clears, not at month end.
Close is a lock
Period.close ends a month once every Entry in the Period reconciles. Period.lock then freezes it, and the Finance Lead signs the locked Period as a Decision. A correction to a locked Period posts to the next open one; the locked Period never changes.
Four Controls guard the books:
- Segregation of duties: the Worker that creates a payee never approves its payment, counted by seat.
- Reconciliation completeness: a Period locks only when every Transaction reconciles.
- Manual entry review: an Entry with no causing Verb waits for a second Role.
- Period sign-off: the Finance Lead signs each locked Period.
Statements per Startup and per Company
Each closed Period produces a Statement of each kind: profitAndLoss, balanceSheet and cashFlow. Each one renders per Startup, per Company, and across a Portfolio.
Every Entry names its Startup, and an intercompany Entry names the sibling on the other side in Entry.counterparty. Inside one Company, the pairs eliminate in the Company's statements. Across Companies, Entry.settle nets a Period's pairs into one transfer and reconciles both sides.
Next
- Monthly close: the Workflow that locks each Period.
- How funds flow: how money moves on the rail before it posts.
- Revenue recognition: which Entries count as revenue.