> 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/reports.md).

# Reports

Reports answers the recurring questions — where the money came from, who owes you, and the paperwork you have to file.

Reports has two halves. **Explore** is for the questions you ask over and over about the business. **Filing documents** are the paperwork you have to produce for somebody else — payroll, the state, the tax return, a customer who wants a record of their year.

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

**Reports** sits just below Timesheets in the left navigation and is visible to company admins only. [Open Reports →](https://shortcutco.com/reports)

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-9627ac355a0a5af172d8cd84a103542af46418b0%2Freports-dock.png?alt=media" alt="Reports page with the five Explore reports and the four Filing documents cards"><figcaption><p>Explore for the questions you keep asking; Filing documents for the paperwork you hand to someone else.</p></figcaption></figure>

## Explore — the recurring questions

| Report                  | The question it answers                 | How it's measured                                                 |
| ----------------------- | --------------------------------------- | ----------------------------------------------------------------- |
| **Revenue**             | Where does the money come from?         | Completed · Invoiced · Collected                                  |
| **A/R Aging**           | Who owes, how much, and how long?       | As of today, aged from the due date                               |
| **Job Costing** 🔒      | Did each job make money?                | Visits completed in the period — the same math as Costs           |
| **Crew Scoreboard** 🔒  | What did each crew produce, day by day? | By visit date                                                     |
| **Estimate Conversion** | Which quotes become work?               | Estimates sent and won; close rate follows the estimates you sent |

Every report states how it's measured, because the same month is a different number depending on whether you're asking about work done, invoices sent, or money that actually landed. Revenue shows all three side by side rather than picking one for you.

At the top of each report two small chips say what you're looking at: the period (**For Sep 1 – 24**) and how it's measured (**Completed**, **Aged from due date**, **Sent + won**, **Completed work**). Hover a chip for the rule behind it.

Periods run on your company's local calendar days. **This week**, **This month**, **This quarter**, and **Year to date** run up to and including today; **Custom** lets you pick exact dates.

If Shortcut can't work a number out — no labor data yet, no estimates sent — it shows **Unavailable** rather than a zero.

🔒 **Job Costing** and **Crew Scoreboard** carry a lock mark: like everything in Costs, they're internal-only and never shown to workers or customers.

## How revenue is dated

Revenue has three measures, and each one lands on a different date.

| Measure       | What counts                                | The date it lands on                                            |
| ------------- | ------------------------------------------ | --------------------------------------------------------------- |
| **Completed** | Work your crews finished — invoiced or not | The moment the visit was marked complete, in your time zone     |
| **Invoiced**  | Lines on invoices you've issued            | The day the invoice was sent (or created, if it was never sent) |
| **Collected** | Payments received, less refunds            | The day the money arrived; a refund on the day it went through  |

The rules underneath:

* **Completed revenue follows the visit.** A visit your crew marks complete at 7:30 pm on August 31 counts in **August** — and so does that visit's line on the invoice.
* **Lines with no visit behind them keep their own date.** A line you added to an invoice by hand, or an older line whose visit has no completion time, counts on the date written on the line.
* **Draft invoices aren't invoiced yet.** The finished work on a draft already counts under **Completed**. It moves into **Invoiced** once you send the invoice.
* **Voided invoices count nowhere.**
* **Completed, not invoiced** — the strip under the totals when you're on Completed — is finished work with no invoice yet. It's already inside the Completed total. Click it to see each visit.

The Dashboard (**Revenue earned** and **Revenue paid**), the Costs month summary, and the weekly digest email use exactly these rules. The same period gives the same number everywhere.

Open any row to see the records behind it — each with its date, its source (invoice line, completed not invoiced, payment, or refund), and the customer. **Export list — CSV** downloads that list, with dates in your company's time zone.

{% hint style="info" %}
**Month totals shifted slightly in September 2026?** Shortcut used to date some invoice lines by the calendar day in UTC instead of your time zone, so a job finished on the evening of the last day of the month could land in the next month, and draft invoices counted as invoiced. Revenue near month edges now sits in the month the work was actually done. Your invoices weren't changed — only the month the revenue is counted in.
{% endhint %}

## Revenue by month

Choose **By month** in the Revenue report to get one row per month. The rows follow the **Range** you've picked and any filters you have on.

* **This month** gives one row. To compare months, choose **This quarter**, **Year to date**, or **Custom**.
* Filters stay on. If you clicked a service in **Revenue by service** on the Dashboard, the months show only that service.
* A month's row, the records behind it, and its CSV always add up to the same number.

### Monthly views saved before September 2026

Monthly revenue views saved before September 2026 showed your whole history, whatever range was saved with them, and they still open that way. You'll see this note above the report:

> This saved report preserves all monthly history through the selected period. **Use only the selected period**

The period chip reads **All history through Sep 24** — the last day of the saved range — and there's no comparison with a previous period.

Click **Use only the selected period** to see just the saved range. That changes what's on screen, not the saved view. To keep it that way, click **Save view** and save it under a new name.

If an older monthly view is on a schedule, its emails keep sending full history. To switch, schedule the newly saved view. There's no button yet to stop or change an existing schedule — email **<hello@shortcutco.com>** and we'll switch the old one off.

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-1a469c87229dee9624dede977d4d611ed5a45160%2Freports-revenue-history-mode.png?alt=media" alt="Revenue report by month showing the saved-history note and the Use only the selected period link"><figcaption><p>Monthly views saved before September 2026 keep their full history until you switch them.</p></figcaption></figure>

## Reading Job Costing

Job Costing answers "did this job make money?" one completed visit at a time (**By job**), or rolled up **By customer**, **By service**, or **By crew**. A visit belongs to the period it was **completed** in.

### Measured, estimated, and unavailable labor

Every visit's labor is one of three kinds:

| Labor           | Where it comes from                                                                                               |
| --------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Measured**    | Real time — Time Clock punches, the visit's recorded arrival and completion, or billed hours on an hourly service |
| **Estimated**   | No recorded time, so the visit's estimated duration (or the service's time per stop) stands in                    |
| **Unavailable** | No time to go on, or no labor rate to price it with. Shown as a dash — never $0                                   |

