Most contractors don't lose money on the big stuff. The big stuff gets a contract, a schedule, and a draw. They lose it on the small yeses: the upgraded tile, the extra lights, the "while you're here." Here's what that looks like on one job, followed all the way through.
One job, start to finish
Take a $150,000 kitchen remodel priced at a 10% margin. Before the first wall comes down, the job is set up to make $15,000 in profit. That's your starting number. Now watch what happens to it.
Change #1: the backsplash tile. Midway through the job, the homeowner asks to upgrade the backsplash tile. Your lead says sure. The better tile and the extra labor cost you $3,000. Nobody writes it down, so it never gets billed.
$15,000 − $3,000 = $12,000 left
Change #2: the lights. A few weeks later: "While you're here, can you add four more recessed lights?" Sure. That's $2,500 in fixtures and electrician time. Also never billed.
$12,000 − $2,500 = $9,500 left
Change #3: the wall. Near the end: "Can we move that wall two feet?" Sure. Another $2,000 in framing, drywall and labor. Never billed.
$9,500 − $2,000 = $7,500 left
Here's the whole job on one line:
Profit
Starting profit
$15,000
Tile upgrade (not billed)
−$3,000
Extra lights (not billed)
−$2,500
Moved wall (not billed)
−$2,000
Ending profit
$7,500
Half the profit on the job paid for work you gave away. Nobody made a bad decision. Every yes was reasonable in the moment. The only thing missing was the paperwork.
Why your P&L won't warn you
Every cost from those three changes lands in your books. The tile invoice gets paid. The electrician's hours hit payroll. The drywall shows up on the supplier statement.
But the other half of the entry never happens. No invoice went out, so there's no revenue to match those costs. Your P&L doesn't say "you forgot to bill $7,500." It just shows a job that came in thin, and if your books aren't tracking profit job by job, it doesn't even show you which job.
It gets worse if the plan was to "settle up at the end." By the final invoice, nobody remembers the details, and a homeowner is a lot less willing to pay for a wall they don't remember approving.
Why it keeps happening
The approval happens out loud. On site, in passing, often to whoever is closest.
The person who hears it isn't the person who bills it. Your lead knows about the change. The office doesn't.
Small amounts don't feel worth the paperwork. $2,000 doesn't seem like much on a $150,000 job, until there are three of them.
Nobody wants to nickel-and-dime a good client. This one is real. But pricing a change up front isn't nickel-and-diming, it's clarity. Clients get upset about surprises on the final invoice, not about a quick price before the work starts.
The fix: three habits
Nothing extra starts without approval in writing. It doesn't need to be a formal form. A text works: "Adding four recessed lights in the kitchen, $3,100. Reply YES to approve." The reply is your paper trail.
Price it before the crew touches it. Once the work is done, you're negotiating after the fact. Before, it's just a quote.
Get it to the office the same day. A photo of the text, a quick email, whatever your team will actually do. The goal is that it lands on the very next invoice, not the final one.
Now run the same job again with those three habits. Same tile, same lights, same wall. The $7,500 in costs gets billed back, plus your markup on each change. The job finishes at $15,000 in profit, plus the margin on the changes, and the homeowner saw every price before saying yes.
The monthly check that catches what slips
Even with good habits, something will get missed. So once a month, for every active job, put two lists side by side:
Every change order that was approved
Every change order that has actually been billed
The gap between those two lists is money you already earned and haven't asked for yet.
If you're in QuickBooks Online, two setup steps make this easy. First, add each change order to the invoice as its own line (a "Change Order" service item works well), so billed changes are easy to find. Second, tag every cost to its job using the Customer/Project field. Then the job's profit report shows you where a change was paid for but never billed.
Every yes should get paid for
Saying yes to your clients is part of doing good work. It just shouldn't cost you half your profit.
At Builder CFO, we match change orders to every invoice, every month, so the small yeses get billed and your job reports show what each project really made. Book a 15-minute call and we'll show you what that looks like in your books.

