Skip to content

Job Costing


The Job Costing module tracks the complete financial lifecycle of projects — from initial contract and cost estimates through expense posting, billing, and closeout. It integrates with Accounts Receivable (invoices and payments), Inventory (material picks and allocations), and the General Ledger (cost postings and contract distributions).

Key capabilities include:

  • Job management — track projects from contract through close, with customer and site linking
  • Contracts and change orders — maintain original contract value and approved change orders
  • Cost estimates — budget by cost category (material, labor, subcontractors, other)
  • Expense posting — post individual labor, material, subcontractor, and other expenses
  • Material posting — bulk-post material usage with inventory allocation
  • Actual vs. Estimate (AvE) — compare budgeted and actual costs at any point
  • Job close — finalize accounting and GL distributions at project completion

  • Job — A project tracked from contract through completion. Each job is linked to a customer and site, has a type that controls available cost entry types, and accumulates costs against estimates. Jobs can be open (active) or closed (finalized). Example: Job J-1050, “HVAC Installation — Greenfield Construction, Building C.”

  • Job Contract & Change Orders — The original contract establishes the agreed revenue for the job. Change orders add or subtract from the total contract value as scope changes occur. The Total Contract Amount = Original Contract + All Approved Change Orders.

  • Cost Estimate — A budget for the job broken down by cost category (Electrical, Mechanical, etc.) and cost type (Material, Labor, Subs, Other). Estimates are set per contract/change order and provide the baseline for Actual vs. Estimate comparisons.

  • Job Cost Entry — An individual expense posted to a job. Each entry has a cost type (Labor, Material, Subs, or Other), an amount, and optional overhead. Labor entries include hours; material entries include quantity. These accumulate as the job’s actual cost.

  • Overhead / Burden — Indirect costs applied as a percentage of direct costs. Each Job Cost Category has overhead factors (Material Factor, Labor Factor, Subs Factor). When a $1,000 labor expense is posted to a category with a 15% Labor Factor, the application calculates $150 in overhead. Burden % on the job applies to all labor costs.

  • WIP (Work in Progress) — Jobs flagged as “WIP Reportable” are included in work-in-progress financial reporting. WIP compares earned revenue against costs incurred to determine over/under billing positions — critical for construction accounting.

  • CPI (Cost Performance Index) — Budgeted Cost of Work Performed (BCWP) ÷ Actual Cost, where BCWP = Percent Complete × Estimated Cost. A CPI of 1.0 means the job is exactly on budget. Above 1.0 = under budget (good). Below 1.0 = over budget (investigate). The CPI is displayed on the per-job metrics dashboard with color coding: green (≥ 1.0), yellow (0.9–1.0), red (< 0.9).


Upstream — Where Job Costing gets its data:

  • CRM → A proposal can use Conversion Type = Job, which structures the proposal’s line items for job work, but jobs are created manually in Job Costing → Manage Jobs (the Create Job form). There is no automatic job creation that pre-populates customer, site, or estimated values from an approved proposal.
  • Payroll (Timesheets) → Timesheet entries allocated to a job create labor cost entries when synced to payroll
  • Accounts Payable → Vendor invoice lines distributed to a job create subcontractor or material cost entries
  • Inventory → Material picks and allocations for a job create material cost entries; inventory is drawn from warehouse locations

Downstream — Where Job Costing sends its data:

  • Accounts Receivable → Job invoicing creates AR invoices linked to the job. Invoice amounts appear in the Billing & Collections section of the job dashboard.
  • General Ledger → Job expense postings create GL entries (debit expense accounts, credit cost accounts). Job close creates final GL distributions to the contract closing account.
  • Reports → Job profitability, WIP, and Actual vs. Estimate reports read directly from job cost data.

Key Integration Point — Actual vs. Estimate: Every expense posted to a job is compared against the cost estimate on the per-job dashboard. This real-time comparison drives CPI, forecast final cost, and margin erosion/growth metrics. When a vendor invoice from FastPipe Supply is distributed to Job J-1050 in AP, the material expense immediately appears in the job’s Actual vs. Estimate comparison, updating the CPI and forecast.


Navigation: Job Costing → Dashboard (the screen header reads “Job Cost Dashboard”)

The dashboard provides cross-job analysis with six charts, each with a date range filter (Start Date / End Date).

ChartTypeDescription
Expenses by Cost TypeBar chartTotal expense dollars grouped by job cost entry type (the named entry types such as “Direct Labor” or “Materials”), not the four Labor/Material/Subs/Other buckets. Y-axis formatted as currency. Zoom and navigator enabled.
Expenses by Job TypeBar chartTotal expense dollars grouped by job type. Hover tooltip shows the full job type name. Zoom and navigator enabled.
AvE by Job TypeGrouped bar chartActual vs. Estimate cost comparison by job type. Two bars per job type: Actual and Estimate. Y-axis in dollars. Zoom and navigator enabled.
Labor Productivity (Hours) by Job TypeGrouped bar chartActual vs. estimated labor hours by job type. Y-axis in hours (2 decimal places). Zoom and navigator enabled.
Gross Margin by Job TypeGrouped bar chartActual vs. estimated gross margin percentage by job type. Y-axis as percentage (2 decimal places). Zoom and navigator enabled.
Contract TotalsDual-axis bar chartDollar amounts and counts of job contracts by bucket (All, Contract, Change Order). Left axis: amount ($); right axis: count.

Navigation: Job Costing → Manage Jobs

The search screen lists all jobs with the following columns:

ColumnDescription
Job IDThe system job code (humanId)
ProjectProject name
CustomerCustomer name
Contract DateDate the contract was signed
Start DateJob start date
End DateJob end date
AddressCustomer site address
ActionsEdit and Delete buttons per row
  • Type in Search for a Job to filter results in real time (elastic search).
  • Click any row to open the job’s View screen in a new tab.
  • Click the Edit icon to edit the job (requires update permission).
  • Click the Delete icon to delete the job after confirmation (requires delete permission).
  • Click the + icon in the column header to create a new job (requires create permission).

