Bookkeeping for contractors in QuickBooks
How does bookkeeping for contractors work in QuickBooks?
Contractor books break down when every job posts to one shared income and expense account instead of separate job-costing entries, so a profitable job and one running at a loss look identical on the P&L. A clean setup tracks income, materials, labor, and subcontractor costs against each of the 3 or more open jobs separately, every week.
Common for contractors
- Every job shows roughly the same profit margin because materials, labor, and subs all post to one general Cost of Goods Sold account instead of being tracked job by job
- Retainage held back by the general contractor still sits on the books as an ordinary unpaid invoice instead of a separate receivable that won't collect for months
- 1099s go out in January with missing or expired W-9s because nobody collected one before the first check went out to a new sub
- A deposit for a job that hasn't started yet gets booked as income, inflating the month's revenue before any work has actually happened
- A truck or a piece of equipment bought outright hits the P&L as a lump-sum expense the month it's purchased instead of being depreciated over its useful life
In detail
Why contractor books are harder than most small businesses
A service business with one revenue stream can get by with a single income account. A contractor runs several jobs at once, each with its own materials, labor, subcontractor costs, change orders and payment schedule. None of that detail survives if transactions post to one shared income and Cost of Goods Sold account instead of being tagged to the job that generated them. Without job-level tracking, the profit and loss statement shows a single number for the whole company and nothing about which job actually earned it.
Job costing turns every job into a guess without it
QuickBooks Online’s job costing (built on sub-customers, one per job, under each general contractor or property customer) is what makes it possible to see cost against revenue for a single job instead of the business as a whole. Every material purchase, every labor hour, every subcontractor invoice needs to be assigned to a job at the time it’s entered. A receipt from the supply house categorized to “Materials” with no job attached is a cost that will never show up against the job it belongs to, and a business running that way can’t tell a job that cleared 30% margin from one that lost money until the whole year is behind it.
Progress billing and retainage complicate revenue recognition
A contractor billing in draws against a schedule of values needs each invoice tied to the percentage of the job actually completed, not just billed as convenient. Billing ahead of the work overstates revenue for the month, and billing behind understates it. Retainage, the 5–10% a general contractor withholds until the job is signed off, is not a bad debt and it is not ordinary accounts receivable; it needs its own account so it stops aging like a normal unpaid invoice and instead reflects that it won’t collect until close-out, sometimes months after the rest of the job is paid.
1099 subcontractors are a compliance problem, not just a bookkeeping one
Every subcontractor paid over the federal threshold in a year needs a W-9 on file before the first check goes out, not scrambled for in January. QuickBooks Online can track vendor 1099 eligibility automatically, but only if each subcontractor is set up as a 1099 vendor from the start and every payment to them is coded to a 1099-tracked account. A sub paid partly through the vendor list and partly through a personal Zelle or Venmo transfer that never gets entered will be missing from the 1099 QuickBooks generates, and that gap is the business’s liability, not the sub’s.
Deposits and draws aren’t income the day they land
A deposit collected before a job starts, or a draw pulled against a job that’s only partly done, is not fully earned revenue the day it hits the bank. It’s a liability for work still owed until it’s actually performed. Recording it straight to income the day it deposits overstates that month’s revenue and understates it in whichever month the work actually happens, which is exactly the pattern that makes a contractor’s monthly P&L bounce around without any real change in how the business is doing.
Equipment purchases: expense it or capitalize it, and it matters
A hand tool or a load of consumable supplies is an ordinary expense. A truck, a skid steer, or a piece of equipment with a useful life of more than a year is a fixed asset that belongs on the balance sheet and gets depreciated over that life. Expensing it in full the month it’s bought, which is sometimes appropriate under Section 179 but is a decision, not a default, can swing a single month’s P&L to a loss that has nothing to do with how the business actually performed that month.
Materials on a personal card and unfinished work-in-progress
A crew lead covering a lumber run on a personal card is common and, if the receipt never makes it into QuickBooks as a reimbursable job cost, that job’s true cost comes in understated by exactly what was spent, which also means the job’s real margin is worse than the books show. The same gap shows up at any point-in-time: a work-in-progress schedule comparing costs incurred against percentage complete is the only way to see whether jobs are on track before they close, and it only works if every cost, personal card or not, has actually been entered against its job.
What contractor cleanup and monthly close actually cover
Fixing a contractor file usually means going back through bank and card transactions job by job, assigning materials, labor and subcontractor costs to the jobs they belong to. That’s a cleanup engagement, scoped to the number of months affected.
$199 per month of backlogOnce job costing is set up correctly, a monthly close keeps every job, draw, and subcontractor payment coded correctly as it happens, closed by the 5th business day. Full pricing for both is on the pricing page.
Updated August 12, 2026 · Omkar Moraye