When some visits aren't measured, a line above the report says how many of each — **12 measured · 30 estimated · 2 unavailable.** — with a **Review labor costs and setup** link to Costs.

### The totals

| Tile             | What it means                                                                                                                                                           |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Revenue**      | What the visits in the report earned, with how many visits                                                                                                              |
| **Known labor**  | Measured plus estimated labor. Underneath: how many visits are measured, estimated, and unavailable — or, when Time Clock data is in use, how many came from clock data |
| **Materials**    | Material cost for the visits                                                                                                                                            |
| **Overhead**     | The visits' share of your overhead                                                                                                                                      |
| **Net profit**   | Revenue minus labor, materials, and overhead across **all** visits, using estimated labor where there's no recorded time. This matches **Net profit** on the Dashboard  |
| **Measured net** | The same, for **measured visits only**                                                                                                                                  |

If any visit's labor is unavailable, **Net profit** shows **Unavailable** rather than a total that's quietly missing labor. **Measured net** shows **Unavailable** when no visit in the report is measured.

### The columns

**Visits** (completed visits in the row), **Revenue**, **Materials**, and **Overhead** mean what they say. The others:

| Column                                           | What it shows                                                      |
| ------------------------------------------------ | ------------------------------------------------------------------ |
| **Job** (or **Customer**, **Service**, **Crew**) | What the row is. **By job** has one row per completed visit        |
| **Customer** and **Visit date**                  | By job only — whose visit it was, and the day it was scheduled for |
| **Labor**                                        | Measured plus estimated labor. A dash means none of it is known    |
| **Measured margin**                              | Margin from the row's measured visits only (see below)             |
| **Estimated visits**                             | Visits that used estimated labor                                   |
| **Measured**                                     | Measured visits out of the total — **3 of 5**                      |
| **Sq ft treated**                                | Shown if you track chemicals                                       |

**Measured margin** reads one of four ways:

* **A percentage** — the margin on the row's measured visits. A gray pill means fewer than 10 measured visits, so treat it as a small sample.
* **Estimate only** — every visit in the row used estimated labor, so there's no measured margin. Sort by this column and these rows go to the bottom.
* **42% before labor** — a single visit whose labor is unavailable, showing what's left after materials and overhead.
* **—** — nothing to measure.

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-94fd3a858f05d7dacf55aee012ac71bf782f5233%2Freports-job-costing-labor.png?alt=media" alt="Job Costing by job with Known labor, Net profit and Measured net tiles and an Estimate only row"><figcaption><p>Net profit uses estimated labor where time is missing; Measured net and Measured margin use recorded time only.</p></figcaption></figure>

### Visit date and completed date

A visit scheduled for Friday and finished on Monday has two dates, and Job Costing keeps both. Open a row to see its visits. Each one reads like **Visit 2026-08-29 · Completed 2026-09-01 · Mowing**, followed by the customer and the labor: **estimated labor $42**, **labor $38 · 1.5 h clock**, or **labor unavailable**. Click a visit to open that job on the customer's **Jobs** tab.

