The report: CapEx, OpEx and cost

The Report tab (/timesheet/report) rolls the same inferred hours behind the Timesheet grid into a CapEx/OpEx split suitable for finance — totals, a per-bucket chart, an optional group-by, an estimated dollar cost, and a leaderboard of the epics that consumed the most time.

deckgauge · Timesheet · Report
Capitalizable costBlended rate
$14.2k of $22.6k total · 63% CapEx$75/h
CapExOpExUnclassified
190h112h18h

Capitalizable cost, the CapEx/OpEx split, and the blended rate.

What it does, and where the data comes from

The report runs the same status-span engine as the grid, grouping every span's seconds by classification instead of by person. Totals gives CapEx/OpEx/Unclassified seconds and a CapEx percentage for the window; by bucket feeds the stacked chart across the period; by group (Team / Role / Person) breaks the split down a level further, each with its own CapEx percentage and cost.

How a row's classification is decided

Every issue resolves to exactly one of CapEx, OpEx, or Unclassified:

  1. Its own classification, if the row on the board has been set.
  2. The nearest classified ancestor — if the issue itself is unset, the engine walks up its epic/parent chain and inherits the first classification it finds.
  3. Unclassified — no classification anywhere in the chain.

How to populate CapEx/OpEx

Classification is set on the board, not in the timesheet. Every row has a Classification column with three values: , CapEx, OpEx. Setting it on one row's dropdown patches that project; setting it while multiple rows are selected fans the same value out to every selected row in one action — the fastest way to classify a whole epic's worth of issues at once. See system and custom fields for the column itself.

The blended-rate cost layer

Hours become a dollar figure through a single editable blended hourly rate (default $75/h) — one fully-loaded rate for the whole org, not a per-person salary lookup. Cost = hours × rate, computed identically for the hero total, the stat cards, and the by-group cost column. The rate is persisted in the browser and is a deliberate estimate, not a computed figure — treat every dollar amount here as directional.

Top epics

Below the totals, a ranked leaderboard shows the epics developers spent the most in-progress time on, over its own trailing window (Last 6/12/24 months, or Year to date — independent of the report's week/month/year navigator). Each row is colour-coded by its dominant classification, links to the epic in its source system when a URL is known, and expands to a per-developer breakdown. The list is server-paginated at 25 epics per page — a large org can run 500+ epics — so "Showing 1–25 of N" and Prev/Next reflect a real offset/limit query, not a client-side slice.

What an empty report means

No org tree at all shows "No org tree found. Import one under Org Trees to populate the report." Once a tree exists but the window has no in-progress spans, totals show zero and Top Epics reads "No epic time recorded in this window." That's a real answer, not a loading state: check the window and the tree's in-progress status configuration before assuming something's broken.

If it looks wrong

SymptomCauseFix
Everything shows as UnclassifiedNo issue in the window, nor any of their epics, has a Classification setSet Classification on the board — select multiple rows to classify a whole epic at once
The dollar total looks offThe blended rate is a rough org-wide estimate, editable per browserSet a realistic rate; treat the figure as directional
Top epics is empty but the grid shows hoursThe leaderboard uses its own trailing window, independent of the report's navigatorWiden the epic window selector
The report is empty for a tree with known activityThe tree's in-progress status configuration excludes the statuses in useReview what counts as in-progress for that tree

Related

Last updated