Expenses & cost tracking

Where every O&M dollar lands - automatic cost posting from work orders, expenses, purchase orders, invoices, and budgets - building each asset's total cost of ownership.

Cost data in AssetLab is a by-product of doing the work, not a separate bookkeeping chore. If work orders are closed honestly, the spend picture assembles itself - and what it assembles into, asset by asset, is Total Cost of Ownership (TCO): what a thing really costs over its life, not just what it cost to buy.

How costs enter the system

PathWhat it captures
Work order completionLabour hours × rates, parts consumed, contractor amounts - posted to the asset automatically
ExpensesCosts not tied to a single work order (utilities allocations, one-off purchases)
Purchase ordersCommitted spend - parts restocks, contracted purchases - tracked from issue to receipt
InvoicesThe billed reality, linkable to POs and projects
Manual asset costsHistorical or external cost events entered directly on an asset

Every cost event carries a cost category (labour, materials, contract, utilities…) - the editable catalog that gives spend reports their rows.

Adding a cost by hand

Add Expense on the Expenses page and Assign Cost in the sidebar open the same form. If your organization runs both workspaces and you can see both, a Facilities / Infrastructure switch at the top picks what the cost attaches to: an asset, or a network feature you find by network and search. Members scoped to one workspace get that workspace's form directly.

The form's categories are Repair, PM, Operation, Replacement, Decommission and Other. A betterment is not a cost category here: record it on the asset as a betterment, which also moves its remaining life and value.

What completion actually posts

When a work order completes, the total of its actual cost, parts cost, and labour posts automatically - but only when that total is greater than zero, so a zero-cost close leaves no noise in the ledger. The total is split evenly across every asset linked to the work order: a $600 job on three assets posts $200 to each. The category is inferred from the work order's type, or from a name match on its work category - so "Plumbing Repair" work lands under the right report row without anyone tagging it.

Labour rates

Labour converts to money through hourly rates: each user can carry an effective-dated rate, with a tenant default for everyone unrated. Administrators manage both under Settings → Labour rates. Rate changes take effect from their date forward - a work order completed last year keeps last year's rate, so historical costs never rewrite themselves.

At completion, the work order's hours are split evenly across its assignees, and each share is costed at that person's rate in force on the completion date (the tenant default where they have none). Rates are compensation data: the per-person breakdown is visible to Managers and above.

Where costs roll up

A cost lands on an asset and is immediately visible:

Narrowing the Expenses list

If your organization runs both workspaces and you can see both, a Facilities / Infrastructure / Shared switch sits at the top of the page. Shared, where the page opens, lists every cost together with a Source column; Facilities narrows to asset costs; Infrastructure swaps in the infrastructure list and its filters, described next. Members scoped to one workspace see only that workspace's costs and no switch.

In the Infrastructure workspace the Expenses page filters on Type (the cost category), a Period - this year, the last 12 months, last year, the last 3 years, or all time - whether the cost came from a work order or was entered directly, and whether it carries an invoice number. The last two are the reconciliation view: "what did we spend outside a work order last year" and "what is still missing an invoice" are each one selection. They sit beside the network, class, type and condition filters, so a question can be narrowed by the estate and by the ledger at once.

The Facilities view filters by site, building, location, system class, group, system and cost type. Both views' search boxes cover invoice numbers, PO numbers, and the asset or feature the cost sits on.

Total cost of ownership

The point of all this capture is TCO. An asset's cost history - acquisition, every repair, every PM visit, parts, contractor calls - accumulated against its replacement value turns gut-feel questions into arithmetic:

TCO only works if capture is habitual - which is why costs ride along with work order completion instead of living in a separate ledger someone has to remember to feed.

Budgets

Annual funding budgets are set per year, per funding source, and per module (organization-wide, facilities, or infrastructure), and the dashboard's budget tab tracks actuals against them through the year - see Budget. Capital project budgets are separate and richer - see Budgets & financials.

Currency

Export at the top of the Expenses page downloads the current page of results as a CSV file. All money displays in your organization's configured currency (organization settings) - including exports and reports.

Habits that keep the data honest

  1. Costs at completion, every time. A 30-second estimate beats a blank; blanks compound into "we have no idea what this building costs".
  2. Use categories consistently - five clean categories outperform twenty vague ones.
  3. Don't double-post. If a contractor invoice is entered against the work order, it doesn't also go in as a standalone expense.

Programmatic access

invoices:read/write, purchase_orders:read/write, plus asset-cost tools on the REST API and MCP.