The CSV from that panel has separate **Visit date** and **Completed date** columns, in your company's time zone. Its **Labor basis** column says **Clock data**, **Recorded time**, **Estimated time**, or **Unavailable** for every visit.

## Reading Estimate Conversion

| Number           | What it counts                                                                                    |
| ---------------- | ------------------------------------------------------------------------------------------------- |
| **Active leads** | Leads that are open right now, with how many arrived in the last seven days (**4 new this week**) |
| **Quotes out**   | The value of estimates still waiting on an answer right now, with how many are open               |
| **Close rate**   | Of the estimates you **sent** in this period, the share that have been accepted so far            |
| **Value won**    | The total of estimates accepted in this period                                                    |
| **Median close** | The middle number of days from sending to acceptance, for estimates accepted in this period       |

The table breaks the same numbers down **By service** or **By salesperson** (whoever created the estimate): **Sent**, **Won**, **Close rate**, **Value won**, **Median close**.

**Sent** and **Won** count what happened in the period, each on its own date. An estimate sent in June and accepted in July is **Sent** in June and **Won** in July.

**Close rate** follows the estimates you sent instead. That same estimate counts toward June's close rate as soon as it's accepted, so June's close rate can still rise in July. Accepting an older estimate never counts toward this period's close rate, which is why it can't go over 100%.

**Active leads** and **Quotes out** are always today's numbers, whatever period you choose.

Filter by service and each estimate counts only the matching services. **Value won** includes only those services too.

Open a row to see the estimates won in the period, each with its accepted date and days to close.

## Filters, saved views, and exports

**Filters you're using show as chips** above the report — **Service: Weekly Lawn Mowing ×**, **Overdue: Over 60 days ×**. Click the chip to remove that filter. Filters usually come with you from elsewhere: click a service under **Revenue by service** on the Dashboard and the Revenue report opens filtered to it.

**Save view** keeps what you're looking at — the range, filters, sort, and columns — under a name any admin on your account can open. Pick it from the **Saved views** menu at the top of any report, or under **Saved views** on the Reports page. The menu shows which saved view you're on.

**CSV** and **PDF** download exactly what's on screen: same filters, same sort, same columns. Dates in downloads use your company's time zone.

On a phone, **Save view**, **Schedule**, **CSV**, and **PDF** are all available.

## Filing documents — the paperwork

These four are built to be printed, filed, and handed to someone.

### Payroll Punch Report

Every clock-in and clock-out pair, one row each: employee, date, in, out, hours. Subtotals for each workweek — on whichever day your week starts — then a total per employee and a grand total, with a reconciliation line at the bottom that adds up against the printed numbers.

It defaults to your last complete workweek, and you can set any range you want. It's built for handing to whoever runs your payroll, so it deliberately does **not** decide what's regular time and what's overtime. Those rules are yours.

Each row is marked if something about it needs a look:

* **Unpaired punch** — someone clocked in and never clocked out
* **Long pair, no break** — more than six hours straight with no break recorded
* **Entered late** — the punch was added after the fact
* **Worker edited** — the worker corrected their own punch
* **Edited after export** — the punch changed after you'd already exported it

Marks disappear once the exception behind them is resolved.

Needs **Time Clock** turned on. Until then the card shows **Set up time tracking**, which opens Timesheets, where you switch it on.

### Sales Tax Liability

Taxable revenue, exempt revenue, and tax collected for the period you're filing. Each invoice is split using the tax settings it was created with, so a rate change halfway through the year doesn't quietly rewrite last quarter. Voided invoices are left out of collected tax — you never collected it.

Scheduled deliveries always send the **last complete quarter**.

### Chemical Applications

State-ready application records: what was applied, where, when, by whom, and under which license. There's one row per product, from completed chemical records, including chemical services added to a single visit.

Shortcut saves the details with each record the moment it's completed: the applicator's license number, plus the product's name, EPA registration number, and type. So the document still prints what was actually applied after someone renews a license, a tech leaves, or a product is renamed in your catalog. Older records without a saved license use the applicator's current license number, marked **(current)**.

Each row is dated by the visit's scheduled day. A visit that was moved before its record was completed is filed under its new day.

