Meta Title: Job Costing in QuickBooks Online: Setup and Its Limits
Meta Description: How to structure job costing in QuickBooks Online, the three things a ledger cannot tell you about a job, and what to add when you hit that limit.
How to set up job costing in QuickBooks Online, and what to do when it's not enough
TL;DR Job costing in QuickBooks Online works by segmenting ledger transactions so revenue and costs can be reported against a job, using customers and sub-customers, classes, locations and items as your dimensions. Configured carefully, it gives you a reliable retrospective view of what each job earned and what it was invoiced for. It cannot tell you what your own labour cost, what you have committed but not yet been billed for, or whether a job is on budget today. This article covers the setup and then what to add when those three gaps start costing you money.
What job costing needs before you configure anything
Job costing is the practice of attributing revenue and cost to a unit of work rather than to a period. To do it properly, four things have to be true.
Revenue has to be attributable to a job.
Direct costs have to be attributable to the same job.
Labour has to be costed to that job at a rate that reflects what the people actually cost you.
There has to be a baseline, because a cost figure with nothing to compare it against tells you what happened but not whether it was acceptable.
QuickBooks Online can do the first two well. The third and fourth are where the setup runs into structural limits, which is worth knowing before you invest a weekend in configuration.
Setting it up in QuickBooks Online
The setup is essentially one decision followed by two implementation choices.
Choose the dimension that represents a job
QuickBooks Online gives you several ways to segment a transaction. Customers and sub-customers, classes, and locations are all available as dimensions, and each behaves differently.
The sub-customer approach nests each job beneath its client, which mirrors how most service firms think and keeps job level detail attached to the client relationship. It suits firms with a moderate number of clients running distinct engagements.
Classes work as a flat dimension across the whole ledger. They can represent jobs, but they can also represent service lines, offices or divisions, and you only get one class per transaction line. If you are already using classes for business segments, they are not available for jobs as well, and that constraint is the single most common reason a job costing setup fails after six months.
Locations behave similarly and are usually better reserved for genuine geographic or entity separation.
The decision that matters is what you want your ledger segmented by first. Choose that, apply it consistently, and do not attempt to make one dimension carry two meanings.
Structure items and accounts so costs land somewhere useful
Once a job dimension exists, the next question is what detail sits underneath it.
Items are how QuickBooks distinguishes types of revenue and cost within a transaction. Set them up to match the cost categories you actually want to analyse, such as subcontractor fees, consultant charges, materials, printing or travel. If every job cost is coded to a single generic expense item, you will know what a job cost you but not what drove it, which limits what you can do about the next one.
Account codes then determine how those items roll up into the profit and loss. Direct job costs should sit in accounts you can distinguish from overheads, because gross margin at job level is meaningless if administrative expense is mixed into it.
Enforce the coding at entry
The whole structure depends on every relevant transaction carrying the job dimension. A bill entered without it is invisible to job costing, and nobody discovers this until a job appears more profitable than it was.
Set defaults wherever the system allows, brief anyone who enters bills, and run a periodic check for transactions in your direct cost accounts that carry no job dimension. That review is the single highest value habit in a ledger based job costing setup.
What the setup gives you, honestly
Configured this way, QuickBooks Online will tell you what each job invoiced, what direct costs were coded to it, and the difference between the two. Across a period you can see which jobs and clients contributed most.
For a firm whose costs are predominantly external, such as a business reselling subcontracted work with a small internal team, that may be genuinely sufficient. The largest costs pass through the ledger as bills, and the ledger sees them.
For a firm whose main cost is its own people, the picture is incomplete in a specific way.
Three things the ledger will not tell you
What your own labour cost
This is the significant one, and it is structural rather than a configuration failure.
Salaried staff hit the ledger as payroll expense for a period. That expense is real, it is usually the largest cost in a professional services firm, and it has no job dimension because a salary is not incurred against a job. Nothing in the setup above changes this.
The consequence is that a job showing healthy margin in QuickBooks may be showing revenue minus external costs only. If that job absorbed four hundred internal hours, none of them appear. The margin is not wrong exactly, but it is answering a narrower question than the one you asked.
What you have committed but not yet been billed for
A ledger records transactions. When you engage a subcontractor for a defined sum, no transaction occurs until they invoice you.
Between the commitment and the bill, the job carries a cost that exists commercially and is invisible financially. On a job running over several months with multiple engagements, the gap between committed cost and recorded cost can be substantial, and it is always in the direction that makes the job look better than it is.
Whether a job is on budget right now
Ledger reporting is periodic by design. It answers what happened up to a closing date.
Budget control requires something different, which is knowing the position of a live job at the moment a decision is available. By the time a month has closed and been reviewed, the work is done and the options have narrowed to how you word the invoice.
What to add when you reach that point
The gaps above are not solved by more sophisticated ledger configuration. They are solved by adding a layer that holds the job as an operational object, then feeding clean transactions back into QuickBooks.
Costing your own labour requires recording it, which is why time tracking is the foundation rather than an add on. Eight recording methods exist because the way a site based engineer captures time and the way an office based consultant does are not the same problem, and a method that does not fit the working pattern produces late entries and unreliable costs.
Committed costs become visible through purchase orders, which keep supplier costs tied to the work they relate to from the point the order is raised, with partial or full receipts recorded as they arrive. A purchase order does not reach the ledger, because a request to buy is not a financial transaction. It reaches the job immediately, which is where you need it.
The live budget position comes from holding the job itself as the unit. Job management tracks resources, time and costs against each job, with a job overview dashboard showing gross margin and job profitability rather than requiring a report to be assembled first. Job templates keep recurring work structured identically, which is what makes comparison across jobs possible at all.
Reporting then covers the analytical layer, with system reports for common needs and a report builder for anything specific to your firm, saved to favourites for repeated use.
The connection back to the ledger is what keeps this from becoming two sets of books. The QuickBooks integration pushes approved sales invoices through to QuickBooks automatically and syncs customer payments back. Supplier invoices entered against a job update job profitability reporting and create a payable bill in QuickBooks in the same action, with account codes, classes or locations and tax rates mapped in advance so nothing is coded by hand.
The practical effect is that QuickBooks keeps doing what it does well, which is being the ledger, while the job level questions get answered somewhere built to answer them.
The ledger is the record, not the control
There is a reasonable version of this article that ends by saying QuickBooks job costing is inadequate. That would be unfair and not quite true.
A general ledger is an excellent record of what has already happened, and job costing configured inside it will tell you that accurately for the costs it can see. The difficulty is that budget control is not a recording problem. It is a timing problem. The information has to arrive while the job is still running and the decision is still open.
That is the honest test for any firm weighing whether their current setup is enough. Not whether the numbers are right at the end, but whether anyone knew in time to change the outcome. If the answer is consistently no, the constraint is not your chart of accounts.
Check the gap on a job you have already closed
Take a completed job, pull its QuickBooks position, then estimate the internal hours it absorbed at a realistic cost rate. The difference between those two figures is what your current setup is not showing you. WorkflowMAX offers a 14 day free trial if you want to see the same job cost both ways. If you would rather talk through how your QuickBooks structure would map across, you can book a demo with the team.





