Ledger Table
Data · LedgerTable, PnLStatement, ReceiptSuggestion
Bookkeeping: LedgerTable (bookings with project and agent suggestions), PnLStatement and ReceiptSuggestion.
LedgerTable: rows ({id, date, ref, text, category, project, projectTint, net, vat, gross, suggested, status, statusLabel}), categories (makes the category editable in place) + onEdit(row, change), currency, selectable, bulkActions, toolbar, maxHeight.
PnLStatement: columns (months), rows ({kind: "section" | "subtotal" | "total", label, values}), currency, total (false hides it).
ReceiptSuggestion: file, source, fields ({label, value, mono, confidence 0–1}), suggestion, onConfirm, onDiscard, confirmLabel, discardLabel, children.
- Agent suggestions carry the signal diamond until a person confirms them.
- Negative amounts are blush; amounts use the locale's currency format.
| Ref. | Description | Category | Project | VAT | Status | ||||
|---|---|---|---|---|---|---|---|---|---|
| 02.04. | RE-0412 | Hetzner Online GmbH | Hosting | Northwind | €84.03 | €15.97 | €100.00 | Booked | |
| 03.04. | ST-2231 | Stripe payout | Revenue | Chatteo | €4,210.00 | €0.00 | €4,210.00 | Booked | |
| 04.04. | MAIL-88 | Google Ireland Ltd. Suggested by Ledger | Marketing | Northwind | -€320.00 | €0.00 | -€320.00 | Suggested |
| Jan | Feb | Mar | Total | |
|---|---|---|---|---|
| Revenue | ||||
| Subscriptions | €18,200 | €19,400 | €21,100 | €58,700 |
| One-off | €2,100 | €1,800 | €2,600 | €6,500 |
| Costs | ||||
| Hosting | -€820 | -€840 | -€910 | -€2,570 |
| Marketing | -€4,200 | -€3,900 | -€5,100 | -€13,200 |
| Result | €15,280 | €16,460 | €17,690 | €49,430 |
Rechnung_2026-0412.pdfFrom billing@hetzner.com · 2 Apr
VendorHetzner Online GmbH99 %
Date02.04.202698 %
Gross€100.0097 %
VAT19 %72 %
Hosting · Northwind · as every month
Props
LedgerTable
| Prop | Type | Notes |
|---|---|---|
rows | LedgerRow[] | Required |
categories? | string[] | |
onEdit? | (row: LedgerRow, change: Partial<LedgerRow>) => void | |
currency? | string | |
selectable? | boolean | |
bulkActions? | BulkAction<LedgerRow>[] | |
toolbar? | ReactNode | |
maxHeight? | number | |
columnToggle? | boolean | |
className? | string | Extra class on the root element. |
style? | CSSProperties | Inline style on the root element. |
PnLStatement
| Prop | Type | Notes |
|---|---|---|
columns | string[] | Required |
rows | { kind?: "section" | "subtotal" | "total"; label: string; values?: number[] }[] | Required |
currency? | string | |
total? | boolean | |
label? | string | |
className? | string | Extra class on the root element. |
style? | CSSProperties | Inline style on the root element. |
ReceiptSuggestion
| Prop | Type | Notes |
|---|---|---|
file | string | Required |
source? | ReactNode | |
fields | { label: string; value: ReactNode; mono?: boolean; confidence?: number }[] | Required |
suggestion? | ReactNode | |
onConfirm? | () => void | |
onDiscard? | () => void | |
confirmLabel? | string | |
discardLabel? | string | |
children? | ReactNode | |
className? | string | Extra class on the root element. |
style? | CSSProperties | Inline style on the root element. |