Get paid · What a job actually cost

Job cost tied to the unit.

Labor, materials, and purchase-order cost attach to the same work order that's tied to the equipment being serviced and, when one exists, the agreement covering it — not a spreadsheet reconciled after the fact.

LiveP&L rollup early access

What it is

Job costing in Thermal is the record of what a job actually cost — labor, materials, and purchase orders — attributed to the same work order the technician was dispatched to, not a separate ledger someone reconciles at month end. That work order already carries the equipment it was for and, when one applies, the service agreement it billed under, so cost inherits both connections instead of needing its own.

Department-level cost and revenue then roll up from those same attribution events into a P&L an Owner can read by branch, department, and date range — the same events, read a level higher, not a second parallel system. It's the same math behind gross margin per job and, when the work billed under a contract, maintenance contract margin.

Where job costing sits on the spine.

Cost-attribution events key off the work order — the same record already tied to the equipment it was for and, when one exists, the service agreement it billed under. A job's cost is a read against that one record, not a separately maintained project code.

  1. 01Customer

    One account. Every site under it.

  2. 02Service site

    The address, and the branch that covers it.

  3. 03Installed equipment

    The unit the cost is for.

  4. 04Service agreement

    The agreement the work billed under.

  5. 05Work order

    The work order the cost attributes to.

  6. 06Invoice

    Cost capture closes the loop here.

    You are here

The work order arrives from dispatch already carrying the unit and, when one exists, the agreement it billed under — so the cost that follows it inherits both links without its own bookkeeping.

ThermalDispatchAgreementsEquipment
Illustrative job-cost register — interface mock, not customer data
Work orderUnit · AgreementLabourMaterialsTotal costRevenueMargin
WO‑1847EQ‑1215 · AG‑2258Dept unassigned$1,020$480$1,500$2,340Unassigned
WO‑1842EQ‑1188 · AG‑2240HVAC · Winnipeg$640$210$850$0Covered
WO‑1843EQ‑1201 · AG‑2231Mechanical · Mississauga$1,180$320$1,500$2,69044%
WO‑1844EQ‑1222 · AG‑2263Refrigeration · Prairie$900$1,450$2,350$3,18026%
WO‑1839EQ‑1142 · AG‑2214HVAC · Ottawa$760$190$950$1,72045%
Illustrative interface mock — not customer dataExceptions sort first: attribution gaps, unassigned departments

Cost capture is automatic. The rollup is early access.

Seven pieces of how Thermal tracks what a job actually cost — most live today, one still landing in stages.

Live

Tied to the equipment and the agreement

Cost attributes to the same work order that's already linked to the specific unit being serviced and, when one exists, the service agreement it billed under — not a project code disconnected from the job that generated it.

  • TodayCost inherits the work order's equipment and agreement links
Live

Cost capture, automatic

Labor, materials, and purchase-order cost attribute the moment a job runs and an invoice is paid — an immutable attribution event per source, not a number someone re-enters from a paper ticket at month end. The event records what was posted, when, and against which record, which is also what feeds labor utilization without a separate timesheet reconciliation.

  • TodayAttribution events keyed off the work order, written automatically
Early access

Department P&L rollup

Cost and revenue roll up per department into a report an Owner can filter by branch and date, with CSV export. It ships behind a deliberate three-switch rollout a shop turns on in stages — report-only first — rather than a live number from day one.

  • TodayCost capture is live for every org; the report, capture and manager compensation are staged switches
Live

Correct an assignment without rewriting history

Reclassify a live estimate, project, or work order's department from its edit screen with a required reason — the posted cost, revenue, and compensation snapshots underneath stay exactly as they were recorded. The correction is visible in the record, not silently rewritten.

  • TodayReclassification with a required reason; snapshots unchanged
Live

Commissions, calculated automatically

A technician's commission plan — percent of job value or a flat fee, with an optional multiplier and cap — calculates the moment their work order completes and lands on a ledger, never a payout entered by hand. Rate, multiplier and cap are snapshotted when it's earned.

  • TodayCommission plans calculated at work-order completion, snapshotted
Live

Health checks before you trust the number

Reconciliation, duplicate-event, unassigned-department, and attribution-gap checks surface what needs review before a margin gets reported — so a broken total gets caught, not published.

  • TodayReconciliation, duplicate, unassigned and gap checks with source IDs
Live

Snapshot-based accounting handoff

Exports carry the department attribution recorded at the moment of posting — a later rename or reclassification never rewrites a closed period. This doesn't activate a general-ledger mapping or a payroll run on its own; Thermal runs beside your books, not inside them.

  • TodayFrozen attribution snapshots; no GL mapping or payroll by itself

What job costing will not do.

Three boundaries that keep cost numbers trustworthy.

It won't post to your ledger or run payroll

Exports carry a snapshot of the attribution recorded at posting time, but this doesn't activate a general-ledger mapping or a payroll payout by itself. Thermal runs beside QuickBooks — never inside it. Check the integrations page for what moves.

It won't rewrite a closed period

Reclassifying a job's department records the correction, but the cost, revenue, and compensation snapshots already posted stay as they were recorded. History is never quietly rewritten to make this month's numbers look better.

It won't turn on the full rollup by default

The department P&L report, cost/revenue attribution, and manager compensation are three separate switches an Owner promotes one at a time — report-only first, on purpose. There's no surprise live number an org hasn't opted into.

If a capability isn't on this page, assume it isn't built. We'd rather lose a deal on a missing feature than win one on a sentence that turns out to be aspirational.

What job costing touches.

Cost reads the records a job touched and rolls up into the numbers an Owner reads.

Reads from

Writes to

Sits beside

Questions a controller asks.

The ones that come up when a shop has been reconciling from paper tickets at month end.

Is job cost tied to a specific piece of equipment?

Yes, indirectly through the work order — every work order carries the equipment it was for, and cost-attribution events key off that same work order, so job cost inherits the equipment link rather than needing its own. The same inheritance applies to the agreement it billed under.

Does cost capture require a rollout or setup?

No — cost capture itself is live for every organization today. What's staged is the department P&L rollup, which promotes through report-only mode first, on purpose, before cost and revenue attribution and manager compensation turn on. There's no surprise live number an org hasn't opted into.

How does the department P&L rollup work?

Cost and revenue roll up per department from the same attribution events cost capture writes, filterable by branch and date range, with CSV export. An Owner promotes the report, then capture, then manager compensation — in that order, deliberately, not all at once.

Are commissions calculated automatically?

Yes — a technician's assigned commission plan calculates against their completed work order automatically and lands on a ledger; rate, multiplier, and cap are snapshotted at the moment it's earned, so editing the plan later never rewrites a commission already paid. A payout is a recorded fact, not a moving number.

What happens if a job gets assigned to the wrong department?

It can be reclassified from its edit screen with a required reason — the correction is recorded, but the cost, revenue, and compensation snapshots already posted under the old assignment stay unchanged, so history isn't rewritten. A closed period stays closed.

Does job costing post to my accounting system?

Exports carry a snapshot of the attribution recorded at posting time, but this doesn't activate a general-ledger mapping or payroll payout by itself — Thermal runs beside QuickBooks, not inside it. The snapshot is the handoff; your accounting system still owns the books.

See job cost tied to the record it came from.

Bring the job whose margin nobody can actually state and watch its cost, revenue, and margin read off the one work order on the call.