> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/readme/costs-and-profitability.md).

# Costs & Profitability

Log expenses, set labor rates, and see real margins on jobs and customers.

Costs turns Shortcut from "what did I bill?" into "what did I actually make?". Log what you spend, tell Shortcut what labor really costs, and margins show up across the app. [Open Costs →](https://shortcutco.com/costs)

{% embed url="<https://www.youtube.com/watch?v=i2A-AWUMhBE>" %}
Video: which jobs make money, by job, customer, and crew (2:00).
{% endembed %}

{% hint style="info" %}
**Everything here is internal-only.** Wages, costs, and margins are never shown to workers or customers.
{% endhint %}

## The three sections

* **Services** — what each service costs you to deliver; margins update as you change the numbers.
* **Costs & expenses** — log real spend and set budgets.
* **Chemicals & materials** — material costs for chemical work.

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-1b64c112cd6927143146c7995dcbd9cab5a25861%2Fcosts-workspace.png?alt=media" alt="Costs workspace with revenue split and margin cards"><figcaption><p>Costs shows where the money goes — and what's left.</p></figcaption></figure>

## Log an expense

1. Open **Costs** → **Costs & expenses**.
2. Click **Log expense**.
3. Pick a category — **Fuel, Vehicle, Equipment, Supplies, Insurance & comp, Software & phone, Other** — enter the amount and date, and optionally attach a note or photo of the receipt.

You'll see budgets vs. actuals per category and a six-month spend trend.

## Set your loaded labor rate

Your **loaded hourly rate** is what an hour of crew time *really* costs you — not just the wage, but the taxes, workers' comp, and overhead that ride on top of it, plus the drive time between stops. Set each employee's wage in [Settings → Users](/readme/configuration/workforce-users-+-roles-+-teams.md#users), then answer two questions in Costs: how much rides on top of wages, and how much of the day is windshield time. Owner-operators who don't take a wage can use owner mode, which puts a value on your own time instead.

## Measured and estimated labor

Every completed visit's labor is one of three kinds:

* **Measured** — real time: Time Clock punches, the visit's recorded arrival and completion, or billed hours on an hourly service.
* **Estimated** — the visit has no recorded time, so its estimated duration (or the service's time per stop) stands in.
* **Unavailable** — there's no time to go on, or no labor rate to price it with. Shortcut shows a dash, never $0.

Your headline profit numbers use measured labor where it exists and estimated labor where it doesn't. That covers **Net margin** here in Costs, **Net profit** on the Dashboard and in Job Costing, and the weekly digest. The Dashboard says so under the tile: *"Includes estimated labor when time is missing."*

[Job Costing](/readme/reports.md#reading-job-costing) in Reports shows the split:

* **Known labor**, with how many visits are measured, estimated, and unavailable
* **Net profit** for all visits, next to **Measured net** for measured visits only
* a **Measured margin** column for every job, customer, service, or crew

If some visits' labor is unavailable, Job Costing's **Net profit** reads **Unavailable** and this page shows the margin **before labor**, so you never see a total that's quietly missing labor. The usual fix is setting your labor rate (above) and giving each per-stop service a time estimate on the **Services** tab.

## Where your labor numbers come from

To price labor, Shortcut needs to know how many hours a job really took. By default it works that out from how long the visits ran, divided across the day.

If your crews use the [Time Clock](/readme/time-clock-and-timesheets.md), Shortcut uses real hours instead. On any day where **every person on the crew has a complete shift**, it prices that day's jobs using the hours they actually punched.

When that's happening, a small **Clock data** badge appears on the **Effective hourly rate** tile in Costs and on the Dashboard. Hover it to see how far it goes: *"Hours use recorded clock time on 14 of 20 crew-days; the rest use visit spans."* The route efficiency card also switches from **Default** to **Auto** and shows the math it used.

### Why it's all-or-nothing per day

A crew day only switches over when **everyone rostered that day** has a complete shift. One person missing means the whole day keeps the visit-based estimate. That's deliberate: half a crew's punches would make the day look like half the labor it really took, and every margin built on it would be too high.

{% hint style="warning" %}
**The most common reason a crew never switches over:** somebody on the crew never clocks in. An office manager or an owner listed on a crew who doesn't punch will hold that crew on estimates indefinitely. The **"N of M crew-days"** figure in the tooltip is how you spot it — if it's stuck near zero for one crew, check who's on the roster.
{% endhint %}

### What clock data doesn't change

* **Days with no punches keep the visit-based estimate.** Nothing goes to zero and no margin goes blank because a crew forgot to clock in.
* **A combined visit is still one visit's worth of labor.** If a crew does mowing and hedge trimming in one stop, the time on site is counted once, whether the hours came from the clock or from an estimate.
* **The twelve-month service margins** under **Revenue by service** on the Dashboard still come from how long visits ran, not clock data. Hover the "visits · 12 mo" line and it says so.

## Service margins are measured, never guessed

Shortcut shows a margin for a service only when it can actually **measure** it — from visits where that service was done on its own (or where a clean comparison exists). Each margin shows what it's based on: under each service in **Revenue by service** on the Dashboard you'll see **5 of 8 visits · 12 mo**.

If there isn't enough real data yet, you'll see a dash; hover it for *"Needs more single-service or comparable visits."* (If the blocker is a missing rate instead, it says *"Add a loaded hourly rate in Costs to measure margins."*) That's expected, not broken — as more visits complete, the margin fills in.

How service margins are counted:

* **Combined visits count labor once.** If a crew does mowing and hedge trimming in one stop, the hour on site is one hour of labor — not one hour per service.
* **Add-ons count toward their own service.** A hedge add-on's revenue shows under hedge trimming, not under mowing.
* **Products count toward the service they were sold under.** Three shrubs on a planting visit add their price and their cost to planting. See [Materials from products](#materials-from-products).
* **Service margins never use estimates.** A service's margin is either measured from real visits or not shown. (Your overall profit works differently — see [Measured and estimated labor](#measured-and-estimated-labor).)

{% hint style="info" %}
Numbers moved after an update? Labor on multi-service days used to be counted once per service; it's now counted once per visit. Margins on combined visits went **up** and labor totals came **down** — the new numbers are the accurate ones.
{% endhint %}

## Materials from products

Every service can carry a default material cost, which Shortcut uses as an allowance on each visit. When a visit has [products](/readme/products.md) on it (mulch, plants, a sprinkler head), Shortcut uses what those products actually cost you instead: quantity × unit cost for each product line. That **replaces** the service's default material cost for that visit. Visits without products keep using the default.

You can see which one a visit used in its **Cost breakdown** card (click the customer name in Dispatch to open the stop's detail panel). The **Materials** row says:

* **Materials · measured** — the cost came from the visit's products, with a note such as *"Materials from 2 product lines (replaces the service default of $12.00)"*.
* **Materials · modeled** — no products, so the service default applies (**Service default**).
* **Materials · incomplete** — at least one product on the visit has no unit cost.

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-43785d6fbfefaf6c3a688c6c57df46777f9418a4%2Fvisit-cost-breakdown-products.png?alt=media" alt="A visit&#x27;s Cost breakdown card in Dispatch with Revenue, Labor, a Materials · measured row noting materials from 2 product lines replacing the service default, Overhead and Net"><figcaption><p>A visit with products uses their real cost for materials.</p></figcaption></figure>

A product's price counts as revenue for the service it was sold under, and its cost counts as that service's materials. That's true here in Costs, in Job Costing, and on the customer's Profitability tab.

### When a product has no cost

A product line with no unit cost adds nothing to materials, so a margin built on it would look better than it is. Shortcut marks it incomplete instead:

* The top of Costs reads **Margin incomplete · 1 product line(s) missing cost**, with the known materials, labor and overhead underneath.
* **Net margin** says *"1 product line(s) missing cost"*.
* **Net profit** on the Dashboard reads **Incomplete**.
* Margin badges on estimates and visits say *"1 product line has no cost"*.

Known labor is still counted. To fix it, add the cost on the visit's product (Dispatch → stop detail → **Products** → **Edit**) before the visit's invoice goes out. To stop it happening, give every product a **Unit cost** in [Settings → Products](/readme/products.md#set-up-your-product-catalog) so new lines start with one.

{% hint style="info" %}
**Costs and the Dashboard agree on the month.** The revenue earned at the top of Costs and **Revenue earned** on the Dashboard are the same number for the same month (apart from the Dashboard's hourly refresh). Both use your company's local calendar days and count revenue when each visit was completed, just as Reports and the weekly digest do. See [How revenue is dated](/readme/reports.md#how-revenue-is-dated).
{% endhint %}

## Where margins show up

* **Dashboard** — **Net profit** with its margin (and links to your loaded rate, route efficiency, and per-stop overhead), **Effective hourly rate**, and **Revenue by service** with each service's margin.
* **Reports → Job Costing** — profit for every completed visit, or by customer, service, or crew, with measured and estimated labor side by side. See [Reports](/readme/reports.md#reading-job-costing).
* **Dispatch** — a stop's detail panel has a **Cost breakdown** card per service: revenue, labor, materials, overhead and net, estimated and actual.
* **Estimates** — each product line shows its margin as you build the estimate, and the estimate's margin includes the products, counted once.
* **Jobs page** — a small margin dot per job (green/yellow/red) so you can spot money-losers while scheduling. (Turn it off in Costs if you don't want it.)
* **Customer profile → Profitability tab** — revenue, costs, and margin for the last 12 months, month by month and visit by visit.

## Weekly digest

Shortcut emails you a **weekly cost & profit digest**: **Revenue earned**, **Revenue paid**, **Net profit**, and **Outstanding** for the week, plus customers who became at-risk or recovered, and a button to open your Dashboard. The numbers follow the same rules as the Dashboard — your local calendar week, revenue on the day the work was completed, and net profit that includes estimated labor where time is missing.

Change the day it arrives, or turn it off, in Costs.

<details>

<summary>Still stuck?</summary>

Email <hello@shortcutco.com> with a screenshot of the Costs section you're setting up.

</details>
