Roofing job costing in QuickBooks: why the numbers never match your CRM
Your CRM says the job made money and QuickBooks says something else. The cause is not a setting inside QuickBooks. It is which records cross between the two systems, and which never do.

Your QuickBooks job cost report disagrees with your CRM because the two systems are not holding the same job. The revenue side crosses between them. Specific record types never do, and the vendor documentation names them. Here is a four-step check you can run on your own file this week.
Why your job cost report disagrees with your CRM
Turning on Projects and tagging every transaction is worth doing, and it will not close this gap, because the gap is made where the two systems hand records to each other, not inside QuickBooks.
The clearest evidence comes from the vendors themselves. JobNimbus publishes a list of what does and does not reach QuickBooks Online, and Vendors sit on the "does not" side: its own help documentation states that Vendors do not sync to QuickBooks Online. That documentation was accessed in July 2026. The worked example stays with JobNimbus because it publishes the fullest account of its own limits. Look up the equivalent page for whichever CRM you run, and the four checks are the same.
Read that against how a roof job picks up cost. Revenue arrives as an estimate that becomes an invoice, and that is a documented path across. The supplier you key a cost against is a Vendor, and the vendor record has no path at all. Whatever your team has organised by supplier on the CRM side, QuickBooks has never seen.
That isn't a knock on the integration. Moving customers, estimates and invoices between two systems automatically is real work, done well. The question is only where the boundary falls.
- Pull five jobs you closed last month.Open each in both systems at once.
- Match the records, not the totals.A total hides which record is missing. A list doesn't.
- Read the status column.Then check whether your CRM syncs Draft documents at all.
- Read the line items and the tax line.Where those came from tells you which system is in charge.
Step 1: which records never left the CRM?
In QuickBooks, open the project for one job and list every transaction on it. In the CRM, list everything on that job with money attached: estimate, invoice, material orders, vendor bills, change orders. Look for a record type on one list and never the other.
Find out which sync mode you are on. JobNimbus documents three configurations: 2-way, 1-way import and 1-way export. Under 1-way export it states that the sync "only allows you to sync your JobNimbus Jobs to QuickBooks Online SubCustomers. This means that no edits on the QuickBooks side will come back to JobNimbus." Two of the three modes move data one way only. The direction you were waiting on may never have been switched on.
The fields-sync list linked above adds that JobNimbus cannot create Projects in QuickBooks. Turning Project sync on imports them the other way instead. If your jobs and your QuickBooks projects don't line up one to one, start there, because everything downstream is attaching cost to the wrong container. More in what doesn't sync between JobNimbus and QuickBooks.
Step 2: why don't my draft invoices show up in QuickBooks?
This one takes two minutes, and it is the fastest of the four to rule out. JobNimbus's documentation states that Estimates, Invoices and Credit Memos will not sync while in "Draft" status.
Nothing has gone wrong when a document sits in Draft. Somebody is still working on it. A credit memo raised against a shortfall and left in Draft is a real adjustment the books have never seen. Filter your estimates, invoices and credit memos to Draft. Read the dates. Anything older than your last close is missing from the job cost report.
Step 3: why did my cost codes stop matching?
Once the QuickBooks integration is switched on, JobNimbus states that "Custom products in Work Orders, Material Orders, Estimates and Invoices are no longer allowed", so every line has to be selected from Products & Services, or added there first.
Two limits ride along, both landing on cost coding. Product names are capped at 32 characters for QuickBooks Desktop and 100 for QuickBooks Online. The colon character is not permitted in a product name. If your cost codes use colons (anything written as Material:Shingles), that scheme can't cross as written. The name has to change before the line will save.
Print your Products & Services list and read it against the codes your team types. A cost under the wrong product is worse than one that never landed. The total still looks plausible. Nobody goes looking.

Step 4: why is my tax rate different in QuickBooks?
The constraints page quoted in Step 3 states it plainly. "You cannot add taxes in JobNimbus. You will need to add a new tax within QuickBooks." The Taxes section in the CRM's settings becomes locked. The fields-sync article adds that Taxes are a one-way sync from QuickBooks.
It settles what the other three only circle: which system is authoritative for a given field. If a salesperson thinks they set a rate in the CRM and the invoice shows another, that field was never theirs.
Here is what one of the four does to a single job. The contract value is the average insurance-claim roof replacement in 2025, per the 2026 U.S. Roof Report from Verisk. Verisk sells roof-risk analytics to insurers, and that average is claims work, so it runs higher than a cash-pay re-roof. The credit memo is invented.
| One job | What your CRM shows | What the QuickBooks job report shows |
|---|---|---|
| Contract | $17,631 | $17,631 |
| Credit memo, still in Draft | -$2,000 | not there, Drafts don't sync |
| Reads as revenue on the job | $15,631 | $17,631 |
Neither report is wrong. The difference between them is a record that was never going to cross.
What job costing looks like without a reconciliation step
Everything above is a reconciliation procedure. It exists because two systems each hold a partial copy of the same job, with a person standing in the difference.
When the system is built around your work, the job is one record. Estimate, material orders, subcontractor bills, invoice. All facts about the same job, all on it.

The books still belong in QuickBooks, and a purpose-built system should post to them. That is what accounting software is for. Every cost line is written against the job as it happens: the material order when it's placed, the supplier bill when it's received, the sub's invoice when it's approved. A scheduled posting job sends completed invoices and bills to the accounting system, tags each to the same job, and stores the reference it gets back so nothing posts twice. Anything accounting refuses (a name it won't take, a product that doesn't exist there yet) lands in a failed-post queue with the reason attached, and a person clears the queue. That queue is the whole reconciliation.
Same argument as running one system instead of five, pointed at the report an owner actually reads.
If the four checks come back clean, the boundary sits where you'd have put it and there's nothing to fix. If they don't, the question isn't which report is right. It's whether you want to keep running the check every month.
Frequently asked questions
Does QuickBooks Online do job costing for roofing?
Yes. QuickBooks Online tracks income and expense against a project. The catch sits upstream of the report. It can only account for records that reached it, so a clean QuickBooks setup can still produce a job cost that reads high, because the record that would have corrected it never arrived from the CRM.
Why do all my locations end up in one QuickBooks file?
Because the integration is documented to work that way. JobNimbus's help documentation, accessed July 2026, states that all JobNimbus locations can sync to only a single QuickBooks Online file. If you run two branches, both feed the same QuickBooks company. The CRM will not split them across two files for you.
Does renaming a job in JobNimbus rename the QuickBooks project?
No. Per JobNimbus's own documentation, accessed July 2026, even under 2-way sync a Job display name changed in JobNimbus will not reach the QuickBooks Online Project, while a Project name changed in QuickBooks Online does flow back into JobNimbus. Rename on the QuickBooks side if you want both to match.
Can I use cost codes with colons in a CRM to QuickBooks integration?
Not in JobNimbus, as of July 2026. Its documentation states that the colon character is not permitted in product names, and that product names are capped at 32 characters for QuickBooks Desktop and 100 for QuickBooks Online. A colon-based cost-code scheme has to be rewritten before it will cross.
Does my CRM create the QuickBooks project, or does QuickBooks create it?
In JobNimbus, QuickBooks creates it. Its documentation states that JobNimbus cannot create Projects in QuickBooks. Enabling Project sync only imports them from QuickBooks as jobs. The container your cost attaches to originates on the accounting side, not in the CRM.