FieldRequiredDescription
CustomerYesThe customer associated with this job
SiteYesThe customer site address where work is performed. After selecting, the full address is displayed below.
Job IDNoUnique job identifier. Optional and manually entered on create (must be unique if provided); read-only on edit.
Project NameNoDescriptive project name
Job TypeYesThe job type classification (controls which cost entry types are available and GL accounts)
Start DateNoPlanned start date
End DateNoPlanned end date
Customer Purchase Order NumberNoThe customer’s PO number referencing this job
CommissionNoCommission dollar amount (default $0.00)
RetentionNoRetainage percentage held back from invoices, entered as a percent (default 0%). The View screen displays this as “Retention %”.
BurdenNoLabor burden percentage applied to labor costs; entered as a percent (default 0%)
CertifiedNoCheckbox — marks the job as certified payroll
WIP ReportableNoCheckbox — includes this job in Work-in-Progress reporting (default checked)
NotesNoFree-text internal notes (multiline, 10 rows)

Custom fields (configured per your site) appear at the bottom of the form.

Click Create (new job) or Save (existing job) to submit.


The View Job screen is divided into a collapsible upper summary section and a lower tab section.

The upper section can be collapsed or expanded using the expand/collapse button. It displays:

Left column — Customer & Site:

  • Customer profile (name, contact info)
  • Site address

Right column — Job Details:

FieldDescription
Job ID
Customer PO Number
Start Date / End Date
Retention % / Burden %
Project Name
Contract Date
Closed DateWhen the job was closed (blank if open)
Last Change DateMost recent change order date
Last Invoice DateMost recent invoice date
Last Paid DateMost recent payment date
Total Contract AmountOriginal contract + change orders
Contract AmountOriginal contract value
Change Order AmountApproved change order total
Last Invoice AmountMost recent invoice amount
Last Paid AmountMost recent payment amount
Estimated CostTotal estimated cost from the estimate
Estimated HoursTotal estimated labor hours
CommissionCommission dollar amount
Invoiced to DateCumulative invoiced amount
Paid to DateCumulative amount collected

Status Chips (top of screen):

  • Job Type — displays the assigned job type
  • Open (green) or Closed (red) — current status
  • Certified (yellow/warning) — appears when certified payroll is enabled
  • WIP Reportable — appears when WIP reporting is active
  • Tags — any tags applied to this job (requires tag permission)
TabDescription
GeneralThe summary fields described above
NotesJob notes in formatted display
Custom FieldsValues for any configured custom fields
TabDescription
DashboardPer-job KPI dashboard (see Section 6)
ContractsAll job contracts and change orders
EstimatesEstimated costs by category and cost type
Actual vs EstSide-by-side comparison of actual vs. estimated costs by category
InvoicesAR invoices linked to this job
Job ExpensesAll posted job expense entries
Job Expense LogsAudit log of changes to job expense entries
CommunicationsCommunications (calls, emails, texts) logged against this job
Purchase OrdersInventory purchase orders linked to this job
AttachmentsFiles and documents attached to this job
ActionDescription
Manage EstimatesNavigate to the Estimates screen for this job (disabled if closed)
Post ExpenseNavigate to Post Job Expense pre-loaded with this job (disabled if closed)
Close JobClose the job and finalize GL distributions. Toggle — shows Reopen Job when closed.
Preview Pick TicketPreview the inventory pick ticket for this job
Email Pick TicketEmail the pick ticket
Audit JobView an audit trail of changes to this job
Edit JobNavigate to the edit form (disabled if closed)
Delete JobDelete the job after confirmation (disabled if closed)

Navigation: View Job screen → Job Expenses tab.

The Job Expenses tab lists every posted expense entry for the job. What labor cost detail a user sees in this grid depends on the Job Cost Show Rates misc permission.

When a user does not have the Job Cost Show Rates permission:

ColumnBehavior without permission
Regular HoursHidden — the column is removed from the grid and cannot be re-added through the column chooser.
Overtime HoursHidden — the column is removed from the grid and cannot be re-added through the column chooser.
Doubletime HoursHidden — the column is removed from the grid and cannot be re-added through the column chooser.
Expense AmountBlank for Labor-type entries (the value is suppressed). Shown normally for non-Labor entries.
Overhead AmountBlank for Labor-type entries (the value is suppressed). Shown normally for non-Labor entries.

Users with the permission see all three hours columns and the Expense Amount and Overhead Amount values for labor entries as normal.

The Actual vs Est tab on the View Job screen presents a side-by-side, per-cost-category grid comparing estimated costs against job-to-date (JTD) actuals. Each row is a Job Cost Category; the grid includes one row for every category that appears in either the job’s estimates or its posted expenses.

The Job Cost Category column is pinned to the left and sorted in ascending order. All dollar columns are formatted as currency and hour/quantity columns to two decimal places.

ColumnDescription
Job Cost CategoryThe cost category for this row (pinned, sorted ascending)
Hrs EstEstimated labor hours for the category (sum of the estimate lines’ Labor Hours)
Hrs JTDActual labor hours posted to date — regular + overtime + doubletime hours across all Labor-type expenses in the category
Qty EstEstimated quantity (always displayed as 0)
Qty JTDActual quantity posted to date — the sum of the quantity field across all expenses in the category, regardless of cost type
Labor EstEstimated labor dollars (sum of the estimate lines’ Labor Cost)
Labor JTDActual labor expense dollars posted to date (Labor-type expense amounts, excluding burden)
Burden JTDActual labor overhead/burden posted to date (the overhead amount on Labor-type expenses)
Mat’l EstEstimated material dollars (sum of the estimate lines’ Material Cost)
Mat’l JTDActual material posted to date — material expense amount plus its overhead
Subs EstEstimated subcontractor dollars (sum of the estimate lines’ Subs Cost)
Subs JTDActual subcontractor posted to date — subs expense amount plus its overhead
Other EstEstimated other-cost dollars (sum of the estimate lines’ Other Cost)
Other JTDActual other cost posted to date — other expense amount plus its overhead
Total EstTotal estimated cost for the category (Labor Est + Mat’l Est + Subs Est + Other Est)
TotalTotal actual cost posted to date (Labor JTD + Burden JTD + Mat’l JTD + Subs JTD + Other JTD)
% DiffTotal actual as a percentage of total estimate (Total ÷ Total Est × 100). Displays 0 when the category has no estimate.

