PurchasomaticJob costing tells you which jobs made money. But that’s only true if the numbers feeding it are right — and for most trades businesses, the vendor-bill side never quite is.
By Heather Dillon, former HVAC office manager · Founder of Purchasomatic
I ran accounts payable for an HVAC and mechanical contractor for years. We turned on job costing in QuickBooks early on, because the owner wanted to know which jobs were actually profitable. The reports looked complete. They were also wrong, constantly — not because job costing itself was broken, but because half the vendor bills that fed into it had been coded to the wrong job, or no job at all, by whoever was rushing to get invoices entered before end of day.
That’s the part almost nobody talks about when they explain job costing. Setting it up is the easy half. Keeping the data underneath it honest is the part that actually determines whether you can trust the report — and it applies whether you’re HVAC, plumbing, electrical, roofing, or general contracting.
Job costing is just tracking income and expenses per job instead of just per company. QuickBooks Online gives you two ways to structure that:
Neither one requires QuickBooks Desktop or a third-party app to turn on. Both are sitting in your QuickBooks account right now, whether you’re using them or not.
Settings → Account and Settings → Advanced → Categories. Turn on "Track expenses and items by customer" if it isn’t already — this is what lets bills and expenses carry a job/customer tag at all.
If you’re on Plus or Advanced, use Projects for anything going forward — it’s built for this and gives you the profitability view for free. If you’re on Simple Start or Essentials, Customer:Job is your only option; create the job as a sub-customer of the actual customer, not as a new top-level customer, so your customer list doesn’t fragment.
Classes let you split a job’s costs further — labor vs. materials vs. equipment, for example. Not required, but useful if you bid jobs by cost category and want to compare bid vs. actual by type, not just in total.
This is the step that actually determines whether the report means anything — and the one that breaks down first under any kind of volume or deadline pressure.
QuickBooks Online has a native bill upload (Expenses → Bills → Add Bill → Upload multiple bills) that reads the vendor name and total off a PDF. It does not know which job that Ferguson or Winsupply invoice belongs to. Someone still has to look at every line, remember or look up the right job, and assign it — for every vendor bill, every week, indefinitely.
That step is where job costing quietly falls apart in most shops. Not from lack of will — from volume. Twenty invoices on a Friday afternoon with three other things going on is exactly the condition under which "I’ll fix the job later" invoices pile up and never get fixed. Six months later, the job profitability report says a job lost money, and nobody can tell if that’s true or if $4,000 in material costs just landed on the wrong job number.
Purchasomatic handles exactly this step — matching every vendor invoice to the right job before it ever reaches your books, automatically.
Try free — 25 invoicesForward a vendor invoice to Purchasomatic and here’s what happens before it lands in QuickBooks:
The job costing structure doesn’t change. Whether you’re on Customer:Job or Projects, Purchasomatic tags the transaction the same way a careful person would — just without the Friday-afternoon shortcut of "I’ll fix it later."
Forward your next 25 vendor invoices to Purchasomatic and see them land in QuickBooks already matched to the right job. No credit card. No QuickBooks connection required to start.
Start free trial25 invoices free · No credit card · 15-minute setup
Heather ran accounts payable for years at an HVAC and mechanical contractor that was barely breaking even — job costing was supposed to explain why, but the numbers were only as good as the bill coding underneath them. She built Purchasomatic to fix that step. If you have questions, reply to any email or call (541) 250-0448.