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.
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:
| Filter | What it does |
|---|---|
| Date range | Today / Yesterday / Last 7 days / This week / Last 30 days / This month / Last month / This quarter / This year / Custom |
| Member | One or many users |
| Client | One or many CRM contacts |
| Project | One or many projects |
| Tag | One or many tags from time_entries.tags |
| Description | Free-text contains |
| + Add filter | Billable status, status (draft / submitted / approved), entity type |
And the toolbar on the right:
| Action | What it does |
|---|---|
| Rounding | Off / nearest / up / down × 0 / 5 / 15 / 30 min — display-only, doesn't mutate entries |
| Create invoice | Pulls the currently filtered billable + approved hours into a new invoice draft (delegates to the existing invoicing bridge) |
| Export | CSV (always) · XLSX (Pro) · Payroll templates (Pro: ADP / Gusto / SD Worx / Securex) |
| Settings | Open /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.
| Element | What |
|---|---|
| KPI cards | Total Hours · Billable Hours · Amount · Avg Daily |
| Duration by month | Bar chart, hours per month over the selected range |
| Project distribution | Donut chart with project legend + percentages |
| Project / description breakdown | Collapsible 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 %:
| Column | Source |
|---|---|
| Revenue | Sum of hours × hourly_rate for billable + approved entries |
| Cost | Sum of hours × cost_rate for entries where cost_rate IS NOT NULL |
| Expenses | Sum of project-tagged expenses_expenses rows in the period |
| Margin | Revenue − 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 projectAll 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)./dashboardwidgets — 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