The Job Expense Logs tab on the View Job screen shows a transaction history of the job’s posted material and expense activity. Each top-level row is one posting transaction; rows for tracked-inventory material postings can be expanded to reveal the inventory pick detail behind them.

Navigation: View Job screen → Job Expense Logs lower tab

ColumnDescription
DateThe transaction date of the posting
Expense TypeThe job cost entry type used for the posting
Expense AmountThe expense dollar amount of the related job cost entry
OH AmountThe overhead dollar amount of the related job cost entry
UserThe user who created the transaction
ReversedWhether the transaction has been reversed
Reversal DateThe date the transaction was reversed (blank if not reversed)
Reversal UserThe user who reversed the transaction (blank if not reversed)

A row can be expanded only when its posting is a Material cost type and the product is inventory-tracked. For those rows, an expand control appears at the left of the row.

  1. Find a material transaction row whose product is inventory-tracked.
  2. Click the expand control at the start of the row.
  3. The detail grid loads the inventory pick records that made up that posting.

The expanded detail grid shows one row per inventory pick with these columns:

ColumnDescription
ProductThe product that was picked
LocationThe inventory location the quantity was drawn from
Serialized ProductThe specific serialized unit, when the product is serialized
PalletThe pallet the quantity was picked from, when applicable
Container SizeThe container size of the picked quantity
QuantityThe quantity picked from that location

Delete permanently removes a job from the system. A confirmation dialog appears: “Are you sure you want to delete this job?”

Prerequisites:

  • Job must be open — closed jobs cannot be deleted. Reopen the job first if needed.
  • User must have the job delete permission.
  • No close-date validation is required since deletion does not create GL entries.

Deleting a job removes the job record and its associated data (contracts, estimates, expense entries). This action cannot be undone.


Accessed from the Dashboard tab on the View Job screen, this section provides deep financial KPIs for the selected job.

  • Percent Complete — horizontal progress bar showing the ratio of actual cost to estimated cost
  • Earned Revenue — revenue recognized based on completion
  • Backlog Remaining — remaining unearned contract value
KPIDescription
Original ContractBase contract amount
Approved COsApproved change order total (highlighted if non-zero)
Total RevenueContract + change orders (shown in green as “good”)
KPIDescription
Estimated CostTotal from the job estimate, including burden. If a job has a Burden % configured, the estimate includes a Burden Estimated amount calculated from the labor estimate (unless the job type’s “Estimates Include Burden” flag is set, in which case burden is already included in the estimate figures).
Actual CostActual posted expenses to date, including burden (shown in red if exceeds estimate)
Committed (POs)Value of open purchase orders linked to this job
Remaining CommittedUndelivered PO value
Cost to CompleteProjected cost still required to finish

Cost Breakdown Donut Chart shows the split between Actual, Committed (Open POs), and Estimated Remaining cost.

Actual vs. Estimates Stacked Horizontal Bar Chart compares Estimated and Actual cost by job cost category, sorted by total estimated descending. Tooltips show Est, Act, and Difference for each category.

KPIDescription
Estimated MarginExpected gross margin (dollar + percent)
Actual Margin-to-DateRealized gross margin on costs incurred so far
CPICost Performance Index = BCWP ÷ Actual Cost, where BCWP = Percent Complete × Estimated Cost. ≥ 1.0 means on or under budget. Shown green (≥ 1.0), yellow (0.9–1.0), or red (< 0.9).
Forecast Final CostProjected total cost at completion based on current burn rate
Margin Growth/ErosionChange in margin vs. original estimate
Forecast MarginProjected final gross margin (dollar + percent)

Margin Comparison Chart shows bars for Estimated, Actual-to-Date, and Forecast margins. Green bars = positive margin; red = negative.

KPIDescription
Invoiced to DateTotal invoiced, with billing % as sub-label
Paid to DateTotal collected
Accounts ReceivableOutstanding balance (highlighted yellow if > 0)
Retainage HeldRetention amount withheld
Collection RatePaid ÷ invoiced (green/yellow/red)
Over / Under BillingDifference between revenue earned and amount invoiced. Positive = overbilled; negative = underbilled.

Billing Summary Chart shows a bar comparison of Invoiced, Paid, A/R, and Retainage.

KPIDescription
Estimated HoursHours from the labor estimate
Actual HoursLabor hours posted to date
Labor Burn RateActual hours ÷ estimated hours (% used). Highlighted yellow or red when over threshold.

Hours Chart compares total Estimated vs. Actual labor hours.

KPIDescription
Cash PositionNet cash flow (collected − cost incurred). Green if positive, red if negative.

Navigation: Job Costing → Manage Estimates, or via Actions → Manage Estimates from a job

This screen sets the cost budget for a specific job contract.

FieldRequiredDescription
JobYesSearch for the job to estimate (searches open jobs by Job ID, customer name, or customer ID)
CustomerRead-only display of the selected job’s customer
SiteRead-only display of the selected job’s site address
Job ContractYesSelect which contract or change order to estimate. Switching contracts loads the existing estimates for that contract.
Contract AmountRead-only display of the selected contract’s dollar value

Each row in the grid represents one cost category’s budget:

ColumnDescription
Job Cost CategorySelect the cost category for this estimate line
Material CostEstimated material dollars
Labor HoursEstimated labor hours
Labor CostEstimated labor dollars
Subs CostEstimated subcontractor dollars
Other CostEstimated other cost dollars
DeleteRemove this estimate row
  • A new blank row is automatically added when you focus on the last row.
  • The Estimate Total footer row shows the sum of all cost columns.
ButtonDescription
Save and Clear JobSave the current estimates and clear the job field so you can estimate a different job
Save Current EstimateSave the estimates for the current contract

Navigation: Job Costing → Post Job Expense, or via Actions → Post Expense from a job

This screen posts a single expense entry (labor, material, subcontractor, or other cost) to a job.

