Skip to main content
All Docs
FeaturesagentOS Block ManagerUpdated April 13, 2026

Benchmarking Reference Table

Benchmarking Reference Table

The Benchmarking Reference Table is a platform-maintained directory of typical replacement costs per asset type. It allows agents to build complete reserve fund models even before formal survey data or contractor quotes are available.

Access it via Dashboard → Benchmarking in the sidebar.


Overview

When managing a residential block, you often need to forecast replacement costs for assets before a building survey has been commissioned. The Benchmarking Reference Table provides a library of industry-typical figures that can be applied directly to asset records as estimated costs.

Once a benchmark is applied to an asset:

  • The asset is flagged as isBenchmarked = true, indicating the cost is an estimate rather than a surveyed or quoted figure.
  • The asset appears in the Outstanding Data Requests Tracker, prompting the agent to obtain a site-specific quote when practical.
  • Reserve fund projections can proceed using the benchmarked figure in the interim.

Cost Units

Benchmark costs are expressed in one of four units, depending on what is appropriate for the asset type:

UnitDescriptionTypical use
Per unitCost per individual itemLifts, boilers, entrance doors
Per m²Cost per square metreFlat roofs, external rendering, flooring
Per linear metreCost per linear metreGuttering, fencing, drainage runs
Lump sumFixed cost regardless of quantityFire alarm panels, entry phone systems

When applying a benchmark with a per_sqm or per_lm unit to an asset, you provide a quantity (area or length) and the system calculates the total estimated cost automatically.


Asset Classes

Benchmarks are organised into three asset classes, matching the Asset Register:

  • Plant & Equipment — Mechanical and electrical plant (lifts, boilers, pumps, ventilation systems)
  • Building Fabric — Structural and envelope elements (roofs, external walls, windows, doors)
  • Compliance Works — Statutory compliance items (fire alarm panels, emergency lighting, sprinkler systems)

Stale Data

Benchmark figures should be reviewed and updated annually to reflect current market conditions. The platform flags entries as stale if they have not been reviewed in the past two or more years:

  • A stale count is shown in the summary dashboard card.
  • Stale entries are highlighted with an amber Stale badge in the table.
  • A banner alert appears at the top of the page when any stale entries exist.

Update the Review Year field on each entry when you have verified the cost remains current.


Managing Benchmark Entries

Permissions: Creating, editing, and deleting benchmark entries requires admin role. All members can view the table and use benchmarks when working with assets.

Creating a benchmark

  1. Navigate to Dashboard → Benchmarking.
  2. Click New Benchmark.
  3. Complete the form fields:
    • Asset Class — Select the appropriate class (cannot be changed after creation).
    • Asset Type Name — A descriptive name, e.g. Passenger Lift, Flat Roof, Gas Boiler.
    • Cost Unit — How the cost is expressed (per unit, per m², per linear metre, or lump sum).
    • Typical Cost (£) — The benchmark replacement cost figure.
    • Cost Range — Low / High (£) — Optional lower and upper bounds to indicate market spread.
    • Typical Lifespan (years) — Optional. Pre-fills the estimated lifespan when the benchmark is applied to an asset.
    • Review Year — The year this data was last reviewed. Defaults to the current year.
    • Data Source — Optional. Record the source of the data, e.g. RICS Building Maintenance 2025.
    • Notes — Optional. Any assumptions, inclusions, or exclusions.
  4. Click Create Benchmark.

Editing a benchmark

  1. Locate the entry in the table (use the search bar or class filter).
  2. Click the edit (pencil) icon on the row.
  3. Update the relevant fields and click Save Changes.

Note: The asset class cannot be changed after a benchmark has been created. If you need to reclassify an entry, delete it and create a new one.

Deleting a benchmark

  1. Click the delete (trash) icon on the row.
  2. Confirm the deletion in the prompt.

Deletion is permanent and cannot be undone. Previously benchmarked assets retain their cost values; only the reference entry is removed.


Applying a Benchmark to an Asset

Benchmarks can be applied to individual asset records from the Asset Register. When applying a benchmark:

  1. Open the asset record in the Asset Register.
  2. Use the benchmark lookup to search for the appropriate benchmark by asset class and type name.
  3. Enter a quantity if the cost unit is per_sqm or per_lm.
  4. Optionally check Apply typical lifespan to also pre-fill the asset's estimated lifespan and recalculate the projected replacement year from the install date.
  5. Confirm the action.

