You ran a tender. You awarded a rate. Eleven months later nobody in the business can tell you what that trade actually cost per home, because the answer is spread across thousands of purchase orders and nobody has ever added them up against the bid sheet.
Every individual order looks reasonable. A scope addition here, an off-contract order because the awarded vendor could not get there, a unit price that moved four per cent in March and never moved back. None of them is worth escalating on its own. Together they are the difference between the rate you negotiated and the rate you are paying.
Drift is quiet by construction. It does not appear in a variance report, because the variance report compares actual against budget, and the budget was already built on the drifted rate. It compounds into the next tender, because the next tender starts from the last awarded rate rather than from what the work has actually been costing.
The model reconciles awarded against paid, per trade and per scope code, normalised to a unit of work so a bigger home does not read as a worse rate. Then it splits the gap into the four causes, because each one has a different owner and a different fix.
Work that was genuinely added. Legitimate, and it belongs in the rate conversation as scope rather than as price.
Spend that went to a vendor who did not win the tender. Usually urgent, usually unpriced, almost never reviewed.
Same scope, same vendor, higher unit price than the award. The one that compounds into the next tender.
Paid to unstick a week. Not a purchasing failure — it is a scheduling one, and it should be charged there.
The rest of this model — the data sets it runs on, the cause split, the working behind the reference figure and a sample output — goes out by email. Two fields, nothing else.