Job Costing in Jobber: Getting Per-Job Gross Margin When Jobber Has the Jobs and QuickBooks Has the Costs

Danilo Mališić

Danilo Mališić

Founder, Adeocode · Aug 16, 2026

Jobber tracks revenue per job down to the line item, and it lets you enter costs and expenses against a job by hand. Per-job gross margin is the harder half. The margin math needs every cost to reach the job record, and in most 5 to 25 person shops the costs live in four other systems and never get there.

We build reporting systems on Jobber’s API for a living, including per-job margin reports that pull from more than one system. We are independent builders and not affiliated with Jobber or Intuit. This post maps where the costs actually live, what Jobber covers on its own, and the three ways shops actually get the margin number.

The five-system sprawl

Here is the pattern in a typical 5 to 25 person shop on Jobber. A shop owner wrote it up almost word for word in a public hiring post this month. Five working tools that never talk about costs.

The numberWhere it actually livesWho touches it
Job revenueJobber: quotes, invoices, paymentsOffice staff, crew lead
Material and equipment costsSupplier portals and statementsWhoever ordered
Sub costsQuickBooks Online: bills and paymentsThe bookkeeper
Where the job came fromThe CRM, or tags in JobberSales
Gross margin per jobA spreadsheetThe owner, alone

Each system is good at its own job. The sprawl happens because costs are born in different places. The crew lead grabs extra material on install day, and it surfaces on a supplier statement three weeks later. A sub sends one invoice covering three jobs. The punch list return trip burns a crew day and never gets costed anywhere.

So the owner builds a sheet. Every week it gets fed by hand: revenue from Jobber, bills from QuickBooks, statements from the supplier portal. The sheet works. It also only works while the owner keeps feeding it, and nobody else can read it.

The definition inside that sheet is usually deliberate. One version keeps showing up: gross margin equals job revenue, minus equipment and material costs, minus subs hired for that specific job, with labor left out on purpose. More on that choice below. The point here is that the owner already knows the definition. What is missing is a system that computes it without the owner in the loop.

What Jobber gives you out of the box

Jobber’s revenue side is genuinely complete. Quotes, invoices, and payments all hang off the job, so “what did we bill on this job” is always one click away.

On the cost side, Jobber has two built-in tools.

  • Line item costs. You can record what a line costs you next to what you charge, so a quote can show its expected margin before you send it.
  • Expenses on jobs. You can log a cost and tie it to a specific job, which covers receipts your team enters as they go.

Some of this varies by plan, so check your plan’s current features rather than taking any blog’s word for it, ours included.

Both tools share one dependency: a person has to type the cost in, at the time it happens, on the right job. That is a discipline system. Jobber cannot see a bill in QuickBooks, a charge on a supplier statement, or a sub’s invoice in your inbox. Whatever nobody types stays invisible, and the job’s margin reads higher than it was.

The QuickBooks sync covers the other side

Most shops assume the Jobber and QuickBooks sync handles this. It handles a different problem. The sync exists so your books reconcile: customers, invoices, and payments flow from Jobber into QuickBooks Online. That is the revenue side again.

Your costs enter QuickBooks from the other direction. Sub bills, card charges, supplier payments. They arrive coded to a vendor and an account, and in most setups nothing on them reliably names the Jobber job. Sync configurations vary, so check how yours is set up, but this is the wall shops hit.

The two systems agree on what you earned. Neither one can tell you what job 4127 cost. And when the sync itself is broken, taxes off, invoices missing, that is a different problem with its own checks: we wrote the diagnosis guide for it.

Some shops add a fourth seam: a separate CRM that tracks where each job came from. That system holds the marketing spend behind the job, which matters if you want margin net of what it cost to win the work. Same problem in another spot. The record exists, and nothing keys it to the job.

Three ways to get per-job margin

There are three approaches that exist in the real world. Everything else is a variation of one of these.

ApproachAccuracyWeekly effortBreaks whenCost shape
Discipline only: every cost entered in Jobber by handAs good as your worst day of entryMinutes per cost, from every person who buysBusy weeks, new hires, install day chaosCosts no cash and a lot of nagging
The spreadsheet bridge: weekly exports joined in a sheetTrue once a week, stale by ThursdayCall it 2 to 4 owner hoursA renamed column, a mismatched job name, a vacationOwner hours, forever
A built data bridge: API pulls jobs and costs into one reportThe same every morningNear zero after setupAn API change, handled by whoever maintains itBuild cost up front, small ongoing cost

