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 you get one of three answers: "in Excel," "in Outlook contacts," or "mostly in one estimator's head." Usually it's all three at once, 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. So it's worth a week.
Here's how to rebuild it in one, and how to stop it rotting afterwards.
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. When the estimator at a sub leaves and someone else takes over, your invitation needs to go to the new person, not to a generic inbox that the departed estimator used to check. A company-level list forces you to store one address per company, and that address is almost always "estimating@" or "info@," which is to say nobody's.
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.
Set up the columns
Resist the urge to build a CRM. Twenty columns is roughly the limit of what anyone will actually maintain, and the list only has value if it's maintained.
About the person: first name, last name, the email they actually read, mobile, role (estimator, owner, PM), and whether they're active. Active, inactive, or left the company.
About the company: company name exactly as it appears on their letterhead, office address and city, the regions they'll travel to, trades as cost codes, union or open shop if that matters in your market, bonding capacity if you track it, and prequalified status with a date.
About your relationship: last invited, last bid, last awarded, and a free-text notes column. "Great on tenant improvements, won't touch high-rise." "Slow to reply, phone him." That notes column ends up being the most valuable thing on the sheet.
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, and a list you can't filter isn't a database. 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 for different sections, drywall versus acoustic ceilings inside Division 09 being the usual example.
A company can carry several codes. Store them in a way you can filter on: a comma-separated codes column in a spreadsheet, or a multi-select field in a directory tool. There's a full walkthrough with a starter code list if you want it.
Tag regions by where they'll actually go
Where a sub is based and where they'll work are two different facts. 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. And do ask them; a one-line email gets answered most of the time, and it's a good excuse to check the contact is still current.
The rebuild, day by day
Day one is gathering. Pull every source into one folder: the main spreadsheet and every copy of it on people's desktops, Outlook contacts exported from each estimator, the address book from any bidding platform you've used, bid tabs from the last two years (they tell you who actually bid, which is better information than any list), and the business cards in the drawer. Yes, those too.
Day two is merging and deduping. Everything into one sheet with the columns above. Dedupe on email first, exact match, then on last name plus company for the near matches. Standardise company spellings while you're in there. You'll lose 30 to 40 percent of rows. That's normal, and it's the point.
Day three is coding the trades. Go down the list with whichever estimator knows the trades best. Use a dropdown or lookup of your standard codes so nobody can type them freehand.
Day four is marking active and inactive. Anyone not invited or heard from in three years goes inactive. Don't delete them; you may want to know you once worked with a firm. Anyone whose email bounced in the last year: inactive, with a note to find a current contact.
Day five is filling gaps. By now you can see the companies with no named contact and the contacts with no mobile number. Split the list among the team. Ten minutes of calls a day clears it in a couple of weeks.
Keep it alive
Contact data goes stale faster than people expect. Around 20 percent a year is the commonly cited figure for B2B lists, and there's no reason to think construction does better. Three habits keep yours current.
Every bounce gets fixed the same day. Find the new contact or mark the old one inactive. Every bid round updates "last invited" and "last bid," which takes five minutes after bid day if your tool doesn't do it for you. And 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.
Put it somewhere shared
A spreadsheet works for one estimator. It stops working the moment there are two, because there are now two versions and nobody knows which is right. The minimum is one file in a shared location that everyone edits live. The step up from there is any shared, filterable directory: a database, a CRM bent to the purpose, or a bidding tool with a directory built in.
Invite All has a directory built exactly this way, one row per person, cost codes, regions, invitation history per contact, and it imports the spreadsheet you just cleaned. We think it's the natural next step once the cleaning is done. But the cleaning is the part that matters, and you can do all of it with a week and a lot of coffee.
The short form: 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 the same day and update history after every bid. One copy, shared, everyone edits the same one.