What we measure, how we calculate it, and why it matters.
Five core metrics aligned to real campus planning decisions. Each carries an explicit definition, calculation logic, source-of-truth, and the decision it informs — so the same number means the same thing across every report.
OpenBlue is the authoritative source for space inventory. Every metric that touches “what space exists” reconciles to OpenBlue first. Other sources (sensors, badge, reservations) are layered on top — never substituted. This is the single most important decision in the framework. It eliminates the “which number is right?” conversation.
The count of seats available for assignment, by building × floor × space type, reconciled to OpenBlue and adjusted for unavailable inventory.
The highest-day-of-week observed utilization rate, calculated over a rolling 8-week window. Used for capacity sizing — averaging hides the real demand.
A categorical signal flagging building × day-of-week combinations approaching unsafe density. Translates utilization into action thresholds.
For each space type, the demand-adjusted utilization — accounting for booking no-shows on reservable spaces. Tells design which space types are working.
For each team, the gap between assigned seats and observed peak attendance. Surfaces over-allocation that could be reclaimed without footprint reduction.
Every metric above is implemented as a Postgres view in our staging environment. Below: the canonical definitions, executable and version-controlled.
-- Metric 1: Reliable seat supply (by building × floor × space type) create or replace view v_reliable_seat_supply as select s.building_id, s.floor, s.space_type, count(*) as seats_in_inventory, count(*) filter (where s.status = 'IN_SERVICE') as reliable_seats, count(*) filter (where s.status = 'OUT_OF_SERVICE') as out_of_service, count(*) filter (where s.status = 'CAPITAL_PROJECT') as in_capital_project from openblue.spaces s group by s.building_id, s.floor, s.space_type;
-- Metric 3: Capacity risk by building × day-of-week (rolling 8-week window) create or replace view v_capacity_risk as with windowed as ( select * from v_daily_building_utilization where day >= current_date - interval '8 weeks' ) select building_id, day_of_week, avg(utilization_pct) as avg_utilization, max(utilization_pct) as peak_utilization, case when max(utilization_pct) > 0.85 then 'HIGH' when max(utilization_pct) > 0.70 then 'MEDIUM' else 'LOW' end as risk_level, count(*) as observations from windowed group by building_id, day_of_week;