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:
| Unit | Description | Typical use |
|---|---|---|
| Per unit | Cost per individual item | Lifts, boilers, entrance doors |
| Per m² | Cost per square metre | Flat roofs, external rendering, flooring |
| Per linear metre | Cost per linear metre | Guttering, fencing, drainage runs |
| Lump sum | Fixed cost regardless of quantity | Fire 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
- Navigate to Dashboard → Benchmarking.
- Click New Benchmark.
- 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.
- Click Create Benchmark.
Editing a benchmark
- Locate the entry in the table (use the search bar or class filter).
- Click the edit (pencil) icon on the row.
- 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
- Click the delete (trash) icon on the row.
- 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:
- Open the asset record in the Asset Register.
- Use the benchmark lookup to search for the appropriate benchmark by asset class and type name.
- Enter a quantity if the cost unit is
per_sqmorper_lm. - Optionally check Apply typical lifespan to also pre-fill the asset's estimated lifespan and recalculate the projected replacement year from the install date.
- Confirm the action.
The system will:
- Set the asset's
estimatedReplacementCostPenceto the calculated cost (benchmark cost × quantity). - Set
isBenchmarked = trueon the asset record. - Optionally update
estimatedLifespanYearsand recalculateprojectedReplacementYear. - 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:
| Card | Description |
|---|---|
| Total Benchmarks | Total number of benchmark entries in your table |
| Asset Classes | Count of entries per class (P&E / Fabric / Compliance) |
| Review Year Range | Oldest review year in the table through to the current year |
| Stale Entries | Count 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:
| Action | Trigger |
|---|---|
benchmarking.reference_created | A new benchmark entry is created |
benchmarking.reference_updated | A benchmark entry is edited |
benchmarking.reference_deleted | A benchmark entry is deleted |
benchmarking.applied_to_asset | A 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.