The Transfer Expense toggle at the top switches between:

  • Standard posting — records a new expense on the selected job
  • Transfer — moves an existing expense from one job to another (the Transfer To Job field appears)
FieldRequiredDescription
JobYesThe job to post to (search filters to open jobs only)
Transfer To JobConditionalTarget job when in Transfer mode (required if transferring)
DateYesTransaction date
Job Expense TypeYesThe expense type, filtered to match the selected job’s job type
Job Cost CategoryYesThe cost category for this expense
VendorConditionalRequired when the expense type has cost type Subs
EmployeeConditionalEnabled (editable) when the expense type has cost type Labor; optional — not required
ProductConditionalRequired when the expense type has cost type Material
DescriptionNoFree-text description of the expense
Invoice NumberNoReference invoice number

Labor Fields (visible when cost type = Labor)

Section titled “Labor Fields (visible when cost type = Labor)”
FieldDescription
Regular HoursRegular-time hours (2 decimal places). Negative values are allowed for corrections or adjustments.
Overtime HoursOvertime hours (2 decimal places). Negative values are allowed for corrections or adjustments.
Doubletime HoursDouble-time hours (2 decimal places). Negative values are allowed for corrections or adjustments.

Material Fields (visible when cost type = Material)

Section titled “Material Fields (visible when cost type = Material)”
FieldDescription
QuantityQuantity of material used (3 decimal places)
FieldRequiredDescription
Expense AmountYesDollar amount of the expense
Overhead AmountNoCalculated overhead amount (auto-computed based on cost category overhead factors; can be overridden)
FieldDescription
Debit GLThe GL account that will be debited for this expense
Credit GLThe GL account that will be credited for this expense
OH Debit GLOverhead debit GL account
OH Credit GLOverhead credit GL account

These are automatically determined based on the expense type and job type configuration and cannot be manually changed.

For Material-type expenses, an Allocation section appears below the GL accounts. This shows inventory reservations and allows you to select specific inventory locations to pick from for this material expense.

ButtonDescription
Recompute AmountsRecalculates expense and overhead amounts based on current field values
Auto-Allocate MaterialsAutomatically selects inventory allocations for material expenses
PostSubmit the expense and reset the form for a new entry
Post & Reuse JobSubmit the expense and keep the current job selected (useful for posting multiple expenses to the same job)

If material allocations cannot fully cover the required quantity, a dialog titled “Allocations Not Made” appears showing:

  • Product — the product with insufficient inventory
  • Needed — quantity required
  • Requested / Available — what was available

Click Acknowledge to proceed anyway or cancel and adjust.

Reversing a job expense creates offsetting GL entries that negate the original expense posting, effectively undoing the expense without deleting the audit trail.

Navigation: On the View Job screen, open the Job Expenses tab, then click the Reverse button (history icon) on the expense row.

FieldRequiredDescription
Posting DateYesThe date for the reversal GL entries. Must pass close-date validation.
  • Job must be open — expenses on closed jobs cannot be reversed.
  • The expense must not already be reversed (the button is disabled for already-reversed entries).
  • The expense must have a transaction log record.
  • User must have the reverseJobCostExpense permission.

The reversal creates four offsetting GL entries per expense:

  1. Debit GL — negative of the original expense amount
  2. Credit GL — the original expense amount (reversed direction)
  3. OH Debit GL — negative of the original overhead amount
  4. OH Credit GL — the original overhead amount (reversed direction)

For material expenses with inventory allocations, the reversal also reverses the inventory transaction, returning quantities to their original locations.

The original expense entry is marked as reversed with the reversal date and user. A new negative job cost entry is created as a mirror of the original.


In addition to reversing an expense, you can move an individual already-posted expense entry from one job to another directly from the Job Expenses tab. Transferring an expense reverses the original posting on the source job and creates a matching new posting on the destination job, so the expense is removed from the original job and added to the target job without losing the audit trail.

Navigation: On the View Job screen, open the Job Expenses tab, then click the Transfer Expense button (compare-arrows icon) on the expense row.

FieldRequiredDescription
Transfer To JobYesThe open job to move the expense to. Type to search jobs by ID; only open (not closed) jobs appear in the list.

Click Transfer to perform the move, or Cancel to close without changes.

  • The source job must be open — the Transfer Expense button does not appear on a closed job.
  • The expense must have a transaction log record and must not already be reversed (the button is disabled for already-reversed entries).
  • User must have the postJobCostExpense permission.
  • The destination job must be open. Selecting a closed job is rejected with “Cannot transfer to a closed job. Please select another Job.”
  • The destination job’s job type must have the same expense type as the entry being transferred. Otherwise the transfer is rejected with “Cannot transfer to a job who’s type does not have the same expense type.”

When you confirm a transfer:

  1. The original expense entry on the source job is marked as reversed (with the reversal date and the acting user recorded), and a mirroring negative job cost entry is created on the source job to offset it.
  2. A new job cost entry — copying the original expense’s amount, overhead, quantity, hours, category, vendor/employee/product, invoice number, date, and description — is created on the destination job, along with its own posting transaction and log records.
  3. For material expenses, the associated inventory transaction logs are carried over to the destination job’s posting.

The transfer is subject to close-date validation before it is posted.

Navigation: Job Costing → Post Job Materials

This screen allows bulk-posting of multiple material expenses against a job in a single transaction. It is more efficient than Post Job Expense when posting many material lines at once.

FieldRequiredDescription
DateYesTransaction date for all materials in this posting
JobYesThe job to post to (open jobs only)
Invoice NumberNoReference invoice number applied to all lines
Default Job Expense TypeNoPre-fills the expense type on new rows
Default Job Cost CategoryNoPre-fills the cost category on new rows

An inline-editable grid where each row is a material expense:

