All articles
How-to

How to track subcontractor bids in Excel (free template layout)

A bid tracking spreadsheet layout for general contractors: one row per invitation, sixteen columns, six status values, the filters you'll use daily, and a twenty-minute build guide.

Short answerOne row per invitation, a Status column limited to six values, one column per addendum, and a bid amount column. Keep it in one shared file and update the row before replying to any sub.

You don't need software to track who's bidding. You need one sheet, one row per invitation, and the discipline to update it daily. Here's a layout that works, where it breaks, and how to build it in twenty minutes.

The principle: one row per invitation

Not one row per company. Not one row per scope with bidders across. One row for each person you invited on each scope. If you invite the same electrical contact on electrical and on fire alarm, that's two rows. It feels like more work; it's less, because every filter and count falls out automatically.

The 16 columns

Bold ones can't be skipped.

ColumnContents
ProjectSame spelling every time; use a dropdown
ScopeCost code plus name, "26 00 00 Electrical," from a dropdown
CompanyExactly as on the trade list
ContactFirst and last name
EmailFor copying into a merge later
PhoneMobile, for bid day
SentDate the invitation went out
StatusDropdown, six values below
Status dateWhen it last changed
Follow-up 1Date sent, blank if not yet
Follow-up 2Date sent
Add 1 / Add 2 / Add 3Date sent, then "conf" on confirmation
Bid amountFilled on bid day
Notes"Wants a walkthrough." "Excludes ceilings." "Left message."

The 6 status values

Define them and use data validation so nobody types "probably."

  1. Not sent: row created, invitation not out. Useful for planning a scope.
  2. Sent: out, no reply.
  3. Bidding: they've said they will.
  4. Maybe: treat as a conversation, not a final answer.
  5. Not bidding: declined. Keep the row; you want to know they were asked.
  6. Bid received: number in. Fill Bid amount.

The 5 views you'll use every day

  1. Who hasn't responded on electrical? Filter Scope = Electrical, Status = Sent. That's the follow-up list.
  2. How many bids per scope? Pivot: rows = Scope, columns = Status, values = count. Check on day 8; under three Bidding on a major scope means act now.
  3. Who needs Addendum 2? Filter Status ≠ Not bidding, Add 2 = blank. Copy the Email column into the merge.
  4. Who said bidding and hasn't sent a number? Bid day morning: Status = Bidding, Bid amount = blank. Phone list.
  5. Response rate. (Bidding + Maybe + Not bidding + Bid received) ÷ (everything except Not sent), on a summary tab.

3 conditional formatting rules

  1. Status = Sent and Sent date more than 3 days ago: yellow. Follow up.
  2. Status = Sent and Sent date more than 8 days ago: orange. Phone.
  3. Status = Bidding, bid day, Bid amount blank: red.

More than that and the sheet becomes a Christmas tree nobody reads.

The daily habit

  1. Update the row before replying to any sub. Not after.
  2. Every morning, five minutes: filter to Sent, sort by date, handle yellow and orange.
  3. Bid day morning: the Bidding-without-a-number filter, then the phone.
  4. After bid day: copy final statuses to the trade list ("last invited," "last bid," notes on anyone who said Bidding and went silent).

Sharing it

One estimator, one sheet: fine. Two estimators: the sheet must live where both edit it live (Excel on SharePoint or OneDrive, or Google Sheets). Not emailed around, not copied to desktops. Two copies means the sheet is wrong, and a wrong tracking sheet is worse than none because you trust it.

Where it breaks

Three places, all the same problem: it depends on a human noticing and typing.

  1. It can't see who opened the invitation. Sent is all it knows. A sub who never received the email and a sub ignoring you look identical.
  2. Status only updates when someone updates it. A reply to the other estimator, a phone call, a word on site: if nobody types it, the sheet lies.
  3. Addenda are manual. Filter, copy, merge, then a column to fill as confirmations trickle in. On a busy day it gets done "later."

Those three are what invitation software automates. Invite All (our product) records delivered, clicked, viewed and the Bidding / Maybe / Not bidding click per contact, so the status column fills itself in and "who hasn't looked" has an answer. If the daily habit is slipping, it's the best upgrade path, and it imports the same one-row-per-person trade list. But a one- or two-estimator shop with the discipline to update before replying can run on this sheet for years.

Build the bid tracking spreadsheet in 20 minutes

  1. New workbook. Tab 1 "Tracking," tab 2 "Lists."
  2. On Lists, type the six status values in one column and your cost codes in another. Starter code list.
  3. On Tracking, type the sixteen headers. Freeze the top row.
  4. Data validation on Status and Scope, pointing at Lists.
  5. The three conditional formatting rules.
  6. Convert the range to a table so filters and the pivot are one click.
  7. Save it somewhere shared. Tell the other estimator where it is.

Read next

Sending invitations by hand?

Invite All sends a tracked invitation to every trade on a scope from your own inbox. Four quick taps to see if it fits your team.