Subcontractor Backcharge Tracking Spreadsheet in Excel: Stop Writing Them Off
A general contractor in Charlotte closes out a $4.2 million medical office fit-out and hands accounting a package with $71,400 of backcharges logged against fourteen subcontractors. Four months later the ledger shows $24,900 actually deducted. The other $46,500 got argued down, traded away for lien waivers, or quietly written off because nobody could produce a dated notice. The job carried a 4.2 percent net margin, $176,400 of profit, so that write-off is one dollar in four. A subcontractor backcharge tracking spreadsheet built in Excel is not a grievance list. It is the document that decides which of those charges survives contact with the sub's attorney, and the columns that do the deciding are the ones almost nobody builds.
Backcharges are unusual among construction costs because the money is already in your hands. You are not invoicing for it, you are declining to release it. That makes them the cheapest dollars on the job to collect and, for exactly that reason, the ones people are laziest about. The laziness has a price and it shows up in one number: how much of what you logged you actually kept.
Backcharges do not get denied, they get run out the clock
Almost no subcontractor writes back and says they refuse to pay. What happens is nothing. Six weeks of nothing, then a phone call at closeout when the project manager who watched the debris pile grow has moved to another job and the superintendent who took the photos is on a different site. Meanwhile you need a final lien waiver and a signed warranty to close the owner out. The sub knows you need it more than you need the $8,400. That conversation takes nine minutes and ends around $3,000.
Three specific failures produce that outcome, and all three are things a spreadsheet column can prevent.
The notice window closed before anyone opened a file
Nearly every subcontract has a cure and self-help clause, and it reads roughly the same everywhere. The contractor gives written notice of the deficiency, the subcontractor has some number of hours to cure it, and if they fail to cure, the contractor may perform the work and deduct the cost from amounts due. That clause is the entire legal basis for the deduction. Miss the notice and you did not exercise a contract right, you volunteered free labor and then asked to be reimbursed for it.
On the Charlotte job, the average gap between the day a backcharge cost was incurred and the day it first appeared in writing anywhere was nineteen days. Eleven of the fourteen subcontracts required written notice within seventy-two hours. The costs were real, the photos existed, and most of the charges were dead on arrival before anyone opened the spreadsheet.
Your own timecards do not say who caused the cost
The most common backcharge in commercial work is cleanup and self-performed patching. Your laborers do it. The timecard says "general conditions, final clean, 12 hrs." That entry proves you spent money. It proves nothing at all about who owed it, and a sub's counsel will make that point in one sentence.
A collectible timecard carries the backcharge number and the deficiency at the moment of entry: "BC-014, Metro Drywall, remove debris and scrap board, level 2 north, 2 men, 6 hrs." Reconstructing that at closeout from memory and a photo folder is exactly the exercise the other side is hoping you attempt. Assign the number the same day or accept that the hours are a gift.
You find the charge after you have paid the sub down to nothing
Self-help works only while you are still holding their money. Say you trace $12,300 of damaged terrazzo to the mechanical sub. By the time it is documented, that sub is billed to 98 percent complete and you hold $9,850 of retainage. Deducting the full $12,300 is not a deduction anymore, it is a demand that they write you a check, and they will not write it. A backcharge that exceeds the sub's remaining contract balance is a lawsuit wearing a deduction's clothes, and it needs to be priced that way on the day you log it, not discovered in February.
Build the log around the notice clock, not the dollar amount
Most backcharge logs sort by amount, because the big numbers feel like the important ones. Sort by the notice clock instead. A $900 charge with eleven hours left on its cure window is worth more attention today than an $8,400 charge whose window closed in June.
Set the log up on a sheet named Backcharges, headers on row 3, data starting row 4. These are the columns that earn their place, shown with one live example.
| Col | Field | BC-014 example |
|---|---|---|
| A | Backcharge ID | BC-014 |
| B | Date incurred | 2026-03-09 |
| C | Subcontractor | Metro Drywall |
| D | Cost code charged | 09-250 |
| E | Category | Cleanup, self-performed |
| F | Description and evidence | Scrap board and debris, level 2 north. Photos 3/9, daily report 3/9 |
| G | Contract clause | Subcontract 09-01, art. 8.3 |
| H | Notice required (days) | 3 |
| I | Notice deadline | =B4+H4 → 2026-03-12 |
| J | Notice sent | 2026-03-10 |
| K | Notice status | TIMELY |
| L | Direct cost | $1,258.00 |
| M | Markup per contract | 10% |
| N | Total charged | =L4*(1+M4) → $1,383.80 |
| O | Status | Deducted |
| P | Pay app deducted on | PA-11 |
| Q | Amount deducted | $1,383.80 |
| R | Balance open | =N4-Q4 → $0.00 |
Column H is per subcontract, not a constant. Copying one number down the column is the mistake that makes the whole log look authoritative while being wrong for a third of the rows. Pull the cure period out of each executed subcontract once, at buyout, and keep it on the sub roster so column H can look it up with =VLOOKUP($C4,SubRoster!$A:$D,4,FALSE).
The one formula that runs your Monday
Column K turns a date into an instruction:
=IF(J4="",IF(TODAY()>I4,"BLOWN","OPEN "&I4-TODAY()&"d"),IF(J4<=I4,"TIMELY","LATE"))
If no notice has gone out and the deadline has passed, the charge reads BLOWN and you now know it is worth pennies. If no notice has gone out and time remains, it counts down. If notice went out, it grades itself against the deadline. Filter column K for anything starting with OPEN, sort ascending, and that short list is the entire backcharge to-do list for the week. Nothing else on the sheet needs a human today.
For the superintendent's view, one column is enough: =IF(AND($J4="",TODAY()>=$I4-1),"SEND TODAY",""). That is a text message, not a report.
Charge the cost you can prove and the markup your contract names
Backcharge markup is where contractors trade a large certain recovery for a small speculative one. If the subcontract states a percentage, use that percentage. If it says only "actual cost plus reasonable overhead," a self-selected 15 percent invites the sub's counsel to attack the arithmetic instead of the facts, and you spend your credibility defending $189 while the $1,258 of real cost sits unpaid.
| BC-014 build-up | Basis | Amount |
|---|---|---|
| GC labor | 2 men × 6 hrs × $47.50 loaded | $570.00 |
| Dumpster | 1 of 3 pulls that week, allocated | $415.00 |
| Scissor lift | 1 day at internal rate | $185.00 |
| Replacement board | 4 sheets 5/8 type X | $88.00 |
| Direct cost (L4) | $1,258.00 | |
| Markup (M4) | Subcontract art. 8.3, 10% | $125.80 |
| Total charged (N4) | =L4*(1+M4) | $1,383.80 |
Do not round that to $1,400. An unrounded number reads as a cost record pulled from a system. A rounded number reads as an estimate, and estimates get negotiated. The dumpster allocation matters for the same reason: charging the full $1,245 pull when the sub caused a third of it is the single detail that lets someone reframe the entire log as padded.
Coverage ratio, the column that tells you whether you can still self-help
Here is the column nobody builds. A backcharge is only collectible by deduction up to the money you still owe that sub. Everything above that line is a claim you have to go get. So the log needs a second sheet, one row per subcontract, that compares exposure to what you are still holding.
| Subcontractor | Contract with COs (B) | Paid to date (D) | Remaining balance (F) | Open exposure (G) | Coverage (H) | Action (I) |
|---|---|---|---|---|---|---|
| Metro Drywall | $384,000 | $307,200 | $76,800 | $9,420 | 8.15 | RELEASE |
| Carolina Glass | $228,500 | $171,375 | $57,125 | $2,140 | 26.70 | RELEASE |
| Apex Mechanical | $612,000 | $594,600 | $17,400 | $21,750 | 0.80 | HOLD PAY APP |
| Piedmont Electric | $455,000 | $443,900 | $11,100 | $14,830 | 0.75 | HOLD PAY APP |
The three formulas behind it:
- F4, remaining balance:
=B4-D4. Contract value including approved change orders, less everything paid. Retainage you are still holding lives inside this number, which is the point. - G4, open exposure:
=SUMIFS(Backcharges!$N:$N,Backcharges!$C:$C,$A4,Backcharges!$O:$O,"<>Deducted",Backcharges!$O:$O,"<>Written off"). Everything charged to that sub that has not yet been collected or abandoned. - H4 and I4, the decision:
=IF(G4=0,"",F4/G4)and=IF(G4=0,"",IF(H4<1.5,"HOLD PAY APP","RELEASE")).
Apex and Piedmont are already past the point where a deduction settles anything. Neither of those situations was created by a bad backcharge, they were created by pay applications approved by someone who had never seen the backcharge log. The threshold sits at 1.5 rather than 1.0 on purpose, because coverage of exactly 1.0 leaves you no room for the next incident on a sub who has now demonstrated a pattern.
This sheet is worthless at closeout and decisive on the fifteenth of the month. Run it as a step in pay application approval, before the check goes out, while the leverage still exists.
Close the loop on the pay application
Status in column O moves through a fixed path: Open, Noticed, Cured, Accepted, Disputed, Deducted, Written off. Only two of those are endings. Cured means the sub fixed it and the charge closes at zero, which is the outcome the notice was actually trying to produce.
A row marked Deducted with a blank column P is not a deduction, it is an intention. Every closed row carries the pay application number and the dollar amount that appeared on it, and the two sides have to tie:
=SUMIFS($Q:$Q,$P:$P,"PA-11")
That total must equal the deduction line on pay application 11 to the cent. When it does not, your accounting and the sub's accounting disagree by exactly the amount you are about to lose in the closeout negotiation, and you found it four months early.
Stop crediting backcharges at 100 percent in your cost forecast
This is the part that reaches the controller and the surety. In most job cost systems, a backcharge posts as a credit to the cost code at full value on the day it is logged. Log $71,400 and the forecast immediately shows $71,400 of cost relief, which flows into projected margin, which flows into the work in progress schedule, over and under billings, and whatever your bonding agent reads in the spring.
The Charlotte job collected 35 percent. Split by notice status, the only variable that predicted anything:
| Notice status | Charged | Collected | Rate |
|---|---|---|---|
| TIMELY | $28,600 | $23,450 | 82% |
| LATE | $19,100 | $1,450 | 8% |
| BLOWN | $23,700 | $0 | 0% |
| Total | $71,400 | $24,900 | 35% |
So the number that belongs in the forecast is not the gross. It is this:
=SUMIFS($N:$N,$K:$K,"TIMELY")*0.82+SUMIFS($N:$N,$K:$K,"LATE")*0.08
Rows reading BLOWN contribute nothing, which is accurate and which is also the only report that makes anyone care about the notice clock. On this job the defensible credit was roughly $25,000, so a forecast carrying $71,400 overstated the result by $46,500 for eleven months. It was discovered on the final pay application, when there were no months left to recover it in.
After two or three closed jobs, stop using 0.82 and 0.08 and use your own history: =SUMIFS(History!$Q:$Q,History!$K:$K,"TIMELY")/SUMIFS(History!$N:$N,History!$K:$K,"TIMELY"). Every company's number is different, and the gap between yours and the industry anecdote is worth knowing before you argue with a sub about $3,000.
That table also prices the discipline. The spread between timely and late is 74 points. On BC-014, sending the notice inside seventy-two hours was worth about $1,024 on a $1,383.80 charge. The superintendent's two minute email is the best paid two minutes on the project, and until somebody puts that number in front of them, it will keep not happening.
Run it for one quarter, then negotiate from a different position
Five steps, in order, and the first one takes an afternoon:
- Pull your last closed job. List every backcharge you intended and what you actually deducted. That percentage is your baseline and it will be lower than you expect.
- Extract the notice requirement from every active subcontract into column H at buyout. Different subs, different clocks, and a single copied value is worse than no column.
- Change the timecard rule today. Any hour spent fixing or cleaning up after a sub gets a BC number at entry, same shift, not at closeout.
- Put the coverage flag into pay application approval. HOLD PAY APP has to fire while you still hold the balance, not after.
- Forecast at your collection rate by notice status. Report the number you can defend, not the number you logged.
The recovery on the Charlotte job was not going to be 100 percent under any system. Backcharges get cured, some get compromised for good commercial reasons, and a few were wrong. But 82 percent on the timely ones is a real rate that came out of a real job, and the difference between 35 percent and something near 70 on that $71,400 is $25,000 of margin that already exists and is sitting in your bank account waiting to be given away.
The reason standalone backcharge logs die in month four is that they need data they do not own. Coverage ratio needs subcontract values with approved change orders, paid to date, and retainage held. The pay application tie-out needs the deduction lines. The forecast credit needs the cost codes. Keep the log in a separate file and someone maintains those four things twice, which means they maintain them once and the log goes stale. The SheetCraft Construction Budget Tracker already carries the subcontract values, change orders, billed and paid to date, retainage, and cost code structure, which are columns B through E of the coverage sheet and the tie-out for column P. Add the backcharge log as one more tab against data you are already keeping, and the coverage flag, the pay application reconciliation, and the expected recovery credit populate themselves from the sheet you open every month anyway.
Related template
Construction Budget Tracker
Track every line item, change order, and payment across your entire project. Spot a $23K billing discrepancy before it hits your bottom line — not after.
Get the Template — $49