An estimator prices a structural job on a Tuesday night, pulls the plate and tube numbers from a sheet on the shared drive, and sends the bid before midnight. The sheet was accurate when it was saved. It was saved in 2024. Nothing on the bid looked wrong, and nothing about the file said it had been replaced twice since.
How a stale number gets into a live bid
Open the pricing folder of almost any fab shop or mechanical contractor and you will find the same archaeology: "Pricing - MASTER.xlsx," "pricing 2025 new FINAL(2).xlsx," a supplier PDF that only exists as an attachment on an email from March, and a scanned sheet someone photographed off the counter at the supply house. Each was the truth once. Nothing marks which one is the truth now.
The stakes are not abstract. Steel pricing moves on a mill base plus surcharges that shift monthly, which is why supplier quotes carry validity windows — often fifteen or thirty days, printed right on the quote. Copper and refrigerant move the same way for mechanical work. On a job where material is half the cost, a few points of movement between the sheet you quoted from and the sheet that is actually current can consume the margin before the first cut is made. The unit that matters here is margin per job, and stale pricing attacks it invisibly, because the bid still looks fine.
Why search cannot tell the years apart
Here is the part that surprises people who assume software will fix this. Modern document search — the kind behind AI assistants — works by meaning. It converts text into a mathematical representation of what the text is about, then finds the stored passages closest in meaning to the question.
Now consider two versions of the same price sheet. Same supplier, same layout, same column headers, same part descriptions: "A36 plate, 1/2 inch, per cwt" in the 2019 sheet and the identical line in the 2026 sheet. The only difference is the numbers, and numbers contribute almost nothing to a representation of meaning. To the search system, those two lines are essentially the same sentence. Ask "what do we pay for half-inch plate" and every version of the sheet matches the question equally well. Which one comes back first is effectively arbitrary — and a date buried in a filename does not help, because matching by meaning does not include reasoning about which document should win. The system was built to find relevant text, and every version is relevant.
An assistant makes the same mistake faster
Point an AI assistant at the shared drive as it stands and it does exactly what the tired estimator did — minus the suspicion. It retrieves a well-matched passage from a superseded sheet and quotes the number fluently, in a complete sentence, with nothing hesitant in its voice. The failure is not that the model is bad. The failure is that nothing in the pipeline ever told it the document had been replaced.
This is worth sitting with, because it inverts the sales pitch you will hear elsewhere. An estimator at midnight might squint at a number that feels low and go check. The system's answer never feels off. Speed and confidence applied to a stale source produce a worse outcome than the manual process, not a better one. Whether the answer is right is decided before the question is asked, by how the documents were prepared.
The fix is a date, enforced
The fix is boring, which is a point in its favor. When a pricing document enters the system, it gets tagged with structured facts about itself: the supplier, an effective date, and — when its replacement arrives — a superseded date. Then the retrieval step filters before it searches. A pricing question may only be answered from documents whose effective window covers today. Recency is not a preference that nudges the ranking; it is a hard gate that stale sheets cannot pass.
The old sheets are not deleted. "What did we bid this at in 2023" is a genuinely useful question, and the archive answers it — but only when the question is historical, and the answer arrives labeled as history. A document with no effective date at all does not get to answer pricing questions, period. "I don't have a current price for that" is a better answer than a fluent wrong one, and building the system to say so is a design decision, not a limitation.
One price book, and an archive for everything else
The tagging only works if the business adopts a small ritual: one designated current price book per supplier or category, and a standing rule for what happens when new pricing arrives. New sheet in, effective date recorded, old sheet moved to the archive and marked superseded. Five minutes, whenever a supplier reprices.
That ritual is the actual system. The software's contribution is refusing to let undated pricing into the index, which converts "someone should keep the drive clean" — advice that has never worked anywhere — into a gate that makes the clean-up happen at the only moment it can: when the document arrives.
What this does not solve
The system cannot know a price changed if nobody files the change. The supplier who calls to say plate is going up four percent Monday has altered your costs without altering any document, and no retrieval pipeline can see a phone call. Someone still owns the price book — this arrangement makes that job smaller, not optional. It does not validate your margins, and it will faithfully serve a supplier's own typo. It also will not repair quoting discipline: holding a bid open sixty days against a fifteen-day supplier quote is a business decision, not a search problem. And the first week is unglamorous — a person has to go through the drive once and rule on which sheets are current. There is no automating that judgment, and anyone who says otherwise is selling the confident wrong answer this page is about.
Where to start
Pull the last ten bids and trace each material number back to the sheet it came from, then check the sheet's date. If every number traces cleanly to current pricing, your discipline is already good and this page is not your problem. If you cannot tell where a number came from — that is the finding, and it costs nothing but an afternoon to make.