In production

Bid qualification and response

Water treatment chemical supplier. ConstructConnect, email, pricing database.

Situation

One estimator did all of the company's bid work by hand. Bids arrive as construction packages running to two thousand pages, and for each one he found the water treatment scope, did the takeoff, priced it, and assembled the documents. He got through one to two a week. Everything past that was left on the table, and the ceiling on the business was one person's reading speed.

What we built

Agents pull new projects from the bid aggregator each day, read the documents, and decide against the company's own qualification rules whether the job is worth bidding, with the reasoning either way. Qualified projects come back as a priced bid built from the product catalog and historical bids, and arrive in his inbox as an email: here is the project, here is why it fits, here are the open questions, here is the workbook for the general contractor. He never talks to an AI. He reviews and sends instead of reading plans for hours.

How it works

  • Qualification is domain judgment rather than keyword matching. Specific part numbers signal fit, no-treatment scopes get skipped, and single-vendor bids still get priced.

  • A scraper keeps a project database in sync with the aggregator daily, tracked in Postgres with row-level security, so nothing depends on anyone remembering to check the portal.

  • Every bid produces a structured estimate workbook saved to the knowledge base. The artifact is the system of record, not a chat transcript.

Impact

$5.37M

in priced bids year to date, across 309 projects in multiple states, with zero added headcount.

98.2%

AI qualification rate, including two correct sole-source walk-aways. Declining to bid is the judgment call, not the throughput.

+31%

average bid value quarter over quarter. The first six weeks of the following quarter matched the prior full quarter's revenue.

The first new state was brought online on the same infrastructure with no incremental operations work.

Have a function like this one?

Tell us where you would start and we will tell you what it would take.

patrick@boguelabs.ai