ColumnRequiredDescription
ProductNoThe material product
DescriptionNoFree-text description for this line
Job Expense TypeNoExpense type for this line (inherits default if set)
Job Cost CategoryNoCost category for this line (inherits default if set)
QuantityNoQuantity used (3 decimal places)
Expense AmountNoDollar amount (currency; aggregated in footer)
Overhead AmountNoOverhead amount (currency; aggregated in footer)
Row Actions (⋮)Per-row menu: Recompute Expense, Recompute Overhead, Delete
  • A new blank row is added automatically as you work through the grid.
  • The footer shows the sum of Expense Amount and Overhead Amount across all rows.

Shows inventory allocation details — which specific inventory locations will be drawn from when this posting is committed.

ButtonDescription
Auto-AllocateAutomatically selects inventory allocations for all material lines
PostCommit all material entries. Disabled until a job is selected.

Same as Post Job Expense — lists products with insufficient inventory. Click Acknowledge to proceed.


Navigation: Job Costing → Close Job, or via Actions → Close Job from a job

This screen finalizes a job by posting the closing GL distributions and locking the job from further changes.

FieldRequiredDescription
JobYesSearch for the job to close (by Job ID, customer name, or customer ID)
Close DateYesThe date of closing. The close form validates that this date is on or after the latest invoice and payment date on the job.

Once a job is selected, the following information is displayed:

FieldDescription
Contract Amount TotalTotal contract value including change orders
Contract DateDate of the original contract
Site AddressJob site address
Invoiced TotalTotal amount invoiced against this job
Last Invoice DateDate of the most recent invoice
Paid TotalTotal collected
Last Paid DateDate of the most recent payment
Closing Contract GLThe GL account that will receive the contract closing entry
Expense TotalTotal actual expenses posted to this job
Estimate TotalTotal estimated cost from the job estimate

Chips appear to flag issues before closing:

IndicatorColorMeaning
Expenses More Than EstimateYellow (warning)Total actual posted expenses (expense + overhead) exceed the estimated cost
Expenses Less Than EstimateGreen (success)Total actual posted expenses (expense + overhead) are at or below the estimated cost
Job Not Fully InvoicedRed (error)Revenue has not been fully billed
Invoices Not Fully PaidRed (error)Outstanding AR balance remains

If the job has not been fully invoiced or paid, a confirmation dialog appears: “This job has not been fully invoiced and/or paid. Do you still wish to close?” You can proceed or cancel.

TabDescription
Job ExpensesDetailed list of all expense entries that will be included in the close
GL DistributionsThe GL debit/credit lines that will be posted when the job is closed

Click Close Job to finalize. The button is disabled if the job is already closed.

Closed jobs can be reopened from Actions → Reopen Job on the View Job screen. Reopening reverses all of the closing GL distributions, allowing additional expense postings and billing changes.

What happens when a job is reopened:

  1. The system reverses every closing GL entry that was created when the job was closed — both expense closing entries and the contract amount closing entry.
  2. All reversal entries are posted to the “Reopen Job” subledger with the description “Reopening Job [Job ID]”.
  3. The job’s isClosed flag is set to false and the closedDate is cleared.
  4. The job returns to Open status, and all actions (Post Expense, Manage Estimates, Edit Job) become available again.

Prerequisites:

  • Job must be closed — the Reopen action is hidden when the job is already open.
  • User must have the reopenJob permission.
  • The reopen posts at the current date and runs through the standard GL close-date check. If that date falls in a closed GL period, the reopen is submitted to the head accountant for approval (or requires a password) before it can post.

Navigation: Job Costing → Settings

The settings screen organizes reference data into three tabs.

Displays and manages job type definitions. Requires jobType read permission to see this tab.

Grid Columns:

ColumnDescription
Job Type IDThe short code for this job type
NameFull name of the job type
Contract Credit GLContract credit ledger account assigned to this job type
Contract Closing Credit GLContract closing credit ledger account assigned to this job type
Estimates Include BurdenWhether labor burden is already pre-factored into this job type’s estimates
DisabledWhether this job type is currently inactive

Actions:

  • + — Create a new job type (requires jobType create permission)
  • Edit (pencil) — Modify an existing job type (requires jobType update permission; unavailable on disabled job types)
  • Enable (green checkmark) — Re-enable a disabled job type (requires jobType update permission; shown in place of Delete on disabled rows)
  • Delete — Remove a job type (requires jobType delete permission). If any jobs are associated with the type, it is set to disabled instead of deleted, and the message “There are existing/archived jobs associated with this type. Type has been set to disabled.” is shown.
  • Show/Hide Disabled toggle — Shows or hides disabled job types (disabled job types are hidden by default)

Click a job type row to open the Job Type View screen.

Create / Edit Dialog:

FieldRequiredDescription
IDYesThe short code for the job type. Must be unique across job types. Read-only after creation.
NameYesFull name of the job type.
Contract Credit GLYesOffset GL account debited for the total contract amount when the job is closed (paired with the Contract Closing Credit GL).
Contract Closing Credit GLYesGL account credited for the total contract amount when the job is closed.
Estimates Include BurdenNoMark this checkbox if labor burden is already pre-factored when creating estimates for jobs of this type. Defaults to off.

The Job Cost Entry Types tab on the Job Type View screen shows which expense types are available for jobs of this type.

Job cost entry types define the categories of expenses that can be posted to jobs (e.g., “Direct Labor”, “Overtime”, “Materials - Electrical”).

Grid Columns:

ColumnDescription
NameEntry type name
Cost TypeLabor, Material, Subs, or Other
DisabledWhether this entry type is currently inactive

Actions:

  • + — Create a new entry type
  • Edit — Modify an existing entry type
  • Enable (green checkmark) — Re-enable a disabled entry type
  • Delete — Disable (soft-delete) an entry type
  • Show/Hide Disabled toggle — Shows or hides disabled entry types

Create / Edit Dialog:

FieldRequiredDescription
NameYesEntry type name. Must be unique.
Cost TypeYesLabor, Material, Subs, or Other. Read-only after creation.

Job Type Detail — Associated Job Cost Entry Types

Section titled “Job Type Detail — Associated Job Cost Entry Types”

Navigation: Job Costing → Settings → Job Types tab → click a job type to open the View Job Type screen, then the Job Cost Entry Types tab.