Discipline only

Enter every cost into Jobber, on the job, when it happens. This works in a two or three person shop where the owner touches every purchase.

At 5 to 25 people it decays fast. Costs get bought by four different people on six different accounts, some at 7am at the supply counter. The busiest weeks, when margin matters most, are exactly when entry slips. The number you get is honest on slow weeks and fiction on big ones.

It can be shored up. A rule that the crew lead photographs every receipt before leaving the counter. A Friday sweep where the office enters what the week bought. Shops do make this hold, and the ones that do treat cost entry like the punch list: part of the job, checked weekly, never optional.

The spreadsheet bridge

This is the sheet most owners already run. Export jobs and invoices from Jobber to CSV. Export cost detail from QuickBooks. Paste both into a sheet and match costs to jobs by lookup and by memory. We covered the export routes and their limits in how to export data from Jobber.

The sheet gives a true number once a week, for the price of an evening, call it 2 to 4 hours. Its failure modes are human: job names that never match exactly, a moved column, a week off. And one person maintains it, because one person knows its rules. When that person is also running the company, the sheet is the first thing to slip.

The built data bridge

A small system pulls jobs from Jobber and costs from QuickBooks into one database, matches them by job, and serves one report. Every job, revenue, material costs, sub costs, margin dollars, margin percent. Nobody assembles it. It is there every morning.

That is the short version. The next section is the honest version.

What a built bridge looks like in practice

Nightly, not live. Jobber’s one API is GraphQL, gated to the Plus plan, and it meters every query against a cost budget. There is no reporting API and no bulk export, so a margin report gets rebuilt from raw records through paginated queries. Query Jobber live on page load and you hit the throttle: we measured a single dashboard load at 13,456 to 20,762 query points against a 10,000 point budget. The full numbers are in our production measurements of the Jobber API. So the bridge syncs on a schedule into its own database, and the report reads local.

Jobs keyed across systems. The unglamorous core of the build is matching. A QuickBooks bill has to land on the right Jobber job, so the bridge needs a key. That can be a job number in the bill memo, vendor rules, or whatever your bookkeeper can keep consistent. On the cost side the bridge reads bills, sub payments, and card charges, and every bookkeeper codes those differently. The first week of any build is mapping how yours does it today. Expect some costs to miss every rule, call it 1 in 10, and land in a review queue for a human to assign. Any honest builder will tell you that queue exists. The version without it quietly drops those costs, and the margin report reads high.

“Our biggest problem was that our office team was constantly moving information between systems. Danilo’s team built the integration for us and automated a big part of the workflow. It’s one of those projects where you wonder why we didn’t do it sooner.”

Owner, home services business. Client name shared on a call.

Your definition, computed the same way every night. One table, every job. If your definition is revenue minus material and equipment costs minus job-specific sub costs, that is what it computes, without anyone’s Sunday attached. This is work we run in production for Jobber shops. Our Jobber reports and dashboards page covers the margin reports and sync pipelines we build.

Labor in or out

The definition above leaves labor out on purpose, and shops running steady crews keep arriving at that same choice. Their reasoning holds up. The crew costs the same this week whether job 4127 ran long or short. Leaving labor out gives a clean contribution number: did this job cover its hard costs and put money toward payroll and overhead. Nobody argues about splitting a crew day across two jobs, because nobody has to.

Include labor, at its burdened rate, when labor cost changes per job. That means piece rate or per-job pay, jobs that swing from one crew-day to five, or comparing install work against service work. Burdened means wage plus payroll taxes, comp, and benefits, call it 1.3 to 1.4 times the hourly wage.

Either definition works if it stays put. Write yours down in one sentence, then make the sheet, the report, and every Monday meeting use that sentence.

Where margin fits on the scoreboard

Margin per job is one number on a longer scoreboard. We mapped 12 field service KPIs across Jobber, Housecall Pro, and ServiceTitan. Our field service KPI guide shows which of those numbers each one can display out of the box. The pattern there matches the pattern here. The software is strong wherever money touches it, and weak on any number that joins two record types.

Per-job margin joins three: jobs, invoices, and costs that live in another company’s database. That is why it is the number owners want most and see last.

One thing to do this week

Before you buy or build anything, run the test by hand once. Take last month’s five biggest jobs. Pull revenue from Jobber, costs from QuickBooks and your supplier statements, and compute margin using your written definition.

If that takes 20 minutes, your discipline system is holding. Keep it. If it takes a Saturday, or two of the five numbers surprise you, the sheet has already told you what it needs to become.

