WorkestraDocs
PlatformTime Tracking

Reports

Five tabs over the same dataset — Summary, Detailed, Weekly pivot, Profitability, and saved My Reports. Toggl-style filter row + toolbar across every tab.

Reports

/time/reports is a Toggl-style five-tab surface, all sharing one filter row and one toolbar. Switch tabs without losing context: filters and date range carry through.

Reports page — five tabs

Screenshot needed — /time/reports with tabs across the top (Summary / Detailed / Weekly / Profitability / My reports), a filter row below, and the Summary tab content (KPI cards + duration bar + project donut).

Filter row + toolbar

Above every tab, the filter row:

FilterWhat it does
Date rangeToday / Yesterday / Last 7 days / This week / Last 30 days / This month / Last month / This quarter / This year / Custom
MemberOne or many users
ClientOne or many CRM contacts
ProjectOne or many projects
TagOne or many tags from time_entries.tags
DescriptionFree-text contains
+ Add filterBillable status, status (draft / submitted / approved), entity type

And the toolbar on the right:

ActionWhat it does
RoundingOff / nearest / up / down × 0 / 5 / 15 / 30 min — display-only, doesn't mutate entries
Create invoicePulls the currently filtered billable + approved hours into a new invoice draft (delegates to the existing invoicing bridge)
ExportCSV (always) · XLSX (Pro) · Payroll templates (Pro: ADP / Gusto / SD Worx / Securex)
SettingsOpen /time/settings

All filter/tab/toolbar state lives in the URL, so deep-links and refreshes round-trip cleanly.

The five tabs

Summary

The default. Designed for the "where did my hours go this week?" question.

ElementWhat
KPI cardsTotal Hours · Billable Hours · Amount · Avg Daily
Duration by monthBar chart, hours per month over the selected range
Project distributionDonut chart with project legend + percentages
Project / description breakdownCollapsible table, rows = projects, expand to see descriptions

Detailed

A flat list of every entry that matches the filters, paginated. Columns: Date, User, Project, Description, Tags, Duration, Billable, Rate, Amount. Sortable on every column. CSV export from this tab uses the exact rows shown.

Weekly

Pivot grid: members × weeks, cells are hours. Heatmap-tinted (light → dark for higher hours), totals row + column. Useful for "who's been doing what" at a manager level.

Profitability (Pro)

Per-project rows showing revenue − cost − expenses → margin %:

ColumnSource
RevenueSum of hours × hourly_rate for billable + approved entries
CostSum of hours × cost_rate for entries where cost_rate IS NOT NULL
ExpensesSum of project-tagged expenses_expenses rows in the period
MarginRevenue − Cost − Expenses
Margin %Margin / Revenue

Sorted by margin desc by default. A warning chip surfaces when cost_rate is missing on N entries — those rows are excluded from the cost column.

Requires Time Pro. Free workspaces see an upgrade card with a contextual explainer.

My Reports

Saved views. Take any combination of filters + tab + chart and click Save current view in the toolbar — it's persisted in the cross-cutting views table with a 'time_report' marker. Click a saved view to re-apply filters + tab.

Useful for the reports you run weekly: "Last week, billable, all consultants, by project" — save once, click to re-run.

Where the data flows

time_entries (filtered by query params)

    ├── TimeReportService.summaryRollup(filters)
    │     → KPI cards, project donut, breakdown table

    ├── TimeReportService.detailedList(filters, page, limit)
    │     → flat list, paginated

    ├── TimeReportService.weeklyPivot(filters)
    │     → members × weeks heatmap

    └── TimeReportService.profitabilityByProject(filters)
          → revenue / cost / margin per project

All four methods share the same filter shape and respect the URL filters / approved-only semantics.

Where else reports live

  • /projects/[id] Budget tab — single-project actuals (uses the same rollup service).
  • /people/employees/[id] Utilization tab — single-employee read-only view (lights up when People is subscribed).
  • /dashboard widgets — workspace billable % can be added as a dashboard widget.
  • CRM deal detail — projected cost + projected margin in the right rail (uses the same cost-rate snapshot).
  • /api/v1/time/reports/summary — the Summary tab payload over REST, useful for the browser extension and external dashboards.

CSV export

From any tab, the toolbar's Export → CSV dumps the currently filtered rows. The Detailed tab exports row-for-row; the other tabs export their aggregated shape.

XLSX export and payroll templates require Time Pro.


Next steps

  • Time Pro — what unlocks Profitability + payroll templates
  • Rates & Billing — how bill rate and cost rate flow into reports
  • Integrations — pull report data over the public API