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.
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:
- Its own classification, if the row on the board has been set.
- 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.
- 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
| Symptom | Cause | Fix |
|---|---|---|
| Everything shows as Unclassified | No issue in the window, nor any of their epics, has a Classification set | Set Classification on the board — select multiple rows to classify a whole epic at once |
| The dollar total looks off | The blended rate is a rough org-wide estimate, editable per browser | Set a realistic rate; treat the figure as directional |
| Top epics is empty but the grid shows hours | The leaderboard uses its own trailing window, independent of the report's navigator | Widen the epic window selector |
| The report is empty for a tree with known activity | The tree's in-progress status configuration excludes the statuses in use | Review what counts as in-progress for that tree |
Related
- Choosing what counts as in-progress — what feeds the hours behind every dollar here.
- Timesheet — the grid this report shares its engine with.
- System fields vs the columns you add — where the Classification column lives.
Last updated