The top card of the View Job Type screen shows the job type’s Job Type ID, Name, Contract Credit GL, and Contract Closing Credit GL. Below it, the Job Cost Entry Types tab is a full management surface that controls which cost entry types are available to jobs of this type and, for each one, which GL accounts are used when expenses are posted.

Each row associates one cost entry type (the catalog entries from the Job Cost Entry Types tab) with this job type and its own set of GL accounts. Only cost types that are not already associated with this job type are offered when adding a new association.

Grid Columns:

ColumnDescription
NameThe cost entry type’s name
Cost TypeThe cost type of the entry type (Labor, Material, Subs, or Other)
DebitThe Debit GL account used for the base expense posting
CreditThe Credit GL account used for the base expense posting
Closing DebitThe Closing Debit GL account for this association
Overhead DebitThe Debit GL account used for the overhead portion of the posting
Overhead CreditThe Credit GL account used for the overhead portion of the posting
Overhead Closing DebitThe Overhead Closing Debit GL account for this association
Use Job Specific BurdenWhether this association uses job-specific burden

Actions:

  • + (Create Associated Entry Type) — Add a new cost entry type association to this job type. Requires jobTypeJobCostEntryType create permission.
  • Edit (pencil) — Modify the GL accounts and burden flag of an existing association. Requires jobTypeJobCostEntryType update permission; disabled for disabled rows.
  • Enable (green checkmark) — Re-enable a disabled association. Requires jobTypeJobCostEntryType update permission.
  • Disable (trash) — Disable (soft-delete) an association so the cost type is no longer available for this job type. Requires jobTypeJobCostEntryType update permission.
  • Show/Hide Disabled toggle — Shows or hides disabled associations. By default disabled associations are hidden.

Create / Edit Dialog (titled “Create New Associated Job Cost Entry Type” or “Edit Associated Job Cost Entry Type”):

FieldRequiredDescription
Cost TypeYesThe cost entry type to associate. Only entry types not already associated with this job type appear in the list.
Debit GLYesGL account debited for the base expense amount
Credit GLYesGL account credited for the base expense amount
Closing Debit GLYesClosing Debit GL account for this association
Overhead Debit GLYesGL account debited for the overhead amount
Overhead Credit GLYesGL account credited for the overhead amount
Overhead Closing Debit GLYesOverhead Closing Debit GL account for this association
Should Use Job Specific BurdenNoCheckbox indicating whether this association uses job-specific burden

Job cost categories segment costs within a job for more granular reporting and overhead calculations.

Grid Columns:

ColumnDescription
Category IDShort code for this category
DescriptionFull category name
Material FactorOverhead multiplier applied to material costs (%)
Labor FactorOverhead multiplier applied to labor costs (%)
Subs FactorOverhead multiplier applied to subcontractor costs (%)

Actions: Create (+) and Edit (pencil) buttons.

Create / Edit Dialog:

FieldRequiredDescription
IDYesUnique category code. Read-only after creation.
DescriptionYesCategory name
Material FactorNoOverhead percentage applied to material expenses (2 decimal places)
Labor FactorNoOverhead percentage applied to labor expenses (2 decimal places)
Subs FactorNoOverhead percentage applied to subcontractor expenses (2 decimal places)

PermissionActionsDescription
jobcreate, read, update, deleteManage jobs
jobTypecreate, read, update, deleteManage job types. read gates viewing/selecting job types and seeing the Job Types settings tab; create, update, and delete gate adding, editing, and removing job types
jobCostEntryTypecreate, update, deleteManage job cost entry types
jobCostCategorycreate, update, deleteManage job cost categories
jobContractcreate, read, update, deleteManage job contracts and change orders
jobCostEstimatecreate, read, update, deleteManage cost estimates
jobCostEntrycreate, read, update, deletePost and view job expenses
postJobExpense (systemKey postJobCostExpense)Screen permission: access to the Post Job Expense screen
postJobMaterialsScreen permission: access to the Post Job Materials screen
closeJobScreen permission: access to the Close Job screen
reopenJobMisc permission: ability to reopen a closed job
viewAttachmentsMisc permission: view and upload job attachments
manageTagsMisc permission: view and manage job tags
jobCostShowRates (Job Cost Show Rates)Misc permission: shows the Regular/Overtime/Doubletime Hours columns on the Job Expenses grid and reveals the Expense Amount and Overhead Amount values for labor entries. Without it, those hours columns are hidden and labor expense/overhead amounts are blanked.

Example 1: Setting Up a New Job with Estimates

Section titled “Example 1: Setting Up a New Job with Estimates”

Scenario: Precision Mechanical wins a $125,000 HVAC installation contract for Greenfield Construction, Building C. Tom (Project Manager) sets up the job with a full cost estimate.

Step 1 — Create the job:

  1. Navigate to Job Costing → Manage Jobs and click +.
  2. Customer = Greenfield Construction, Site = Building C — 450 Industrial Pkwy.
  3. Job ID = J-1050, Project Name = HVAC Install — Building C.
  4. Job Type = Mechanical Install, Start Date = 03/01/2026, End Date = 06/30/2026.
  5. Retention % = 10%, Burden % = 12%, WIP Reportable = ✓.
  6. Click Create.

Step 2 — Create the contract:

  1. On the View Job screen, open the Contracts tab and click +.
  2. Amount = $125,000.00, Date = 02/15/2026 (the fields are labeled Amount and Date).
  3. Click Create.

Step 3 — Enter cost estimates:

  1. Navigate to Actions → Manage Estimates.
  2. Select Job = J-1050, Contract = Original Contract ($125,000).
  3. Enter estimates by category:
Cost CategoryMaterialLabor HoursLabor $SubsOtherTotal
Ductwork$18,000200$12,000$0$500$30,500
Equipment$35,00080$4,800$0$0$39,800
Controls$8,000120$7,200$5,000$0$20,200
Piping$6,000100$6,000$0$300$12,300
Estimate Total$67,000500$30,000$5,000$800$102,800
  1. Click Save Current Estimate.

Result: Job J-1050 is open with a $125,000 contract and $102,800 in estimated costs. Estimated margin = $22,200 (17.8%).


