QuickBooks will report whatever reached it. It does not know that a disposal invoice belongs to a job that closed in March, that half a labor ticket was dump fees, or that returned material was credited to the account instead of the job. Those are the four ways a job cost goes wrong, and none of them is a setting.
Written by JD Davenport, who still sells for a living. Updated 4 November 2026.
The mechanics are the easy half and they are well documented by the people who make the software. Customers and jobs, items, billable expenses, and a profit and loss by job report. An afternoon of setup.
It decides the arithmetic. Once a cost is coded to a job, the report is correct, instantly, every time.
It does not decide coding. Which job a cost belongs to is a human decision made in a hurry, usually by somebody reading a supplier invoice two weeks after the crew left.
It does not decide timing. A cost that arrives in May lands in May unless somebody puts it back. Look at March in April and March looks profitable.
It does not decide completeness. A cost nobody entered is a cost the report does not know about, and the report will look exactly as confident without it.
Cost lands late. The job closed in March, the disposal invoice arrives in May. Your per-job margin was wrong for two months and nothing flagged it.
Cost lands in the wrong column. A labor invoice with dump fees on it goes entirely to labor. Labor looks high, disposal looks free, and next year you price both wrong off your own history.
Cost lands on the wrong job. Two jobs on the same street, one purchase order, one crew. The material goes to whichever job number got typed. One job carries a loss it did not earn, the other shows a margin it did not make, and the two errors do not cancel because you will make decisions about both.
Credit never lands. Returned material is credited to the supplier account rather than to the job. The account balance is right. The job is still carrying material that came back on the truck.
Do the standard setup, then add the two things it does not give you.
One row per payment, not per invoice batch. Leaf level. A summary line that agrees with itself tells you nothing about whether it agrees with reality. If you cannot see the line items you cannot test them.
A column for whether a document was ever checked. Missing paperwork is not fraud. Plenty of subcontractors invoice by text message. But a payment nobody has verified has to look different from one somebody verified and passed, or your clean rows and your untested rows are indistinguishable and the whole register is worth nothing.
Reconciliation is not reading every invoice. It is running a small fixed set of tests against every row so the exceptions surface by themselves.
Does the payment carry a reference. Does that reference exist. Does the payee have an agreed rate. Does the amount match it. Is it coded to a job that was open on that date. Was the same amount paid twice. Did a credit ever arrive for material that went back.
Each one is a pass or fail column, not a task on somebody's list. Run them on every row, not just the odd-looking ones, because the odd-looking ones are the ones you already know about. The expensive rows look normal.
Both work and neither fixes the four failures above. Keep the accounting in the accounting system. Do the testing wherever you can see every row at once and sort it, which for most one-truck and ten-truck businesses is a spreadsheet.
The thing that decides whether your job costing is any good is not the tool. It is whether every dollar that left the business can be attached to a job, a date and a document inside the period you close.
The twelve tests, the register, the workbook and a browser tool that runs the mechanical half in about a minute are The Job Cost Standard. The free version of the calculator is on the free tools page. More answers on the questions page.