Time reports

Overview
The report places three hour figures side by side, and the insight lies precisely in the gaps between them:
| Figure | Meaning |
|---|---|
| Logged hours | everything booked |
| Billable hours | of that, what may be charged |
| Invoiced hours | of that, what actually was charged |
| Billing ratio | invoiced ÷ billable, target above 95 % |
The gap between logged and billable is a decision — it shows how much unpaid work occurs. The gap between billable and invoiced, by contrast, is an omission: those hours could have been charged and were not. That is exactly what the billing ratio targets.
Core tasks
Choose period and grouping. Grouping is by project, employee, customer, brand or total; additionally you can narrow to one employee.
Read the table. Per group it shows logged, billable and rounded hours plus the ratio. The rounded hours are what actually goes onto an invoice — rounding rules take effect here, not at capture time.
Use the chart. Logged, billable and invoiced compared per group — the fastest way to find the outlier rather than comparing rows.
Save the selection as a report. Save as report stores the current filter bar under a name — with rounding and, if you want, a relative period. Only the author may change or delete a report; sharing makes it readable, not editable by others.
Fields in detail
The report itself writes nothing — it reads the recorded time entries, and the selection at the top cuts the report, not the data. There is an input mask at exactly one place: when saving a report.
Filter bar (selection, not stored)
| Element | From | What it means |
|---|---|---|
| Grouping | selection: project · employee · customer · brand · total | The axis of the table and the chart. |
| From / to | date pickers | Which working days are included. Calculated by the work date of the entry, not the day it was recorded. |
| Employee | selection, empty = everyone | Who it is narrowed to — within what you are allowed to see. |
| Saved report | your own plus the shared ones | Picking one makes the server run it: it resolves that report's relative period against today and returns the rounded rows. The filter bar follows along. |
Further restrictions — customer, project, brand — are understood by the report, but they are set through a saved report or the interface, not through the filter bar.
Saved report
What is taken over on saving is shown in the dialog under Adopted filters: grouping, period and employee selection come from the filter bar — otherwise the report would differ from what you are looking at.
| Field | Required | Values / format | What it does |
|---|---|---|---|
Name name | yes | text, max. 255 characters | What the report is called in the selection list. |
Visibility visibility | no | private (only me) · shared (shared with the team); default private | Who may see it at all. Only shared puts audience and permission level into effect — a private report has neither. |
Audience audienceUserIds | no | list of employees; empty = everyone | Who sees the shared report. Empty means every colleague with the reporting permission in the brand. Filled means exactly those employees — the author is always included. |
Audience (teams) audienceTeamIds | no | List of teams; empty = no team condition | The second axis of the same audience, acting as OR next to the people: members of these teams can see the shared report. If both are empty, it stays "everyone with reporting permission in the brand"; if ONLY the team axis is filled, the report is meant for that team and nobody else. Without the read teams permission the field stays hidden in the form. |
Permission level shareLevel | no | read (view) · edit (change); default read | What the audience may do. View allows opening and running, change additionally renaming, changing filters and grouping, and deleting. The author may always do everything; the server refuses anything else. |
Relative period relativePeriod | no | this_week, last_week, this_month, last_month, this_quarter, this_year, last_7_days, last_30_days, last_90_days | Resolved anew against "today" on every run and it beats the fixed dates. That is what it is for: a monthly report that still shows January in February goes silently wrong. |
Fixed period dateFrom / dateTo | no | date | The fixed window from the filter bar. It is only stored and applied while no relative period is set. A to before the from is rejected. |
Grouping groupBy | no | none (total) · project · customer · employee · brand; default none | The axis the figures are grouped by. |
Chart type chartType | no | bar (default), line, pie or none | How the report is drawn. For a development over time the line is the right form — reading a time series as a forest of bars is work nobody should have to do. "None" shows the table only. |
Rounding roundingIncrement | no | 0, 1, 5, 6, 10, 15, 30 or 60 minutes; 0 and 1 mean "no rounding" | The step the output is rounded to. |
Rounding direction roundingMode | no | none · up · down · nearest; default none | Which way rounding goes. Rounding only affects the reported values — the recorded times stay untouched. That is why the rounded column sits next to the logged one and not in its place. |
Adopted filters filters | no | brandId, customerId, projectId, employeeId | The data filters of the report. Today the mask fills only the employee from them; the rest come from the interface. Other keys are ignored on execution — a stored definition from an outside source cannot force anything through them. |
Column selection columns | no | list of column names, empty = all | Stored and handed back again. Execution does not evaluate it at present and always returns all columns. |
The result of a saved report comes entirely from the server: the resolved window and the rounded rows. The interface recalculates nothing on top — otherwise there would be two truths.
Settings & permissions
- Module
module.timetracking. - Permission
time.report.viewfor the figures and the saved reports — including creating,
changing and deleting one. The page itself already opens with time.entry.view_own; without the reporting permission it then stays empty.
- Time visibility still applies. Without the project-level view of other people's time, you are
analysing your own.
- Billability arises at capture — from the activity type or inherited from the project type, see
FAQ & troubleshooting
The billing ratio is low. Then billable hours exist without an invoice. Group by project — the backlog usually sits in a few engagements.
Logged and billable are far apart. That is not a fault but a statement about the share of non-chargeable work. The activity types show whether the classification is right.
Rounded and logged hours differ. By design — rounding rules take effect at billing, not at capture.
My figures differ from management's. The report follows your view of time entries. Anyone allowed to see more sees different totals.
I cannot change a shared report. By design: sharing makes it readable, not editable. Changing and deleting stay with the author — make your own copy.
The saved report shows a different period than the one set. Then it carries a relative period. That is resolved anew on every run and beats the fixed dates; the resolved window is shown as a marker next to the selection.