How to build a subcontractor database in one week
A step-by-step plan for turning scattered spreadsheets and Outlook contacts into one clean subcontractor database, with the columns to use and the habits that keep it accurate.
Ask a general contractor where the subcontractor database lives and the usual answers are "in Excel," "in Outlook contacts," or "mostly in one estimator's head." Often all three, with different subs in each. Every downstream task in preconstruction depends on that list: who gets invited, how fast, whether the addendum reaches them, whether you can bid a new region at all.
Here's how to rebuild it in a week, and how to keep it from rotting afterwards.
Step 1: decide that a row is a person
This is the decision that shapes everything else, and it's the one most lists get wrong.
Companies don't read email; people do. If the estimator at a sub leaves and someone else takes over, your invitation needs to go to the new person. A company-level list forces you to store one address per company, which is usually a generic inbox nobody checks.
So: one row per contact. Each row carries the company, so you can still see everything about a firm in one place, but the unit you invite is a human being.
Step 2: set up the columns
Resist building a CRM. Twenty columns is about the limit anyone will maintain.
About the person
- First name, last name
- Email (the one they actually read)
- Mobile
- Role (estimator, owner, PM)
- Active? (yes / no / left the company)
About the company
- Company name, exactly as on their letterhead
- Office address and city
- Regions they will travel to
- Trades, as cost codes
- Union / open shop, if that matters in your market
- Bonding capacity, if you track it
- Prequalified? and the date
About your relationship
- Last invited
- Last bid
- Last awarded
- Notes: free text. "Great on tenant improvements, won't touch high-rise." "Slow to reply, phone him."
Step 3: use cost codes for trades, not words
If your trade column contains "Electrical," "electrical," "Elec," "Electric" and "Electrical & Fire Alarm," you can't filter it. Pick CSI MasterFormat codes and stick to them: 26 00 00 for electrical, 23 00 00 for HVAC, 09 29 00 for gypsum board. Division level is fine for most trades; go to section level only where you invite different companies (drywall vs. acoustic ceilings within Division 09, for example).
A company can carry several codes. Store them so you can filter: a comma-separated codes column in a spreadsheet, or a multi-select field in a directory tool. Full walkthrough with a starter code list.
Step 4: tag regions by where they'll actually go
Where a sub is based and where they'll work are different. Set up five to ten regions that match how you bid ("Winnipeg," "Brandon," "Northwestern Ontario," "Out of province") and tag each company with every region they've told you they serve. Ask them; a one-line email gets answered most of the time.
Step 5: rebuild the subcontractor database, day by day
Day 1: gather. Pull every source into one folder: the main spreadsheet and every copy on people's desktops, Outlook contacts exported from each estimator, the address book from any bidding platform, bid tabs from the last two years (they show who actually bid), and the business cards in the drawer.
Day 2: merge and dedupe. Everything into one sheet with the columns above. Dedupe on email first (exact match), then on last name plus company (near match). Standardise company spellings. Expect to lose 30 to 40 percent of rows; that's normal.
Day 3: code the trades. Go down the list with the estimator who knows the trades best. Use a dropdown or lookup of your standard codes so nobody types them freehand.
Day 4: mark active and inactive. Anyone not invited or heard from in three years goes inactive. Don't delete; you may want to know you once worked with them. Anyone whose email bounced in the last year: inactive, with a note to find a current contact.
Day 5: fill gaps. You'll now see companies with no named contact and contacts with no mobile. Split the list among the team; ten minutes of calls a day clears it in two weeks.
Step 6: keep it alive
Contact data goes stale fast; around 20 percent a year is a commonly cited figure for B2B lists. Three habits keep yours current:
- Every bounce gets fixed the same day. Find the new contact or mark them inactive.
- Every bid round updates "last invited" and "last bid." Five minutes after bid day if your tool doesn't do it automatically.
- Every award adds a note. "Awarded Riverview, Oct 2026, 4% under next bid." A year later that note is worth more than any prequal form.
Step 7: put it somewhere shared
A spreadsheet works for one estimator. It stops working the moment there are two, because there are now two versions. The minimum is one file in a shared location that everyone edits live. The step up is any shared, filterable directory: a database, a CRM bent to the purpose, or a bidding tool with a directory built in.
Invite All (our product) has a directory built exactly this way (one row per person, cost codes, regions, invitation history per contact), imports the spreadsheet you just cleaned, and is the best next step once the cleaning is done. But the cleaning is the part that matters, and you can do it with nothing but a week and a coffee.
Quick checklist
- One row per person
- About twenty columns
- Trades as cost codes, from a fixed list
- Regions the company will travel to
- Merge, dedupe on email, code, mark inactive, fill gaps
- Fix bounces same day; update history after every bid
- One copy, shared, everyone edits the same one