How to Track Subcontractor Costs and Margin on a Job
Treat every subcontractor as a vendor with a written scope and a purchase order, then let their bill land on the job as cost. Your own crew's hours come off punched time; the sub's number comes off the PO you agreed to before they started. Put both on the same job and margin stops being a guess. The failure mode is never the sub's price — it is a sub invoice that arrives three weeks after the customer was billed, for more than anyone remembered agreeing to. CRMb costs subs through the same purchasing and job-cost path it uses for materials, so the number is on the job before the invoice goes out.
Subs are how a small shop takes bigger work. They are also the single largest source of margin surprise, because sub cost is the one line on a job that someone outside your company controls.
Why sub costs blow up jobs
Materials have a price list. Labor has a rate. Subcontractor cost has a conversation, and conversations do not reconcile.
Four things go wrong, almost always in this order:
- The scope was verbal. "Rough in the second floor" meant one thing to you and another to them. The difference shows up as an extra on the invoice.
- There was no agreed number before the work. Once the work is done, you have lost every bit of leverage you had.
- The bill arrives after you invoiced the customer. The job looked profitable for a month, then quietly wasn't.
- Nobody attached the bill to a job. It got paid out of the operating account and disappeared into overhead, where it makes every job look better than it is.
None of these are pricing problems. They are sequencing problems.
Scope the sub before the number
A subcontractor scope is a scope of work written for someone who was not on the walkthrough. Three things make it enforceable:
What is included, in their trade's language. Fixtures set or fixtures supplied. Trim included or trim by others. The vague version always resolves in the direction that costs you money.
What they supply versus what you supply. If you are pulling material out of your own stock for the sub, that material is your cost, not theirs, and it needs to leave inventory against the job. Otherwise you double-count: once in the sub's price, once in the stock that silently vanished.
When it happens, and what it depends on. A sub who shows up to a site that is not ready bills for the trip, and you have no argument.
Write it once per trade and reuse it. Most shops need four or five of these, not forty.
Issue a purchase order, not a handshake
The purchase order is the moment the number becomes real. Everything downstream — the bill, the job cost, the margin — reads from it.
A sub PO carries the same four fields a materials PO does: the vendor, the job it belongs to, the agreed amount, and the scope reference. That is enough to answer the only two questions that matter later: what did we agree to, and did the invoice match?
Commit the cost the day you issue it, not the day you pay it. A PO you have issued is money already spent, whether or not the bill has arrived. A job with $6,000 of open sub POs and $0 of sub bills is not a job with no sub cost — it is a job with $6,000 of sub cost you have not been billed for yet. Reading committed cost instead of paid cost is what lets you catch a job going over budget while there is still time to react.
Change the PO when the scope changes. A sub extra that never becomes a revised PO or a change order to your customer is margin you gave away by accident.
Land the bill on the job
When the sub invoices, three checks take about ninety seconds and prevent nearly every dispute:
- Does the amount match the PO? If not, either the scope changed and the PO should have, or the invoice is wrong. Both are worth a phone call before it becomes a payable.
- Is it attached to the right job? A sub bill with no job on it is overhead by default, and overhead is where margin goes to hide.
- Are the compliance items current? Insurance certificate, license, W-9 on file. Chase these at onboarding, not when a claim happens.
Then it becomes a payable with terms, and flows into the same accounts payable rhythm as your suppliers. Paying subs on stated terms — not early, not late — is most of what makes a good sub answer your call in July.
Read the blended margin
A job with subs has two cost engines, and mixing them up is the usual reason the number feels wrong.
| Line | Amount |
|---|---|
| Contract revenue | $42,000 |
| Own crew labor (punched hours × loaded rate) | $9,400 |
| Materials at average cost | $7,100 |
| Subcontractor cost (3 POs) | $16,500 |
| Gross profit | $9,000 |
| Gross margin | 21.4% |
Two things this table makes obvious that a lump-sum job total never does.
Self-performed margin and sub margin are different businesses. On your own crew's work you earn the spread between the loaded rate and the billed rate. On sub work you earn a markup for carrying risk, warranty, scheduling, and payment float. Those are not the same number and should not be priced as if they were — see markup vs margin for the arithmetic people most often get backwards here.
Sub-heavy jobs need higher markup, not lower. The instinct is to shave the markup on sub work because "we're not doing anything." What you are doing is guaranteeing their work to your customer with your money. A sub who no-shows costs you the schedule, the callback, and the relationship. Price for that or stop taking sub-heavy work.
Decide what your markup is, once
Per-job negotiation with yourself is how markup erodes. Set a standing rule and stick to it:
- A flat percentage on sub cost, typically in the 10–20% range depending on how much coordination the trade needs. Simple, defensible, easy to quote.
- A management fee per sub trade, when the sub's number is large enough that a percentage looks absurd to the customer.
- Full loaded pricing, where the sub line is invisible and you quote the finished scope. Best margin, most risk, and it requires that you actually know your sub costs — which is the whole point of the PO.
Whichever you pick, keep it consistent across quotes. The good-better-best quote structure works fine with sub-heavy scopes as long as the markup rule does not move between options.
FAQ
Should I show subcontractor costs separately on the customer's invoice? Usually no. Line-iteming a sub's price invites the customer to hire them directly next time and turns your markup into a negotiation. Quote the finished scope. Time-and-materials contracts are the exception, because the contract itself requires cost transparency — see time and materials vs fixed price.
How much should I mark up subcontractor work? Enough to cover coordination, warranty exposure, and the float between paying them and getting paid. Ten to twenty percent is common; below ten you are working for free on someone else's labor. Markups on subs and on material do not have to match.
What if the sub bills more than the PO? Resolve it before it becomes a payable. Either the scope genuinely changed, in which case revise the PO and check whether it should have been a change order to your customer, or it did not, in which case the PO is the agreement you both signed. This is exactly why the PO exists.
Do subcontractor hours count in my labor cost? No. Sub cost is a purchased service, not labor, and blending it into your labor number destroys both. Your labor burden rate is about your employees. Keep the two lines separate on every job.
Should subs punch in on my time tracking? No. Subs are paid against a scope and an invoice, not by the hour on your clock. Punched time is for your own crew, and mixing subs into it corrupts your utilization and burden numbers.
How do I handle a sub who supplies their own materials? Their material is inside their PO number and never touches your inventory. Only material you pull from your own stock for them leaves your inventory and hits the job at average cost. Getting this wrong is the most common way sub-heavy jobs get double-counted.
What about retainage on subcontractors? If your customer holds retainage on you, hold matching retainage on your subs. Holding nothing while having 10% held on you means financing the job out of your own pocket — see how retainage works.
Getting started with CRMb
Sub tracking fails for a mechanical reason: the agreed number lives in a text thread and the invoice lands in an inbox, with no job in between. CRMb closes that gap with the pieces it already uses for materials.
Keep each subcontractor as a supplier record. Issue a purchase order against the job for the agreed scope and amount, so the commitment is on the job the day you make it rather than the day the bill arrives. When the invoice comes in, match it to the PO and let it sit as a payable with real terms. Your own crew's hours flow in from Punch as punched labor cost, and any stock you pulled for the sub costs out at average cost. Reports then show the job's margin with all three cost engines on one page — punched hours, materials, and sub spend — instead of a healthy-looking invoice and a bill you find in October.
Start a 14-day free trial at crmb.io and put a purchase order on your next sub before they start. The first job you close without a surprise invoice pays for the habit.