---
title: How Does Job Costing Work?
description: Compare planned and actual margin by location in Job Costing, see where labor, revenue, and supply dollars come from, and set up the numbers the report uses.
---

[Skip to content](https://support.cleansmarts.com/how-does-job-costing-work#main-content)

[![](https://support.cleansmarts.com/hs-fs/hubfs/cleansmarts_logo_white_med.png?width=320&height=110&name=cleansmarts_logo_white_med.png)](https://www.cleansmarts.com/)

Open main navigation

Close main navigation

- [Contact us](mailto:support@cleansmarts.com)

[Contact us](mailto:support@cleansmarts.com)

 How can we help you?

- There are no suggestions because the search field is empty.

1. [Clean Smarts Knowledge Base](https://support.cleansmarts.com/?hsLang=en-us)
2. [Web Portal](https://support.cleansmarts.com/web-portal?hsLang=en-us)
3. [Pay Rates and Job Costing](https://support.cleansmarts.com/web-portal?hsLang=en-us#pay-rates-and-job-costing)

# How Does Job Costing Work?

## Job Costing compares the margin you planned for each location with the margin that happened. The numbers come from the schedule, time clock, contracts, work orders, and invoices.

**Job Costing** answers one question for each facility location: did this account make the margin you planned? Each row rolls up the labor you scheduled, the time people clocked, the contract and work-order prices you expected, the invoices you issued, and a narrow slice of supply cost.

The page is a report. There is nowhere on **Job Costing** to type a revenue amount, a labor budget, or a supply budget. When a column is blank or $0, change the schedule, contract, work order, pay rate, or invoice that feeds that column, then come back to the report.

Use it when you want to know which accounts are paying for themselves and which ones need a staffing, pricing, or billing look. A question about who worked, or whether hours matched the service agreement, starts in **Budget to Actual** instead.

**Applies to:** Expert plan. Open it from **Accounting → Job Costing**, or press **Ctrl/Cmd + K** and search for **Job Costing**. Your role needs **Manage Account**, **Costs**, or **Revenue**. **Costs** and **Revenue** are Expert modules.

- **Costs** shows labor and supply cost.
- **Revenue** shows contract, work-order, and invoice revenue. It also shows the **Revenue** tab on a location, which is where you enter the contract.
- **Budget Margin**, **Actual Margin**, **Healthy Locations**, and **Charts & Analysis** appear only when the role has both **Costs** and **Revenue**.

**Manage Account** can open the page. It does not, by itself, show cost or revenue columns. Add **Costs**, **Revenue**, or both to the role that should read the report.

---

### Before You Start

Set these up before you judge a location. A missing setup leaves the matching column at $0, and the location can look healthier or worse than it is.

- On each shift or inspection, open **Budget** and set **Budgeted cleaners per shift** and **Budgeted labor rate**. Fill in start and end times. A shift with a blank start or end time is skipped for **Budget Labor**.
- On each work order, set the same **Budget** fields, set **Start Date**, and fill in start and end times. Enter **Price** and **Quantity** under **Services** and **Supplies** when that work should count as budgeted revenue.
- Give employees a pay rate on **Time & Pay** so clocked time has a dollar cost. Pay rates show when the role includes **Costs**.
- On the location's **Revenue** tab, create a contract. Set **Billing date day of month** and **Monthly revenue amount**. The **Revenue** tab is hidden until the role has **Revenue**.
- Create invoices with an **Invoice Date** inside the range you plan to review, tied to that location's contract or work order.

**Budgeted cleaners per shift** is counted as a whole number. A value of `2.5` is counted as `2`.

**Pay users the budgeted labor rate** does not change **Budget Labor**. Turn it on when people clocked into that shift or work order should be paid the budgeted rate. That rate is stored on the time entry and used for **Actual Labor**.

**Hold to budget** keeps the budgeted headcount in line when you change the shift length. Job Costing still uses the cleaner count and labor rate saved on the shift.

A **Default pay code** multiplies **Budgeted labor rate** by that pay code's rate multiplier when Clean Smarts builds **Budget Labor**. With no pay code, the multiplier is 1.

---

### Set Up the Numbers Job Costing Uses

#### Budget the shift or inspection

1. Open **Manage Locations** from your profile menu, or press **Ctrl/Cmd + K** and search for the location.
2. Open the location, then **Shifts & Inspections**.
3. Open a shift or inspection and expand **Budget**.
4. Set **Budgeted cleaners per shift** and **Budgeted labor rate**.
5. Confirm the start and end times are filled in, then save.

For each day that shift occurs inside the dates you select, Clean Smarts multiplies scheduled hours by the cleaner count, then by the budgeted rate (and by the pay code multiplier, when a **Default pay code** is set). Hours that cross midnight are split using your company's work-week start time. Only the portion that lands on a day in the range is counted.

#### Budget the work order

1. Open the work order.
2. Set **Start Date**, and fill in start and end times on the schedule.
3. Expand **Budget** and set **Budgeted cleaners per shift** and **Budgeted labor rate**.
4. Under **Services**, enter **Price** and **Quantity**. **Ext. Price** is **Price** × **Quantity**.
5. Under **Supplies**, set **Price** and **Quantity**. Adding a supply fills **Price** from the catalog **Rebill to Customer** amount. Change **Price** when this work order should bill a different amount. A **Price** of 0 falls back to that catalog amount.
6. Save the work order.

**Budget Labor** for that work order counts only when **Start Date** falls inside the dates you selected. Clean Smarts then adds the scheduled occurrences that also fall in that same range.

**Budget Revenue** adds the work order's **Services** and **Supplies** extended prices once, as a single amount, when **Start Date** is inside the range. It does not repeat that price on later visits. A work order with blank start or end times can still add that price. It does not add **Budget Labor**.

The **Cost** and **Ext. Cost** columns on **Services** and **Supplies** stay off Job Costing. They are not **Budget Labor** and they are not **Budget Supplies**.

#### Set the contract

1. Open the location.
2. Open **Revenue**. If you do not see **Revenue**, add the **Revenue** module to the role.
3. Click **Create Contract**.
4. Enter a description, **From date**, and **Thru date**. Leave **Thru date** empty when the contract does not end.
5. Set **Billing date day of month** (1–31) and **Monthly revenue amount**.
6. Click **Create Contract**.

For the dates you select, Clean Smarts adds **Monthly revenue amount** once for each billing day that falls inside both the range and the contract's **From date** / **Thru date**. A contract with a $0 **Monthly revenue amount** is skipped. If the billing day is past the last day of a short month, that month uses the last day instead. **Last 90 Days** can include two or three billing days, so budgeted contract revenue can be two or three times the monthly amount. **This Week** often includes none, so **Budget Revenue** stays $0 until you pick a range that contains the billing day. **This Month** and **Last Month** are the ranges to use when you are checking the contract.

If **From date** is in the past, Clean Smarts opens **Retroactive Invoices** and asks whether to create paid invoices for past billing dates. Those invoices count as **Actual Revenue** on their **Invoice Date**. Skipping them leaves **Actual Revenue** at $0 for those past dates even when **Budget Revenue** includes the monthly amount.

#### Set pay rates and invoices

1. Open the employee, then **Time & Pay**, and add a pay rate that covers the dates you will review.
2. Create invoices for the location with an **Invoice Date** inside that range.

**Actual Revenue** includes an invoice when the **Invoice Date** is in the range and the invoice is tied to that location in one of these ways:

- The invoice is tied to the location's contract. Clean Smarts adds the invoice total.
- An invoice line is tied to a work order at the location. Clean Smarts adds those lines.
- The invoice itself is tied to a work order and its lines are not. Clean Smarts adds the invoice total.

Unpaid invoices count. Deleted invoices do not. An invoice on the location that is not tied to a contract or a work order stays off the row. Approving a timesheet does not change **Actual Labor** or **Actual Revenue**.

---

### Read the Page

The report opens on **This Week**. **This Week** follows your company's work-week start day and workday start time. There is no custom date range and no pay-period list.

Presets:

- **Today**
- **Yesterday**
- **Last 7 Days**
- **Last 30 Days**
- **Last 90 Days**
- **This Week**
- **Last Week**
- **This Month**
- **Last Month**

1. Choose a preset. Use **This Month** or **Last Month** when you are checking contract revenue.
2. Filter by location or group, or leave **All Locations** selected. You only see locations your user can access.
3. Read the cards at the top. They count the locations loaded for the current dates and location or group filter.
4. Open **Contribution Margin** for revenue, cost, margin, variance, and a **Status** badge. Open **Cost Breakdown** when you need labor and supplies in separate columns. Open **Charts & Analysis** for the charts.
5. Switch **Display values as:** between **$** and **%**. The dollar columns stay in dollars. **%** changes the variance columns. A percent shows **N/A** when that budget base is $0.
6. Search matches the location name. The **Customer** column is the location name.

The table is one row per facility location. It does not show a separate row per shift, work order, or employee. Clicking a row does not open the underlying time or schedule. A location with none of the items Job Costing counts in the selected dates is left off the report. The table then says **No jobs found**.

---

### Cards and Status

Click a card to filter the table:

- **Total Locations** clears the status filter.
- **Healthy Locations** keeps locations where actual cost is at or under budget and actual revenue is at or over budget. This card appears when you can see both revenue and cost.
- **Cost Over Budget** keeps locations where actual cost is over budget.
- **Revenue Under Budget** keeps locations where actual revenue is under budget.

**Margin Variance** is the locations loaded for the current dates and location or group filter, taken together. It is actual margin minus budget margin across those locations. That card does not filter the table. A search or a status filter does not change it. Green means the loaded locations finished above the margin you planned. Red means they finished below it.

A location can match more than one card. **Critical** means both over cost and under revenue, so it counts in **Cost Over Budget** and **Revenue Under Budget**. The card percentages can add up to more than 100% because of that overlap.

Status badges on **Contribution Margin**:

- **Healthy** — actual cost is at or under budget, and actual revenue is at or over budget
- **Over Cost** — actual cost is over budget
- **Under Revenue** — actual revenue is under budget
- **Critical** — both of those are true

That split tells you what to review:

- **Over Cost** is a labor or supply conversation.
- **Under Revenue** is a billing conversation. Invoices in the period are below the contract and work-order prices you planned.
- **Critical** is both. Review those accounts first.

---

### Contribution Margin

On **Contribution Margin**, each location shows the columns your role can see.

- **Budget Revenue** and **Actual Revenue** require **Revenue**.
- **Budget Cost** and **Actual Cost** require **Costs**.
- **Budget Margin** and **Actual Margin** require both.

The math:

- **Budget Cost** is **Budget Labor** plus **Budget Supplies**. **Budget Supplies** is $0, so **Budget Cost** matches budget labor.
- **Actual Cost** is **Actual Labor** plus **Actual Supplies**.
- **Budget Margin** is **Budget Revenue** minus **Budget Cost**.
- **Actual Margin** is **Actual Revenue** minus **Actual Cost**.
- **Variance**, when you can see both revenue and cost, is actual margin minus budget margin. A positive variance means the location finished above the margin you planned. A negative variance means it finished below that plan.
- With only **Revenue**, variance is actual revenue minus budget revenue.
- With only **Costs**, variance is budget cost minus actual cost, so a positive variance means cost came in under the plan.

Green is a favorable variance. Red is an unfavorable one. In **%** mode, the percent is the variance divided by the absolute value of the budget base: budget margin when you can see both, budget revenue when you can see only revenue, or budget cost when you can see only cost.

---

### Where the Dollars Come From

#### Budget Labor

**Budget Labor** is the cost of work you scheduled in the date range.

Clean Smarts includes:

- Shifts that occur on a day in the range
- Inspections that occur on a day in the range
- Work orders whose **Start Date** falls inside the range, for the days they occur in that same range

For each occurrence it multiplies scheduled hours by **Budgeted cleaners per shift**, then by **Budgeted labor rate**, then by the **Default pay code** multiplier. Deleted shifts and deleted work orders are skipped.

#### Actual Labor

**Actual Labor** is the pay cost of time people clocked at the location.

Clean Smarts includes every time entry that is not deleted and whose work date falls in the range. That covers shifts, inspections, work orders, and time clocked at the location with no shift. Timesheet approval is not required.

The cost is:

- Regular hours × the pay rate on the time entry
- Overtime hours × the weighted pay rate × 1.5
- Double-time hours × the weighted pay rate × 2

That amount is the employee's pay cost. Employer taxes, benefits, burden, overhead, and equipment stay off the row.

A work order that started before the dates you selected can still add **Actual Labor** when people clock time in the range. It does not add **Budget Labor** or the work order's **Price** for those later visits.

#### Budget Revenue

**Budget Revenue** is planned income for the location in the date range.

It comes from two places:

- The location contract on the **Revenue** tab, once for each billing day in the range, as described above
- **Price** × **Quantity** on the work order **Services** and **Supplies** sections, once, when the work order **Start Date** falls inside the range

#### Actual Revenue

**Actual Revenue** is invoiced income whose **Invoice Date** falls in the range, for invoices tied to the location's contract or to a work order at the location. Unpaid invoices count. Deleted invoices do not.

#### Supplies

On **Cost Breakdown**, **Budget Supplies** is $0.

**Actual Supplies** is inventory cost recorded when quantity on a work-order supply changes. Using or removing quantity that is still on hand adds that cost. Putting quantity back reduces it. A $0 unit cost adds nothing.

These stay off **Actual Supplies**:

- The supply list on the location, **In Stock**, and catalog cost
- **Rebill to Customer** on the supply itself
- Fulfilling or delivering a supply request
- Receiving a purchase order
- **Cost** and **Ext. Cost** on the work order

Because **Budget Supplies** is $0, **Supplies Variance** equals **Actual Supplies**. Any of that supply cost shows as over budget.

---

### Cost Breakdown

Open **Cost Breakdown** when the role includes **Costs**. The columns are:

- **Budget Labor** and **Actual Labor**
- **Labor Variance**
- **Budget Supplies** and **Actual Supplies**
- **Supplies Variance**
- **Total Cost Variance**

On this tab, variance is actual minus budget. Green means actual cost is at or under budget. Red means actual cost is over budget. In **%** mode, the percent is that variance divided by the budget for the same column. **N/A** means the budget for that column is $0, which is always true for supplies.

**Total Cost Variance** is **Actual Cost** minus **Budget Cost**.

---

### Charts & Analysis

**Charts & Analysis** appears when the role has both **Costs** and **Revenue**.

- **Margin Contribution by Customer** is a bar chart of **Budget Margin** and **Actual Margin** for each location in the loaded set.
- **Work Order Status Distribution** counts locations by status (**Healthy**, **Over Cost**, **Under Revenue**, **Critical**). The slices are locations, not individual work orders.

A card filter or a search changes the table. The charts stay on every location loaded for the current dates and location or group filter.

---

### What This Margin Leaves Out

Job Costing is location contribution margin for the dates you select. It is a management view of the account.

These amounts stay off the row:

- Employer taxes, benefits, burden, overhead, and equipment
- Sub-locations and assets. The report lists facility locations only. Time, shifts, and work orders on a sub-location or asset are not added to the parent location.
- The supply list, purchase orders, and supply-request deliveries, except inventory cost recorded against a work order
- A recurring work order's **Services** and **Supplies** price on visits after the **Start Date**, and that work order's **Budget Labor** when **Start Date** is before the dates you selected

Later visits can still add clocked time, invoices, and work-order supply cost.

---

### Job Costing and Budget to Actual

The two reports answer different questions.

**Budget to Actual** compares budgeted, assigned, and actual hours and labor by person or location. Use it when you want to know who worked, whether staffing matched the service agreement, and whether labor rates ran above the budgeted rate. Open it from **Time Tracking → Budget to Actual**.

**Job Costing** compares revenue, cost, and margin for the location as a whole. Use it when you want to know whether the account made the margin you planned.

A labor-allocation or payroll question starts in **Budget to Actual** or **Time Detail**. An account-margin question starts in **Job Costing**.

---

### If a Number Looks Wrong

**I can't add or edit the numbers on Job Costing.** The page does not have entry fields. Update the shift, inspection, work order, contract, pay rate, or invoice that feeds the column, then reload the report.

**I don't see revenue columns, or the location has no Revenue tab.** The role needs **Revenue**. **Costs** alone shows labor and supplies. **Budget Margin**, **Actual Margin**, **Healthy Locations**, and **Charts & Analysis** need both modules. **Revenue** and **Costs** are on the Expert plan. Ask an administrator to add the module, then sign out and back in.

**Budget Revenue is $0.** Open the location, then **Revenue**, and confirm **Monthly revenue amount** is greater than zero and the contract covers the dates you selected. Then confirm the **Billing date day of month** falls inside that range. **This Week** often misses the billing day. Switch to **This Month** or **Last Month**. For a work order, confirm **Start Date** is inside the range and **Services** or **Supplies** has a **Price** and a **Quantity**.

**Budget Revenue looks like two or three months.** A longer preset, such as **Last 90 Days**, adds **Monthly revenue amount** once for every billing day in the range.

**Budget Labor is $0.** Open the shift, inspection, or work order and confirm **Budgeted cleaners per shift**, **Budgeted labor rate**, and start and end times. For a work order, **Start Date** also has to fall inside the dates you selected. A work order that started earlier does not add budgeted labor for later visits.

**Actual Labor is $0 but people clocked in.** Confirm the time entry's work date is inside the range and the location filter includes that site. A $0 pay rate produces a $0 cost. Approving the timesheet does not change this column.

**A work order's price is missing on a later visit.** **Budget Revenue** includes that work order's **Services** and **Supplies** price when **Start Date** is inside the dates you selected. A later visit does not add the price again. Clocked time on that visit can still show in **Actual Labor**.

**Actual Revenue is missing an invoice.** Confirm the **Invoice Date** is inside the range and the invoice is tied to that location's contract or work order. An invoice that is only sitting on the location, with no contract and no work order, is left off. If you created a contract with a past **From date** and declined **Retroactive Invoices**, past billing dates have budgeted revenue and no matching invoice.

**Actual Supplies ignores deliveries.** Deliveries, purchase orders, and **In Stock** edits on the location supply list stay off this column. Supply cost is added when quantity on a work-order supply is used or removed while quantity is still on hand. **Budget Supplies** stays $0, so that cost shows as over budget.

**A location is missing.** Job Costing lists facility locations that have schedule, time, contract, invoice, or work-order supply activity in the selected dates. Sub-locations and assets are omitted. Clear the location or group filter, and confirm your user is assigned to that location.

**You wanted hours by person.** Open **Time Tracking → Budget to Actual**. Job Costing stays at the location margin.

---

### Related Articles

- [How do I use the budget-to-actual report?](https://support.cleansmarts.com/how-do-i-use-the-budget-to-actual-report?hsLang=en-us)
- [How are pay rates applied to an employee's time?](https://support.cleansmarts.com/how-are-pay-rates-applied-to-an-employees-time?hsLang=en-us)
- [How Do I Set Up Pay Codes?](https://support.cleansmarts.com/how-do-i-set-up-pay-codes?hsLang=en-us)
- [How do I add a new user?](https://support.cleansmarts.com/how-can-i-add-a-new-user?hsLang=en-us)
- [What does each of the user modules do?](https://support.cleansmarts.com/what-does-each-of-the-user-modules-do?hsLang=en-us)

- [Getting started](https://support.cleansmarts.com/getting-started?hsLang=en-us)
- [Mobile App](https://support.cleansmarts.com/mobile-app?hsLang=en-us#main-content)

    - [Getting Started](https://support.cleansmarts.com/mobile-app?hsLang=en-us#getting-started)
    - [Timekeeping](https://support.cleansmarts.com/mobile-app?hsLang=en-us#timekeeping)
    - [Geofences](https://support.cleansmarts.com/mobile-app?hsLang=en-us#geofences)
    - [Shifts, Jobs & Work Orders](https://support.cleansmarts.com/mobile-app?hsLang=en-us#shifts-jobs-work-orders)
    - [Checklists, Tasks, and Scan Points](https://support.cleansmarts.com/mobile-app?hsLang=en-us#checklists-tasks-and-scan-points)
    - [Issues and Service Requests](https://support.cleansmarts.com/mobile-app?hsLang=en-us#issues-and-service-requests)
    - [Inspections](https://support.cleansmarts.com/mobile-app?hsLang=en-us#inspections)
    - [Supplies](https://support.cleansmarts.com/mobile-app?hsLang=en-us#supplies)
    - [Messaging and Notifications](https://support.cleansmarts.com/mobile-app?hsLang=en-us#messaging-and-notifications)
    - [Manager Features](https://support.cleansmarts.com/mobile-app?hsLang=en-us#manager-features)
    - [Offline, Sync & Troubleshooting](https://support.cleansmarts.com/mobile-app?hsLang=en-us#offline-sync-troubleshooting)
    - [Profile and Help](https://support.cleansmarts.com/mobile-app?hsLang=en-us#profile-and-help)
    - [Training](https://support.cleansmarts.com/mobile-app?hsLang=en-us#training)
- [Web Portal](https://support.cleansmarts.com/web-portal?hsLang=en-us#main-content)

    - [Checklists, Tasks, and Scan Points](https://support.cleansmarts.com/web-portal?hsLang=en-us#checklists-tasks-and-scan-points)
    - [Users](https://support.cleansmarts.com/web-portal?hsLang=en-us#users)
    - [Custom Fields](https://support.cleansmarts.com/web-portal?hsLang=en-us#custom-fields)
    - [Geofences](https://support.cleansmarts.com/web-portal?hsLang=en-us#geofences)
    - [Inspections](https://support.cleansmarts.com/web-portal?hsLang=en-us#inspections)
    - [Issues and Service Requests](https://support.cleansmarts.com/web-portal?hsLang=en-us#issues-and-service-requests)
    - [Locations and Sub-locations](https://support.cleansmarts.com/web-portal?hsLang=en-us#locations-and-sub-locations)
    - [Messaging](https://support.cleansmarts.com/web-portal?hsLang=en-us#messaging)
    - [Pay Rates and Job Costing](https://support.cleansmarts.com/web-portal?hsLang=en-us#pay-rates-and-job-costing)
    - [Shifts and Scheduling](https://support.cleansmarts.com/web-portal?hsLang=en-us#shifts-and-scheduling)
    - [Supplies](https://support.cleansmarts.com/web-portal?hsLang=en-us#supplies)
    - [Time and Attendance](https://support.cleansmarts.com/web-portal?hsLang=en-us#time-and-attendance)
    - [Translation](https://support.cleansmarts.com/web-portal?hsLang=en-us#translation)
    - [Work Orders](https://support.cleansmarts.com/web-portal?hsLang=en-us#work-orders)
    - [Assets and Equipment](https://support.cleansmarts.com/web-portal?hsLang=en-us#assets-and-equipment)
    - [Billing and Subscriptions](https://support.cleansmarts.com/web-portal?hsLang=en-us#billing-and-subscriptions)
    - [Integrations](https://support.cleansmarts.com/web-portal?hsLang=en-us#integrations)
    - [Payroll](https://support.cleansmarts.com/web-portal?hsLang=en-us#payroll)
    - [Quality](https://support.cleansmarts.com/web-portal?hsLang=en-us#quality)
- [Customer Portal](https://support.cleansmarts.com/customer-portal?hsLang=en-us#main-content)

    - [Getting Started](https://support.cleansmarts.com/customer-portal?hsLang=en-us#getting-started)
    - [Completed Work](https://support.cleansmarts.com/customer-portal?hsLang=en-us#completed-work)
    - [Quality](https://support.cleansmarts.com/customer-portal?hsLang=en-us#quality)
    - [Service Requests](https://support.cleansmarts.com/customer-portal?hsLang=en-us#service-requests)
    - [Messages](https://support.cleansmarts.com/customer-portal?hsLang=en-us#messages)
    - [Supplies](https://support.cleansmarts.com/customer-portal?hsLang=en-us#supplies)
    - [Notifications](https://support.cleansmarts.com/customer-portal?hsLang=en-us#notifications)

[![](https://support.cleansmarts.com/hs-fs/hubfs/cleansmarts_logo_white_med.png?width=320&height=110&name=cleansmarts_logo_white_med.png)](https://www.cleansmarts.com/)

<https://www.linkedin.com/company/25431328/admin/feed/posts/?feedType=following> <https://www.instagram.com/cleansmarts/> <https://www.facebook.com/CleanSmarts> <https://www.youtube.com/playlist?list=PLfEnuG6Zr4hr12qZosZi5vZ3yA_0YEjce>

Copyright © 2026, Clean Smarts