The problem
Here is a pattern that runs through contractor books everywhere. A job is bid at $38,000. It finishes at $44,500 because the customer added work along the way. The owner looks at the profit and loss statement, sees a good month, and moves on. What the books never show is that the original scope earned a healthy margin and the three change orders were performed at close to break-even, because the labor and material that went into them were never tied back to the job.
This is not a QuickBooks limitation. QuickBooks Online can track this properly. It happens because change orders arrive in the least convenient way possible — verbally, on a Tuesday, from a customer standing in their own kitchen — and the paperwork catches up later, if at all.
The short version: a change order is not an adjustment to an existing line. It is additional scope with its own revenue and its own costs, and it needs to be visible as such inside the job it belongs to.
Before you touch QuickBooks
Bookkeeping cannot fix a documentation problem. If the change is verbal, the amount is disputed at the end of the job and you either eat it or spend a week arguing about it. A change order does not need to be a legal document. It needs four things: what changed, what it costs, what it does to the schedule, and the customer's written approval. A text message reply saying "yes, go ahead, $2,400" is written approval.
Two practical habits that make the accounting side work:
The setup
Three things have to be true in your QuickBooks Online file before change orders can be costed at all. If any of these are missing, everything below produces categorized transactions rather than job costing.
QuickBooks Online Plus and Advanced include Projects, which is the cleaner option. It gives you a single view per job showing income, costs, and margin. On lower plans, the sub-customer approach works: the customer is the parent, each job is a sub-customer with "bill with parent" set.
This is the step most files miss. If everything you buy is coded straight to an expense account, you can see that you spent money but not what kind of cost it was. A working trades setup has a small set of service and non-inventory items mapped to income and cost accounts — labor, materials, subcontractor, equipment, permits — and every job transaction uses one.
Job costs and general and administrative costs are different animals. Truck fuel driving to a job is a job cost. Office rent is not. Permit fees are job costs, not overhead — a point we make on our Charleston bookkeeping page, because tri-county permitting means Lowcountry contractors pay a lot of them and they distort margin badly when lumped into general expenses.
The workflow
Do not overwrite the original estimate. Either add clearly labeled lines to it ("CO-2: relocate condenser pad") or create a second estimate against the same project. Both work. What matters is that the original bid stays intact and readable, because the comparison between what you bid and what you actually built is the single most useful number a contractor can have.
This is where change orders leak. The supply house invoice for the change order material arrives with everything else and gets coded to Materials with no customer or project attached. It is now invisible to the job.
Every expense, bill, check, and card transaction that belongs to the job needs the project selected and, where it applies, the billable box checked. On bills from subcontractors, the same rule applies, and the sub's invoice should reference the change order number.
Creating the invoice from the estimate keeps the link between what was quoted and what was billed. Invoicing from scratch breaks it, and the progress-invoicing view stops being reliable.
Not after. The value of job costing is that it can change a decision while the decision is still open. If change orders on a job are running at a materially thinner margin than the base scope, that is worth knowing before you price the next three the same way.
| Common mistake | What it does to your numbers |
|---|---|
| Change order revenue booked, costs untagged | Job margin looks better than it is. You keep bidding change orders too cheaply because the data says they are profitable. |
| Change order billed as a separate invoice with no project | Revenue floats free of the job. Project profitability is understated and the customer's total job value is wrong. |
| Original estimate overwritten | You lose the bid-versus-actual comparison permanently. There is no way to reconstruct it later. |
| Deposit for the change order booked to income | Revenue recognized before it is earned. The month looks strong and the tax position is wrong. |
The one that costs real money
When a customer pays up front for added scope, that money is not yours yet. It belongs on the balance sheet as a customer deposit until the work is performed. Booked to income on the day it arrives, it inflates a month you have not earned, and it can create a tax bill on money you might still have to return if the change is canceled.
In QuickBooks Online this means receiving the payment against a liability account rather than recognizing revenue, then moving it to income as the work is completed. It is a two-minute habit that prevents a category of problem that is genuinely painful to unwind a year later.
Trade by trade
Send us your QuickBooks Online file and we will tell you exactly what is wrong with it — free, in plain English, with no call required.
Get your free books review →