Every row needs a date, a property, a product, an applied amount, an applicator, and a license number. Pesticide rows also need an EPA registration number. A row missing anything it needs blocks the export (see [When a document refuses to print](#when-a-document-refuses-to-print)):

* **Missing license number:** add it to the person in [Settings → Users](https://shortcutco.com/settings/users).
* **Anything else:** the banner's **Fix N rows ›** link takes you to Chemicals.

Fertilizers and other non-pesticide products don't have an EPA number, and that never blocks the export. Their rows show **n/a** in the PDF's EPA column; in the CSV that cell is blank, and a **Product type** column lets you filter.

The document needs chemical tracking turned on. Until then its card in Reports reads **Set up chemicals**, opening the document shows *Turn on chemical tracking first.*, and **CSV**, **Download PDF**, and **Schedule** stay unavailable. To turn it on, open **Settings → Operations → Chemicals** and switch the toggle beside the **Chemicals** title to **Enabled**. If you turn tracking off later, a scheduled delivery of this document fails instead of sending.

### Client Service Report

A clean record of visits and services for one customer, written to be sent to that customer. No costs, no margins, no internal notes.

Start by finding the customer. Type part of their name or company in **Find a customer** and click **Search**. Results come 50 at a time — use **Next 50** and **Previous** to page through. Then choose them from the **Customer** list, set **From** and **To**, and click **Apply**.

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-c0c6e8e1b1409a9a69758d7efc72a7b9cc2813bc%2Freports-client-service-customer-search.png?alt=media" alt="Client Service Report customer search with paging"><figcaption><p>Search by name or company, then page through results 50 at a time.</p></figcaption></figure>

## Opening and printing a document

Click **Open document** on a filing card in Reports. If the card shows **Set up time tracking**, **Review invoice settings**, or **Set up chemicals** instead, that's the setup the document needs first.

Set **From** and **To** — or keep the range it suggests — and click **Apply**. Then use **CSV** or **Download PDF**. The CSV and the PDF carry identical subtotals and totals, so you can hand either one over.

## When a document refuses to print

Some documents won't let you export a range that has holes in it. That's on purpose — a payroll document with a missing clock-out, or a chemical filing with a missing record, is worse than no document at all.

When that happens you'll see a red banner across the top of the document with a count and a link that reads **Fix 3 rows ›**. Click it, clear what it points at, and come back. The export unblocks itself.

The same rule applies to scheduled deliveries. If a scheduled send lands on a blocked range, the delivery is recorded as failed with nothing attached — you won't get a half-right document by email without knowing.

## Sending a report on a schedule

Any report or filing document can email itself. Click **Schedule** and choose:

* **Delivery** — **With Monday email**, **Daily at 6:00am**, **Monday at 6:00am**, or **Monthly on the 1st**
* **Recipients** — one or more email addresses, separated by commas
* **Formats** — **CSV**, **PDF**, or both

For an Explore report, save it first with **Save view**. The **Schedule** window asks which saved view to send. Filing documents schedule straight from the document (the **Schedule** button there is on desktop).

<figure><img src="https://2299783971-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOhi7KtJ4vY1pDKwWu5SV%2Fuploads%2Fgit-blob-ec15ffa9f4c2eb02c5716c90f2ae5c7381b2c824%2Freports-schedule-report.png?alt=media" alt="Schedule report window with the saved view, delivery, recipients and formats"><figcaption><p>Explore reports roll their saved range forward on each delivery.</p></figcaption></figure>

### Which dates a scheduled report covers

**Explore reports** keep the range you saved and roll it forward:

* **Daily** deliveries show the saved range up to and including yesterday. A "This month" view sent daily arrives as month-to-date through yesterday.
* **Weekly and monthly** deliveries send the last **completed** week, month, or quarter, whichever matches the view's range. A "This month" view sent every Monday arrives with the last full month.
* **Year to date** always runs through yesterday.
* **Custom** dates never move — the same range every time.
* **A/R Aging** is as of the day it's sent.
* In **Estimate Conversion**, **Active leads**, **Quotes out**, and "new this week" are current as of the delivery, not for a past date.

**Filing documents** always cover a complete period: yesterday for daily, the last full Monday–Sunday week for weekly (the last full workweek for the Payroll Punch Report), and the last full month for monthly. **Sales Tax Liability** always sends the last complete quarter.

Every schedule is listed under **Scheduled deliveries** on the Reports page with its latest result — **Sent**, **Failed**, or **Waiting for first delivery**. Failures are visible in Reports, never silent.

## Who can see Reports

Company admins. Other roles don't see the navigation item, and going to the address directly sends them back to their own home page.

## Related pages

* [Costs & Profitability](/readme/costs-and-profitability.md)
* [Timesheets & Time Clock](/readme/time-clock-and-timesheets.md)
* [Chemicals](/readme/chemical-tracking.md)
* [Sales tax](/readme/finances-invoices-and-payments/sales-tax.md)

<details>

<summary>Want a report that isn't here?</summary>

Click **Request a report** at the bottom of the Reports page, or email **<hello@shortcutco.com>**, and tell us the question you're trying to answer. What's above is the starting set, not the finished list.

</details>
