User Guide
04.8 · Direct Costs

Custom Columns

Custom columns let you add arbitrary fields to the Direct Cost, Overhead, Resource or Breakdown grids without touching the schema. They are stored as JSON on each row and surfaced as columns on the grid.

Creating a Column

  1. Right-click any column header → Manage Custom Columns.
  2. Click Add Column.
  3. Pick:
  4. Name (appears as the column header).
  5. Data Type (Text, Number, Date, Boolean, Formula).
  6. Format (decimal places, prefix / suffix).
  7. Default Value (applied to existing and new rows).
  8. Where it appears (Direct Costs / Overheads / Resources / Breakdowns / Carbon).

Storage

Values live in the CustomColumnValues JSON blob on each row. The column definition itself is a ProjectCustomColumn record with:

  • Name, DisplayName, DataType, DefaultValue.
  • TargetEntity (enum: DirectCostItem, Overhead, Resource, Breakdown, ...).
  • SortOrder — position on the grid.
  • IsVisible — show/hide without deleting.
  • IsRequired — validation.
  • FormulaExpression (for computed columns).

Computed Columns

Set DataType = Formula and the cell becomes read-only, computed from the formula. The formula runs in the same engine as cell formulas, so it can reference other columns, line references, and defines.

Example: a TotalWithWaste column

Formula: #lq.Quantity * ResourceRate * (1 + #waste_pct/100)

Aggregating Custom Columns

Use the *CC family of functions in formulas elsewhere:

FunctionPurpose
SUMCC("ColumnName")Sum of the column across all rows.
SUMCC("ColumnName", start, end)Sum over a line range.
AVGCC, MINCC, MAXCC, COUNTCCStatistical aggregates.
SUMIFCC("Column", "Match")Sum where the column equals a value.
COUNTIFCC, AVGIFCCConditional count / average.

Refer to custom column values on the same row with #cc.ColumnName.

Import / Export

  • Excel export includes custom columns as extra sheets.
  • CSV export flattens them into standard columns.
  • JSON project backup preserves column definitions and all values.

Renaming a Column

Renaming updates the definition without touching stored data — existing JSON keys are rewritten when you save. Formulas referencing the old name do not auto-update; search and replace them after a rename.

Deletion

Deleting a column soft-removes the definition and zeroes the JSON keys on all rows.

Per-User Visibility

Each user can hide/show custom columns via the column chooser without affecting other users. Admins control which columns exist.