The system will:

  • Set the asset's estimatedReplacementCostPence to the calculated cost (benchmark cost × quantity).
  • Set isBenchmarked = true on the asset record.
  • Optionally update estimatedLifespanYears and recalculate projectedReplacementYear.
  • Record the action in the audit trail, including the benchmark source, review year, quantity, and calculated cost.

Summary Dashboard

The Benchmarking page header shows four summary cards:

CardDescription
Total BenchmarksTotal number of benchmark entries in your table
Asset ClassesCount of entries per class (P&E / Fabric / Compliance)
Review Year RangeOldest review year in the table through to the current year
Stale EntriesCount of entries not reviewed in 2+ years

API Reference

All benchmarking operations are available via tRPC under the benchmarking namespace.

benchmarking.list

Returns a paginated list of benchmark entries for the organisation.

Input:

{
  limit?: number;          // Default: 50
  cursor?: string;         // Pagination cursor (entry ID)
  assetClass?: "plant_and_equipment" | "building_fabric" | "compliance_works";
  search?: string;         // Partial match on asset type name
}

Access: All org members.


benchmarking.getById

Fetches a single benchmark entry by ID.

Input:

{ id: string }

Access: All org members.


benchmarking.lookup

Quick lookup for use in asset forms — returns benchmarks matching a given asset class, optionally filtered by search query. Returns up to 50 results ordered by asset type name.

Input:

{
  assetClass: "plant_and_equipment" | "building_fabric" | "compliance_works";
  search?: string;
}

Access: All org members.


benchmarking.summary

Returns dashboard-level statistics for the benchmark table.

Response:

{
  totalEntries: number;
  byClass: {
    plant_and_equipment: number;
    building_fabric: number;
    compliance_works: number;
  };
  oldestReviewYear: number | null;
  staleCount: number;       // Entries with reviewYear < currentYear - 1
  currentYear: number;
}

Access: All org members.


benchmarking.create

Creates a new benchmark entry. All CRUD mutations are audit-logged.

Input:

{
  assetClass: "plant_and_equipment" | "building_fabric" | "compliance_works";
  assetType: string;                   // Max 255 chars
  costUnit: "per_unit" | "per_sqm" | "per_lm" | "lump_sum";
  costPence: number;                   // Typical cost in pence (integer)
  costLowPence?: number;               // Optional lower bound in pence
  costHighPence?: number;              // Optional upper bound in pence
  typicalLifespanYears?: number;       // 1–200
  isDefault?: boolean;                 // Platform default flag
  source?: string;                     // Max 500 chars
  reviewYear: number;                  // 2000–2100
  notes?: string;
}

Access: Admin only.


benchmarking.update

Updates fields on an existing benchmark entry. Asset class cannot be updated.

Input:

{
  id: string;
  assetType?: string;
  costUnit?: "per_unit" | "per_sqm" | "per_lm" | "lump_sum";
  costPence?: number;
  costLowPence?: number;
  costHighPence?: number;
  typicalLifespanYears?: number;
  source?: string;
  reviewYear?: number;
  notes?: string;
}

Access: Admin only.


benchmarking.delete

Permanently deletes a benchmark entry.

Input:

{ id: string }

Response:

{ success: boolean }

Access: Admin only.


benchmarking.applyToAsset

Applies a benchmark cost to an asset record. Sets isBenchmarked = true, writes the estimated replacement cost, and optionally updates the estimated lifespan and projected replacement year.

Input:

{
  benchmarkId: string;
  assetId: string;
  quantity?: number;        // Multiplier for per_sqm / per_lm units. Default: 1
  applyLifespan?: boolean;  // Also apply typicalLifespanYears to the asset. Default: false
}

Response:

{
  asset: AssetRecord;           // Updated asset record
  appliedCostPence: number;     // Calculated cost (benchmarkCostPence × quantity)
  benchmarkSource: string | null;
  benchmarkReviewYear: number;
}

Access: Admin only.


Audit Trail

All create, update, delete, and applyToAsset operations are recorded in the compliance audit trail with the following action codes:

ActionTrigger
benchmarking.reference_createdA new benchmark entry is created
benchmarking.reference_updatedA benchmark entry is edited
benchmarking.reference_deletedA benchmark entry is deleted
benchmarking.applied_to_assetA benchmark is applied to an asset record

Each audit record includes relevant metadata such as asset type, cost unit, cost in pence, review year, and (for applied_to_asset) the quantity, calculated cost, and whether a lifespan was applied.