Cost codes
Define the budget-code structure every budget line, commitment, change order and cost is filed against, then narrow it per project
A budget code is the filing key for every dollar in LEDGER. Nothing financial can be created on a project until a budget code can be composed, so this is the first thing to set up.
Cost codes are defined once for the whole company at Settings → Cost codes, and each project can narrow what its pickers offer at Settings → Cost codes under Current project.
How a budget code is built
Your company defines an ordered list of segments. A segment is one part of the code, such as Phase, Cost Type or Contract Item. Each segment carries the codes it may take, and each segment has a separator that prints between its value and the next one.
A budget code is one value per segment joined by the separators, producing a
flat code such as 000100-3-01-001. That flat code is what every register
aggregates against.
| Segment property | What it does |
|---|---|
| Order | Where the segment sits in the composed code |
| Type | Phase, Cost Type, Contract Item, Sub Job, or Custom |
| Values | Flat (an unordered list) or Tiered (codes nest, the way CSI divisions hold sections) |
| Separator | The characters printed after this segment's value |
| Required | Whether a code must carry a value for this segment |
An optional segment composes as an empty string between its separators, which
is why a Timberline-style phase prints as 000100- -.
Set up the structure
- Go to Settings → Cost codes under Account management. This surface requires organization OWNER or ADMIN.
- If you have no structure yet, click Start from CSI MasterFormat to create a tiered Phase segment seeded with the CSI MasterFormat 2020 divisions and sections. Divisions land at tier 1, sections at tier 2 under their division. Reserved divisions are seeded retired.
- Otherwise define your own segments in Code structure.
- Add each segment's codes in its code panel.
The CSI seed is safe to re-run: values the segment already carries are skipped rather than duplicated.
Loading codes into a segment
| Action | What it does |
|---|---|
| Add codes | Type values and descriptions by hand |
| Import CSV | Load your existing list from a file |
| CSI seed | Pull the CSI MasterFormat 2020 set into a tiered segment |
| Map legacy codes | Propose, per legacy row, which existing code it maps onto |
Map legacy codes is the AI affordance here. Rows whose normalized values match exactly are decided on the server with no model call at all, because an exact match must never be inferred. The rest come back as a proposed target with a stated confidence, or as no defensible target. Nothing is ticked by default and nothing is written until you tick rows and confirm, so closing the dialog leaves the segment exactly as it was. It is a metered AI operation.
The structure locks once codes exist
As soon as a company has any budget code, the code structure is locked. Segments can no longer be reshaped. The refusal says so:
This company already has budget codes, so its code structure is locked. Deactivate codes or adjust per-project overrides instead of reshaping segments.
This is deliberate. Reshaping a segment after records are filed against it would silently re-key history. Retire codes you no longer want offered, or restrict them per project instead.
Codes are retired, never deleted
A code with history has to stay resolvable on the records that carry it, so codes are never hard-deleted. Setting one inactive drops it from pickers and leaves every existing record readable.
Narrowing a project
Settings → Cost codes under Current project shows what a picker on that project may compose: the company structure, minus the segments this project hides, with each segment's code set optionally narrowed to a subset. Every row says whether it is inherited from the company or overridden here.
- A restriction filters pickers. It never rewrites history: a record already holding a now-restricted code still resolves and still renders.
- Reading the effective structure is open to any project member, because that is what their own pickers offer.
- Changing it is an organization OWNER or ADMIN action, because narrowing a project's cost-code vocabulary is financial configuration rather than data entry. A member sees the read-only picture rather than controls that would fail.
Cost types
Cost Type is a fixed eight-value list, in this order:
| Code | Name |
|---|---|
| 1 | Labor |
| 2 | Burden |
| 3 | Subcontract |
| 4 | Material Purchase Order |
| 5 | Owned Equipment |
| 6 | Rented Equipment |
| 7 | Other |
| 8 | Misc Materials |
Limits
| Limit | Value |
|---|---|
| Segments per company | 13 |
| Custom-type segments per company | 10 |
Where budget codes are used
Every one of these records carries one, and every one of them rolls up to the Budget register through it:
- Budget lines and budget-change lines
- Commitment lines and change-order lines
- Change-event pricing lines, and the change event's own expected code
- Direct costs