Building that is what we do. Our custom Jobber reports page covers per-job margin reports that pull Jobber and QuickBooks into one place. Or book a discovery call and bring your sheet. If a cleaner export and a better sheet gets you there, that is the advice you will get on the call.

Danilo Mališić, founder of Adeocode

Talk to the founder

Bring us the workflow that doesn't fit

Every discovery call is with Dan, who wrote this and builds these systems. He stays your contact through the whole engagement: no sales team, no handoffs. If the tools you already pay for cover it, he'll tell you that too, and the call costs nothing.

Partly. Jobber tracks revenue per job and lets you record line item costs and expenses against a job, so the revenue side is solid. Feature details vary by plan, so check your plan's current features. The gap is the cost side. Bills in QuickBooks and charges on supplier statements never reach the Jobber job record unless someone types them in. Per-job gross margin in Jobber is only as complete as that hand entry.

Three routes. Enter every cost on the job in Jobber by hand and read the numbers there. Or export jobs and invoices to CSV, export costs from QuickBooks, and join them in a spreadsheet each week. Or have a data bridge built that pulls Jobber jobs and QuickBooks costs into one per-job margin report on a nightly sync. Hand entry depends on discipline, the spreadsheet depends on the owner, and the bridge costs money up front.

The Jobber and QuickBooks Online sync is built around the revenue side. Customers, invoices, and payments flow across so the books reconcile. Cost detail per job is the weak spot. Bills, sub payments, and material purchases sit in QuickBooks with a vendor and an amount, and nothing that reliably names the Jobber job. Setups vary, so check your own configuration, but per-job cost flow is where most shops we talk to struggle.

Match it to how you pay. Shops running steady crews on weekly payroll often exclude labor and read gross margin as revenue minus materials minus subs. That answers whether the job covered its hard costs. Include burdened labor when you pay per job, when jobs swing widely in crew-days, or when you compare job types. Burdened means wage plus payroll taxes, comp, and benefits. Pick one definition and keep it.

There is no reporting API and no bulk export. Jobber's API is GraphQL, gated to the Plus plan, and metered by a query cost budget. A report has to be rebuilt from raw records through paginated queries. In practice that means a sync pipeline. A background worker pulls records on a schedule into its own database, and the margin report reads from there instead of hitting Jobber live.

Usually definition and timing. QuickBooks reports whatever was coded to cost of goods sold, and coding drifts. The spreadsheet uses the owner's definition, often excluding labor. Costs also land at different times. A supplier statement can post weeks after install day, and one sub bill can cover three jobs. Same jobs, different numbers. Write one definition down and make every report use it.

You may like these

Jobber and QuickBooks Online Sync Problems: Tax Mismatches, Missing Invoices, and the Chart of Accounts Nobody Set Up

Jobber and QuickBooks Online Sync Problems: Tax Mismatches, Missing Invoices, and the Chart of Accounts Nobody Set Up

Aug 16, 2026

Three failure classes. Tax that was never set up, a chart of accounts with nowhere to put field-service money, and migration damage from a previous system. Each has a diagnosis you can run in under an hour. The checks and the fix ladder are below.

Read more
Field Service KPIs: The 12 Metrics That Matter, and Which Software Can Actually Show Them

Field Service KPIs: The 12 Metrics That Matter, and Which Software Can Actually Show Them

Aug 14, 2026

Every field service KPI list stops at definitions. This one adds the column that matters: can Jobber, Housecall Pro, or ServiceTitan show each number out of the box, or does it live in an export and a spreadsheet? 12 KPIs for a 5 to 30 crew shop, mapped honestly.

Read more
How to Export Data From Jobber (And What You Can't)

How to Export Data From Jobber (And What You Can't)

Aug 14, 2026

Jobber exports data one CSV report at a time. There is no bulk export and no reporting API, which is why so many shops run a weekly spreadsheet ritual to stitch reports together. The three real ways to get your data out: manual CSV, middleware, and a custom API pull, with the honest limits of each.

Read more
Jobber API Rate Limits: What You Can Actually Build, Measured in Production

Jobber API Rate Limits: What You Can Actually Build, Measured in Production

Aug 14, 2026

Jobber's GraphQL API has a 10,000 point query-cost budget that refills at 500 points per second, plus a second cap of 2,500 requests per 5 minutes. One KPI dashboard we run in production costs 13,456 to 20,762 points per load. Every limit with numbers, and what fits inside them. Verified August 14, 2026.

Read more