Expert guide

Construction Bid Tracking Spreadsheet

Price the jobs you can win, decline the ones you cannot, and never miss a due date

Short answer: log every invitation to bid in one Excel Table with client, project type, size, estimator, due date, bid amount, estimated margin, estimating hours, status and outcome. Add a due-soon view, calculate win rate by client and project type with COUNTIFS, score new invitations with a simple go/no-go formula based on your own history, and review lost bids monthly. When a bid is won, it becomes a job in your construction job costing spreadsheet.

Estimating is expensive. Every bid takes hours of takeoff, supplier quotes and pricing, and most bids are lost. Contractors who grow profitably are not the ones who bid the most; they are the ones who know which bids they win and price those well. That knowledge lives in a bid log, if anyone keeps one.

The Bid Log

ColumnPurpose
BidNo, Project, LocationIdentification
Client / GC, RelationshipWho invited you; repeat, new, or public tender
ProjectType, SizeBandFit-out, new build, civil, service; <$250k, $250k–$1M, $1M+
EstimatorAccountability and workload
InvitedOn, DueOnTimeline
EstHoursEstimating effort spent
BidAmount, EstCost, Margin %Commercial position
StatusInvited, Estimating, Submitted, Won, Lost, Declined
DecisionOn, WinnerPrice, LossReasonLearning from outcomes

Due Date Control

DaysToDue:
=IF(OR([@Status]="Invited", [@Status]="Estimating"), [@DueOn] - TODAY(), "")

Due-soon list for the morning meeting:
=SORT(FILTER(tblBids[[BidNo]:[DueOn]],
       ISNUMBER(tblBids[DaysToDue]) * (tblBids[DaysToDue] <= 7),
       "Nothing due this week"), 7, 1)

Conditional formatting on DaysToDue (red under 2, amber under 5) makes the log readable at a glance. Add estimator workload: open bids per estimator due in the next 14 days.

Win Rate the Useful Way

Decided bids (submitted with an outcome):
=COUNTIFS(tblBids[Status], "Won") + COUNTIFS(tblBids[Status], "Lost")

Win rate by client (client name in A2):
=LET(w, COUNTIFS(tblBids[Client], A2, tblBids[Status], "Won"),
     l, COUNTIFS(tblBids[Client], A2, tblBids[Status], "Lost"),
     IF(w + l = 0, "", w / (w + l)))

Dollar win rate:
=SUMIFS(tblBids[BidAmount], tblBids[Status], "Won") /
 (SUMIFS(tblBids[BidAmount], tblBids[Status], "Won") +
  SUMIFS(tblBids[BidAmount], tblBids[Status], "Lost"))

Estimating hours per win:
=SUMIFS(tblBids[EstHours], tblBids[Client], A2) /
 MAX(1, COUNTIFS(tblBids[Client], A2, tblBids[Status], "Won"))

Hours per win is the number that changes behaviour. A client you win one bid in twelve from, at 30 estimating hours a bid, costs 360 hours per job won.

A Go/No-Go Score From Your Own History

Score a new invitation (0–10):
=LET(
  clientRate, IFERROR(XLOOKUP([@Client], tblClientStats[Client], tblClientStats[WinRate]), 0.15),
  typeRate,   IFERROR(XLOOKUP([@ProjectType], tblTypeStats[Type], tblTypeStats[WinRate]), 0.15),
  rel,        SWITCH([@Relationship], "Repeat", 2, "New", 1, "Public tender", 0, 0),
  capacity,   IF([@EstimatorOpenBids] > 4, -2, 0),
  ROUND(MIN(10, MAX(0, clientRate*10 + typeRate*10 + rel + capacity)), 0))

Treat it as a prompt for discussion, not an automatic decision. A low score on a strategically important client might still be a "go". The value is that the decision becomes explicit, and you can check later whether low-score bids really were lost.

Lost Bid Analysis

  • Record the loss reason every time: price, scope, schedule, relationship, qualifications, unknown.

  • Where you learn the winning price, record it: =WinnerPrice/BidAmount − 1 shows how far off you were.

  • Review monthly: losses by reason and by estimator, and the average price gap on price-lost bids.

  • Consistent 3–5% gaps suggest pricing or overheads; random large gaps suggest scope misunderstanding.

Using AI on Bid Documents

Bid packages run to hundreds of pages. AI is useful for getting through them faster, not for pricing.

From these bid documents, list:
1. Bid due date and time, submission method, and pre-bid meeting.
2. Insurance limits, bonding and licensing requirements.
3. Liquidated damages, retention and payment terms.
4. Scope items for our trade, and anything ambiguous or excluded.
5. Unusual clauses we should raise as clarifications.
Quote section numbers for every item.

Asking for section numbers lets the estimator verify each point quickly. Use business AI tools for client documents; see using AI safely with company data.

From Won Bid to Job

When a bid is won, its estimate becomes the job budget. Copying the bid's cost breakdown into your job costing spreadsheet lets you compare estimate to actual on every job, which is how estimating improves. During the job, changes go into the change order log. For relationship tracking across clients and GCs, Excel CRM Lite pairs well with the bid log.

FAQ

Construction bid tracking FAQ

Logs, win rates and go/no-go decisions

Each bid's number, project name, client or general contractor, project type, location, estimator, invitation date, due date, bid amount, estimated cost and margin, status (invited, estimating, submitted, won, lost, declined), award date, winning bidder and price if known, and the reason for the outcome.

Divide bids won by bids submitted with a decision in the period, excluding bids still pending and bids you declined to price. Track win rate by count and by dollar value, and break it down by client, project type and estimator, because the overall figure hides most of the useful information.

Your own history answers this. Low win rates for certain clients, project types or sizes, combined with high estimating hours, show where effort is wasted. A simple go/no-go score based on past win rate, margin potential, relationship and capacity makes the decision consistent.

AI can summarise lengthy bid documents, extract key dates, insurance and bonding requirements and scope exclusions, and help draft clarifications and exclusions lists. It should not produce the price; quantities and rates come from your estimating process.

Excel works well for one office and a few estimators. When several estimators and project managers need to update bids at once, link bids to job costing after award, or report across years, a shared database or construction CRM avoids version conflicts.