# Ledger

URL: /systems/ledger · Id: `system:ledger`

> Ledger is the double-entry book of record: Entries posted from Events, reconciled to Transactions, and closed each Period into statements.

Ledger is a [Startup](/business/nouns/startup)’s double-entry book of record: every money [Verb](/business/nouns/verb) posts balanced [Entries](/business/nouns/entry) as it runs. [Agents](/business/nouns/agent) categorize, reconcile and close each [Period](/business/nouns/period); a [Human](/business/nouns/human) sees only the exceptions.

## Summary
| Part | This System |
| --- | --- |
| Group | Finance |
| Status | Beta: it works, and its Verbs may still change |
| Shelf | Front: offered from a Startup’s first days |

You can ask:

- “Close the books for last month”
- “Categorize these transactions”
- “Show me the profit and loss”
- “Are we on budget?”

## What you get
| Part | This System |
| --- | --- |
| Starts | On for every Startup at creation, with nothing to install. |
| Built from | [Event streams](/code/platform/event-streams), [Database](/code/platform/capabilities/database), [Payment rails](/systems/finance/payments) |

## Nouns it owns
| Noun | Definition |
| --- | --- |
| [Entry](/business/nouns/entry) | An Entry is one line of a double-entry posting: an amount to one account in the chart of accounts, caused by one Event. |
| [Period](/business/nouns/period) | A Period is one month of a Startup’s books, open until every Transaction reconciles, then closed and locked. |
| [Policy](/business/nouns/policy) | A Policy is a ruling a Startup declares on how its numbers are computed or its choices made, such as revenue recognition. |
| [Cost](/business/nouns/cost) | A Cost is an Entry against a cost account that an Action causes, posted to the Startup the Action ran in. |
| [Statement](/business/nouns/statement) | A Statement is a report computed from Entries for one Period under a Policy, such as a P&L, a balance sheet or a payout statement. |
| [Budget](/business/nouns/budget) | A Budget is the amount a Startup plans to spend or earn on one account in one Period, read against actual Entries. |

## Verbs
| Verb | Object | Approval | Event |
| --- | --- | --- | --- |
| [Entry.list](/business/nouns/entry/list) | [Entry](/business/nouns/entry) | None | None. |
| [Transaction.reconcile](/business/nouns/transaction/reconcile) | [Transaction](/business/nouns/transaction) | None | [`Transaction.reconciled`](/business/events/Transaction.reconciled) |
| [Period.close](/business/nouns/period/close) | [Period](/business/nouns/period) | None | [`Period.closed`](/business/events/Period.closed) |
| [Period.lock](/business/nouns/period/lock) | [Period](/business/nouns/period) | Asks first; waits 1 business hour | [`Period.locked`](/business/events/Period.locked) |
| [Transaction.categorize](/business/nouns/transaction/categorize) | [Transaction](/business/nouns/transaction) | None | [`Transaction.categorized`](/business/events/Transaction.categorized) |
| [Entry.post](/business/nouns/entry/post) | [Entry](/business/nouns/entry) | Asks first; waits 1 business hour | [`Entry.posted`](/business/events/Entry.posted) |
| [Entry.settle](/business/nouns/entry/settle) | [Entry](/business/nouns/entry) | Asks first; waits 1 business hour | [`Entry.settled`](/business/events/Entry.settled) |
| [Budget.create](/business/nouns/budget/create) | [Budget](/business/nouns/budget) | None | `Budget.created` |
| [Period.recognize](/business/nouns/period/recognize) | [Period](/business/nouns/period) | None | [`Period.recognized`](/business/events/Period.recognized) |
| [Statement.list](/business/nouns/statement/list) | [Statement](/business/nouns/statement) | None | None. |