Example 2: Posting Mixed Expenses and Monitoring Health

Section titled “Example 2: Posting Mixed Expenses and Monitoring Health”

Scenario: Three weeks into Job J-1050, Tom reviews the job after posting labor, subcontractor, and material expenses.

Expenses posted so far:

DateTypeCategoryDescriptionAmount
03/05LaborDuctworkMike Torres — 40 reg hrs × $30/hr$1,200.00
03/05LaborDuctworkMike Torres — 8 OT hrs × $45/hr$360.00
03/10MaterialEquipment2 × Carrier RTU (from inventory)$14,200.00
03/12SubsControlsABC Controls — panel installation$4,800.00
03/15LaborPipingMike Torres — 32 reg hrs × $30/hr$960.00

Total actual cost to date: $21,520.00

Checking job health on the Dashboard tab:

  • Percent Complete: 17.2% (based on actual cost vs. estimated cost)
  • Actual Cost: $21,520.00
  • Estimated Cost: $102,800.00
  • CPI: budgeted cost of work performed ÷ actual cost = (percent complete × estimated cost) ÷ actual cost = 1.00 (green — at or above 1.0). Because percent complete is itself actual cost ÷ estimated cost, this metric stays pinned at 1.00 whenever cost has been posted
  • Actual Margin-to-Date: $21,500 - $21,520 = -$20 (essentially break-even at this early stage)
  • Forecast Final Cost: $102,800 (tracking to estimate)
  • Labor Burn Rate: 80 hours used ÷ 500 estimated = 16% (healthy)

Key observation: The subcontractor cost ($4,800) is tracking close to the $5,000 Controls subs estimate — Tom notes this may need a change order if additional controls work is required.


Scenario: Greenfield Construction requests additional ductwork that adds $15,000 to the contract. After completion, Tom closes the job.

Step 1 — Add the change order:

  1. On Job J-1050, open the Contracts tab and click +.
  2. Enter Description = “Additional return ductwork — floors 3-4” and Amount = $15,000.00, then check Is Change Order? and Customer Approved? (an unapproved change order does not count toward the total).
  3. Click Create.
  4. Total Contract Amount is now $125,000 + $15,000 = $140,000.00.

Step 2 — Enter change order estimates:

  1. Navigate to Actions → Manage Estimates.
  2. Switch to Job Contract = Change Order #1 ($15,000).
  3. Add estimate: Category = Ductwork, Material = $4,000, Labor Hours = 60, Labor $ = $3,600, Other = $200. Total = $7,800.

Step 3 — Post remaining expenses and invoice:

  • All work is completed. Final actual costs:
Cost TypeEstimatedActual
Material$71,000$68,500
Labor$33,600$35,200
Subs$5,000$4,800
Other$1,000$950
Total$110,600$109,450
  • All invoices sent and collected: $140,000 invoiced, $140,000 paid.

Step 4 — Close the job:

  1. Navigate to Actions → Close Job from the View Job screen.
  2. Close Date = 07/15/2026.
  3. Review summary:
    • Contract Total: $140,000.00
    • Invoiced: $140,000.00 ✓
    • Paid: $140,000.00 ✓
    • Expense Total: $109,450.00
    • Status: Expenses Less Than Estimate (green)
  4. Review the GL Distributions tab — closing entries look correct.
  5. Click Close Job.

Final margin: $140,000 - $109,450 = $30,550 (21.8%) — better than the original estimated margin of 17.8%.


Rules are grouped by category. Each rule has an ID for cross-referencing.

  • BR-JC-C1: Contract Before Estimate — The UI requires a contract with a contract amount before cost estimates can be entered.
  • BR-JC-C2: Close Date Floor — The close form validates that the job close date is on or after the most recent invoice and payment date.
  • BR-JC-C3: Closed Job Lock — Closed jobs prevent additional expense postings; reopening reverses the closing GL entries.
  • BR-JC-C4: Delete Job Prerequisites — A job can only be deleted when it is open. Closed jobs must be reopened before deletion.
  • BR-JC-A1: Overhead Calculation — When posting an expense, the application calculates overhead as Expense × (Category Factor ÷ 100), where the factor is the cost category’s per-type factor (Material Factor, Labor Factor, or Subs Factor). For labor, the job’s Burden % is used only as a fallback when the category’s Labor Factor is 0; a non-zero Labor Factor overrides the Burden %.
  • BR-JC-A2: CPI Dashboard — CPI (BCWP ÷ Actual Cost, where BCWP = Percent Complete × Estimated Cost) auto-calculates with color coding: green ≥ 1.0, yellow 0.9–1.0, red < 0.9.
  • BR-JC-A3: Forecast Projection — Forecast Final Cost auto-calculates from actual costs extrapolated against percent complete.
  • BR-JC-A4: Job Close GL Distribution — Closing a job auto-generates GL entries transferring costs to the contract closing account.
  • BR-JC-A5: Expense Reversal — Reversing a job expense creates offsetting GL entries (negative amounts) and marks the original entry as reversed. For material expenses, inventory quantities are returned to their original locations.
  • BR-JC-W1: Job Lifecycle — Create Job → Set Contract → Enter Estimates → Post Expenses → Invoice via AR → Close Job.
  • BR-JC-W2: Change Order Flow — Create Change Order → Set Amount → Enter Estimates → Expenses post against updated totals.
  • BR-JC-W3: Reopen Job Flow — Reopen reverses all closing GL entries → Job returns to Open → Post additional expenses or billing → Close again when done.
  • BR-JC-X1: AP Invoice to Job — Vendor invoice lines distributed to a job create job cost entries (Material, Subs) updating Actual vs. Estimate.
  • BR-JC-X2: Timesheet to Labor — Payroll timesheets allocated to a job create labor cost entries; employee rate × hours = labor expense.
  • BR-JC-X3: Inventory Material — Material picks/allocations from inventory create material cost entries on the job.
  • BR-JC-X4: Job Invoice to AR — Job billing milestones are invoiced through AR; invoice amounts appear in Billing & Collections.

