Stefan Hansen ← All work

Bidders List Construction — preconstruction and estimating 2026

A thousand firms, spelled six ways each, resolved into one book.

A bid-tracking database for one estimator, built around identity rather than storage: the same subcontractor arrives in the inbox under six spellings, and a split bid history is worse than none. It resolves them into one firm and files incoming bids from email.

From the activity feed of bids the intake filed on its own, to the queue of the ones it refused to guess at, to a single firm with its contacts, trades and full bid history.

Role

Product direction · Strategy · Interface design · Information architecture · Build direction

Client

Nelson Construction & Development

The problem

A bidders list is an estimator's contact book: who bids what, and how often they win. The problem is not storage but identity. The same firm arrives as Ironwood Mechanical, Ironwood Mech., IRONWOOD MECHANICAL LLC, ironwood, a bare email address, or a phone number in the company field — each a separate row, so one firm's history splits across five incomplete records. The tool still answers the question. It answers it wrongly.

The home view: totals across the book, win rate, the firms that bid most, and an activity feed of bids the intake filed on its own.
The home view: totals across the book, win rate, the firms that bid most, and an activity feed of bids the intake filed on its own.
The home view: totals across the book, win rate, the firms that bid most, and an activity feed of bids the intake filed on its own.
The home view: totals across the book, win rate, the firms that bid most, and an activity feed of bids the intake filed on its own.

It was built for one person

The audience is one estimator, which made it possible to leave things out: no permissions, no roles, no settings page, no onboarding, no administration. It sits alongside the enterprise preconstruction system the company runs — that is the record, this is one person's working copy of the slice he cares about, which licenses it to be aggressive about merging and matching.

The book itself — the subcontractors with their trades, bid counts and tags, searchable and filterable by division.
The book itself — the subcontractors with their trades, bid counts and tags, searchable and filterable by division.
The book itself — the subcontractors with their trades, bid counts and tags, searchable and filterable by division.
The book itself — the subcontractors with their trades, bid counts and tags, searchable and filterable by division.

The inbox does the data entry

Bids arrive by email, so the tool reads the mailbox. Unread bid mail is picked up with attachments, signatures and quoted replies stripped, and the bid pulled from what remains: which project, which trade, what scope, what is quoted, when it came in. Nobody does data entry.

Subject lines rarely match the project name as filed, so jobs carry aliases and matching runs against those too. For the firm, a first pass narrows the field to around thirty plausible candidates and the judgement is made only across those; new contacts on the thread are matched by normalised name and phone digits.

The review queue: what the intake would not guess at, each item carrying the email it arrived on, the reason it hesitated, and scored merge candidates offered as one-click resolutions.
The review queue: what the intake would not guess at, each item carrying the email it arrived on, the reason it hesitated, and scored merge candidates offered as one-click resolutions.
The review queue: what the intake would not guess at, each item carrying the email it arrived on, the reason it hesitated, and scored merge candidates offered as one-click resolutions.
The review queue: what the intake would not guess at, each item carrying the email it arrived on, the reason it hesitated, and scored merge candidates offered as one-click resolutions.
One firm: its contacts with direct lines, the divisions it works in, and every job it has bid with the outcome.
One firm: its contacts with direct lines, the divisions it works in, and every job it has bid with the outcome.
One firm: its contacts with direct lines, the divisions it works in, and every job it has bid with the outcome.
One firm: its contacts with direct lines, the divisions it works in, and every job it has bid with the outcome.

The rest of it

  • It declines to guess, and says why. An unconfident match goes to a review queue with the original email, the best guess and the reason it hesitated — two bidders matched the sender's domain.
  • Duplicates are cheap to fix rather than prevented. A merge previews what will move, snapshots the before state, and can be undone.
  • The cleaning sweep shows its work first. It reports probable junk and duplicates without changing anything, and sweeps an abbreviation only when the record is also a likely duplicate with no contacts.
  • Search, then the awkward question. One search across firms, contacts, trades and projects, with a filter builder underneath: a division, two or more bids, not on the avoid list, exported to a spreadsheet.
  • The home view. Totals, win rate, the five most frequent bidders, the deepest divisions, and a live feed. Firms carry four tags — preferred, pro, watch, avoid — and trades across 22 divisions.
Coverage by CSI division — where the bench is deep and where there are only one or two firms to call.
Coverage by CSI division — where the bench is deep and where there are only one or two firms to call.
Coverage by CSI division — where the bench is deep and where there are only one or two firms to call.
Coverage by CSI division — where the bench is deep and where there are only one or two firms to call.

What changed

  • A split history became one history. Firms, bids and named contacts in one book, aliased so one firm never becomes two.
  • The book maintains itself from the inbox. Bids are read, matched and filed against the right firm and job, with no data entry step to skip.
  • Uncertainty became visible instead of silent. What the matching is unsure about goes to a queue with the reason stated, rather than filed on a guess.
  • Bulk cleaning became safe to do. The sweep reports before it commits.
  • One person got a tool shaped to how he works. No roles, no permissions, no settings.