## Events
| Direction | Event | How |
| --- | --- | --- |
| Emits | [`Transaction.reconciled`](/business/events/Transaction.reconciled) | By [Transaction.reconcile](/business/nouns/transaction/reconcile) |
| Emits | [`Period.closed`](/business/events/Period.closed) | By [Period.close](/business/nouns/period/close) |
| Emits | [`Period.locked`](/business/events/Period.locked) | By [Period.lock](/business/nouns/period/lock) |
| Emits | [`Transaction.categorized`](/business/events/Transaction.categorized) | By [Transaction.categorize](/business/nouns/transaction/categorize) |
| Emits | [`Entry.posted`](/business/events/Entry.posted) | By [Entry.post](/business/nouns/entry/post) |
| Emits | [`Entry.settled`](/business/events/Entry.settled) | By [Entry.settle](/business/nouns/entry/settle) |
| Emits | `Budget.created` | By [Budget.create](/business/nouns/budget/create) |
| Emits | [`Period.recognized`](/business/events/Period.recognized) | By [Period.recognize](/business/nouns/period/recognize) |
| Consumes | [`Invoice.collected`](/business/events/Invoice.collected) | Acts on it |
| Consumes | [`Order.paid`](/business/events/Order.paid) | Acts on it |
| Consumes | [`Transaction.settled`](/business/nouns/transaction#transactionsettled) | Acts on it |

## States
None.

## Who operates it
| Part | This System |
| --- | --- |
| Accountable | [Finance Lead](/agents/finance/finance-lead) |
| Team | [Finance Team](/agents/finance) |
| Seat | A role agent holds it until a Human is seated. |
| Autonomy | `assist` |
| Also calls its Verbs | [Treasurer](/agents/finance/treasurer), [Payroll Specialist](/agents/people/payroll-specialist) |

## Approvals and limits
| Verb | Rule | Detail |
| --- | --- | --- |
| [Period.lock](/business/nouns/period/lock) | A person says yes first | Waits 1 business hour |
| [Entry.post](/business/nouns/entry/post) | A person says yes first | Waits 1 business hour |
| [Entry.settle](/business/nouns/entry/settle) | A person says yes first | Waits 1 business hour |
| [Transaction.reconcile](/business/nouns/transaction/reconcile) | Mandate `close-the-books` for the [Finance Lead](/agents/finance/finance-lead) | Reconciles Transactions and closes each Period without asking. |
| [Period.close](/business/nouns/period/close) | Mandate `close-the-books` for the [Finance Lead](/agents/finance/finance-lead) | Reconciles Transactions and closes each Period without asking. |

## Processes that use it
| Process | How it uses it |
| --- | --- |
| [Books](/workflows/processes/books) | A step calls [Transaction.reconcile](/business/nouns/transaction/reconcile) |
| [Payroll](/workflows/processes/payroll) | A step calls [Entry.post](/business/nouns/entry/post) |
| [Expense approval](/workflows/processes/expense-approval) | A step calls [Transaction.categorize](/business/nouns/transaction/categorize) |
| [Supplier payouts](/workflows/processes/supplier-payouts) | A Workflow writes [Statement](/business/nouns/statement) |
| [Budget](/workflows/processes/budget) | A Workflow writes [Budget](/business/nouns/budget) |
| [Payables](/workflows/processes/payables) | A step calls [Transaction.reconcile](/business/nouns/transaction/reconcile) |
| [Runway](/workflows/processes/runway) | Runs on it |

## Rail underneath
None.

## Views and dashboards
| View | Shows | Metrics |
| --- | --- | --- |
| Books | The Statements for each closed Period, and each Budget against actuals. | [Contribution margin](/agents/finance#contribution-margin), [Cost coverage](/agents/finance#cost-coverage), [Fully loaded Cost](/agents/finance#fully-loaded-cost) |
| The [Finance Lead](/agents/finance/finance-lead)’s view | The Metrics its accountable Role answers for. | [Acquisition payback](/agents/finance#cac-payback), [Lifetime value](/agents/finance#ltv), [Contribution per outcome](/agents/finance#contribution-per-outcome) |

## Access
What each Access level may call here.

| Access level | May call |
| --- | --- |
| `owner` | Every Verb (26) |
| `admin` | All but 3 of 26: `Entry.post`, `Entry.settle`, `Period.lock` |
| `member` | All but 6 of 26: `Entry.post`, `Entry.settle`, `Period.lock`, `Policy.create`, `Policy.update`, `Policy.delete` |
| `viewer` | Read only (12 of 26) |

## Import and export
None.

## Fees and pricing
None.

## Availability and limits
| Part | This System |
| --- | --- |
| Status | Beta: it works, and its Verbs may still change |

## Compliance notes
Each closed Period is locked; signing the tax returns stays the founder’s.

Controls it carries:

- [Log completeness](/systems/trust-and-governance/controls/log-completeness)
- [Append-only records](/systems/trust-and-governance/controls/append-only-records)
- [Point-in-time recovery](/systems/trust-and-governance/controls/point-in-time-recovery)
- [Processing definitions](/systems/trust-and-governance/controls/processing-definitions)
- [Segregation of duties](/systems/trust-and-governance/controls/segregation-of-duties)
- [Reconciliation completeness](/systems/trust-and-governance/controls/reconciliation-completeness)
- [Manual Entry review](/systems/trust-and-governance/controls/manual-entry-review)

## Related Systems
- [Treasury](/systems/treasury)
- [Tax](/systems/tax)
- [Reports](/systems/reports)

## Example
An [Agent as a Service](/products/templates/agent-as-a-service) bookkeeper sells a $4,800 annual plan. The payment posts $4,800 to deferred revenue, and [`Period.recognize`](/business/nouns/period/recognize) moves $400 into revenue each month. On the second business day, the [Finance Lead](/agents/finance/finance-lead) Agent reconciles the month to Stripe, locks it, and sends the [Founder](/agents/founding/founder) a profit and loss.