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.
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.
| Column | Contents |
|---|---|
| Project | Same spelling every time; use a dropdown |
| Scope | Cost code plus name, "26 00 00 Electrical," from a dropdown |
| Company | Exactly as on the trade list |
| Contact | First and last name |
| For copying into a merge later | |
| Phone | Mobile, for bid day |
| Sent | Date the invitation went out |
| Status | Dropdown, six values below |
| Status date | When it last changed |
| Follow-up 1 | Date sent, blank if not yet |
| Follow-up 2 | Date sent |
| Add 1 / Add 2 / Add 3 | Date sent, then "conf" on confirmation |
| Bid amount | Filled 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."
- Not sent: row created, invitation not out. Useful for planning a scope.
- Sent: out, no reply.
- Bidding: they've said they will.
- Maybe: treat as a conversation, not a final answer.
- Not bidding: declined. Keep the row; you want to know they were asked.
- Bid received: number in. Fill Bid amount.
The 5 views you'll use every day
- Who hasn't responded on electrical? Filter Scope = Electrical, Status = Sent. That's the follow-up list.
- 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.
- Who needs Addendum 2? Filter Status ≠ Not bidding, Add 2 = blank. Copy the Email column into the merge.
- Who said bidding and hasn't sent a number? Bid day morning: Status = Bidding, Bid amount = blank. Phone list.
- Response rate. (Bidding + Maybe + Not bidding + Bid received) ÷ (everything except Not sent), on a summary tab.
3 conditional formatting rules
- Status = Sent and Sent date more than 3 days ago: yellow. Follow up.
- Status = Sent and Sent date more than 8 days ago: orange. Phone.
- Status = Bidding, bid day, Bid amount blank: red.
More than that and the sheet becomes a Christmas tree nobody reads.
The daily habit
- Update the row before replying to any sub. Not after.
- Every morning, five minutes: filter to Sent, sort by date, handle yellow and orange.
- Bid day morning: the Bidding-without-a-number filter, then the phone.
- 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.
- 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.
- 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.
- 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
- New workbook. Tab 1 "Tracking," tab 2 "Lists."
- On Lists, type the six status values in one column and your cost codes in another. Starter code list.
- On Tracking, type the sixteen headers. Freeze the top row.
- Data validation on Status and Scope, pointing at Lists.
- The three conditional formatting rules.
- Convert the range to a table so filters and the pivot are one click.
- Save it somewhere shared. Tell the other estimator where it is.