Q: I can’t enter cost estimates — the Manage Estimates screen shows no contracts. The form requires a contract with a contract amount before estimates can be entered (BR-JC-C1). Navigate to the job’s Contracts tab and create a contract first, then return to Manage Estimates.

Q: Job close fails — “close date before latest invoice/payment.” The close form validates that the close date is on or after the most recent invoice and payment date (BR-JC-C2). Check the job’s Billing & Collections section for the latest dates and set the close date accordingly.

Q: I can’t post expenses to a job — it says the job is closed. Closed jobs prevent additional expense postings (BR-JC-C3). If you need to add expenses, use Actions → Reopen Job to unlock it. Note that reopening reverses the closing GL entries, so you’ll need to close again when done.

Q: The CPI is red (below 0.9) — what should I do? A CPI below 0.9 means actual costs are exceeding the budgeted cost of work performed by more than 10% (BR-JC-A2). Review the Actual vs. Estimate dashboard to identify which cost categories are over budget. Consider whether a change order is needed to increase the contract amount, or investigate cost overruns (labor inefficiency, material waste, unplanned subcontractor work).

Q: Overhead amounts seem too high on my job expenses. Overhead is calculated as Expense Amount x (Category Factor / 100) (BR-JC-A1). Check the overhead factors on the Job Cost Category — each category has Material, Labor, and Subs factors. Also check the job’s Burden %, which applies to all labor costs. If the factors are set incorrectly, update the category settings.

Q: A vendor invoice posted in AP isn’t showing on the job dashboard. Verify the invoice distribution lines in AP were allocated to the correct job and cost category (BR-JC-X1). The job field must be filled on the AP distribution line for the cost to appear in Job Costing’s Actual vs. Estimate.

Q: The “Not Fully Invoiced” warning appears when I try to close the job. This means the total invoiced amount is less than the contract amount. You can either send the remaining invoices before closing, or acknowledge the warning and proceed if the shortfall is intentional (e.g., a negotiated reduction).

Q: How do I reopen a closed job? Navigate to the View Job screen for the closed job and select Actions → Reopen Job. The system reverses all closing GL entries and returns the job to Open status (BR-JC-W3). Remember to close the job again after making your changes.

Q: How do I reverse a job expense? Open the View Job screen, go to the Job Expenses tab, and click the Reverse button (history icon) on the expense row. Enter a posting date and confirm. The system creates offsetting GL entries that negate the original expense (BR-JC-A5). The original entry remains for audit purposes but is marked as reversed.

Q: I can’t delete a job — the Delete button is disabled. Jobs can only be deleted when they are open (BR-JC-C4). If the job is closed, use Actions → Reopen Job first, then delete it. Also verify you have the job delete permission assigned to your role.


  1. Create the Customer in Accounts Receivable if not already on file.
  2. Navigate to Jobs → Create Job. Select the customer, site, and job type.
  3. Set Retention % and Burden % if applicable.
  4. Save. The job is now open.
  5. Navigate to Actions → Manage Estimates to enter the cost budget by category.
  6. Create the Contract from the Contracts tab.
  1. Open Manage Estimates (from the Actions menu or the main navigation).
  2. Select the job and then the contract to estimate.
  3. For each cost category, enter the expected Material Cost, Labor Hours, Labor Cost, Subs Cost, and/or Other Cost.
  4. The Estimate Total footer shows the running total.
  5. Click Save Current Estimate.
  1. Navigate to Post Job Expense.
  2. Select the job and a Job Expense Type with Cost Type = Labor.
  3. Select the Employee.
  4. Enter Regular Hours, Overtime Hours, and/or Doubletime Hours.
  5. The Expense Amount will be auto-computed; click Recompute Amounts if needed.
  6. Click Post or Post & Reuse Job to post and stay on the same job.

Use Post Job Materials when you have many products to post at once:

  1. Select the job and date.
  2. Set default Job Expense Type and Job Cost Category if most lines will share the same values.
  3. Add product rows in the Materials grid; the system auto-adds new rows as you work.
  4. Click Auto-Allocate to pull from available inventory.
  5. Click Post to commit all lines at once.

Use the Dashboard tab on the View Job screen to monitor:

  • CPI — anything below 1.0 means you are over budget
  • Over / Under Billing — a large negative number means you are billing behind your earned revenue
  • Forecast Margin — the projected final margin; compare to Estimated Margin to see margin erosion or growth
  • Cash Position — if negative, you have paid more in costs than you have collected
  1. Ensure all expenses are posted and all invoices are sent and collected.
  2. Navigate to Actions → Close Job from the View Job screen, or go to Close Job from the main menu.
  3. Review the GL Distributions tab to confirm the entries are correct.
  4. If the “Not Fully Invoiced” or “Invoices Not Fully Paid” warnings appear, resolve them first — or acknowledge the warning and proceed if appropriate.
  5. Click Close Job. The job is locked for further edits.
  6. If changes are needed after closing, use Actions → Reopen Job to unlock it.

Change orders are managed through the Contracts tab on the View Job screen. Each change order increases or decreases the total contract amount. After adding a change order contract, navigate to Manage Estimates and select the change order to add its cost estimates.

  1. Navigate to the View Job screen for the closed job.
  2. Click Actions → Reopen Job. The system reverses all closing GL entries and returns the job to Open status.
  3. Post any additional expenses or billing adjustments as needed.
  4. When finished, use Actions → Close Job to re-close and re-post the final GL distributions.
  1. Navigate to the View Job screen and open the Job Expenses tab.
  2. Find the expense entry you want to reverse and click the Reverse button (history icon).
  3. Enter the Posting Date for the reversal entries.
  4. Click Submit. The system creates offsetting GL entries and marks the original as reversed.
  5. For material expenses, inventory quantities are automatically returned to their original locations.

Each Job Cost Category has three overhead factors (Material, Labor, Subs). When you post an expense to that category, the application calculates an overhead charge:

Overhead Amount = Expense Amount × (Factor ÷ 100)

The overhead is posted to the overhead GL accounts defined on the expense type. This is useful for applying indirect costs (project management time, facility costs) to jobs proportionally without manual calculation.