Reports & dashboards

Overview
This area answers questions about your own data. Four building blocks work together:
- Reports are saved questions — metric, period, filters, grouping.
- Dashboards place several reports side by side.
- Targets put a target value next to the metric, so you see deviation rather than only level.
- Time series record metric values per reporting date — the basis for trends.
Metrics come from the modules themselves; what is not installed delivers no metric.
Core tasks
Build a report. You choose the metric, set period and filters and group. The result can be saved and shared.
Assemble a dashboard. Tiles are arranged; a dashboard can be personal or shared for a role.
Set targets. A target applies to a period and is shown next to the actual value.
Schedule reports. A schedule sends a report regularly — to people or roles.
Fields in detail
The area has four masks: report, dashboard (with its widget dialog), schedule and KPI target. Each writes to a resource of its own.
Report
Creation asks for name, dataset, description and scope; everything else lives in the configuration on the report detail page.
| Field | Required | Values / format | What it does |
|---|---|---|---|
Name name | yes | text, max. 200 characters | What the report is called in the list, in schedules and in exports. |
Dataset dataset | no (defaults to custom) | key from the dataset catalogue, max. 60 characters | The source area of the report — finance, time & utilisation, sales. It determines which metrics are available at all. |
Description description | no | text, max. 1000 characters | What the report is for. |
Measures measures | yes | list of metric keys | What is calculated — the columns of the report. Without at least one metric the report cannot be saved. |
Dimension chain dimensions | no | list of dimension keys | How the result is split. The first dimension is the row axis, every further one a drill-down step. Empty means a single total row. |
Filters filters | no | key/value pairs | What is included. The report mask does not maintain them itself — they come from a template or are set through the interface and automation. |
Sort field sortField | no | field name, max. 60 characters | What the result is sorted by; empty = default order. |
Sort direction sortDir | no | desc or asc | In which direction. |
Period dateRange | no | this_month, last_month, this_quarter, this_year, ytd, last_12_months, custom | Which period is reported on. Everything except custom is rolling and keeps the saved report current without anyone updating it. |
From customFrom | no | date | Start of the period — only with dateRange: custom; with any other period the entry is cleared on save. |
To customTo | no | date | End of the period, same condition. |
Granularity period | no | day, week, month, quarter, year | In which steps the period is broken down. |
Comparison comparison | no | none, previous_period, previous_year | Whether a comparison column runs alongside, and against which period. |
Scope scope | no | personal, role, shared | Who sees the report. |
Brand brandFilter | no | one of your brands | Which brand the report refers to. With scope: personal the field is cleared on save. |
Start export creates a run in the background; the chosen format (csv, xlsx, pdf) is the only value of that dialog and belongs to the action, not to the report.
Dashboard
| Field | Required | Values / format | What it does |
|---|---|---|---|
Name name | yes | text, max. 200 characters | What the dashboard is called. |
Scope scope | no | personal, role, shared (max. 10 characters) | Who sees it. A role dashboard is the way to give every salesperson the same view without building it ten times. |
Role roleId | no | an existing role | Which role it applies to, where the scope calls for it. |
Brand brandFilter | no | one of your brands | Which brand the tiles refer to. |
Default dashboard isDefault | no | yes/no | Whether this dashboard opens first when the area is entered. |
Tiles widgets | no | list of tile definitions | The entire tile set. One write replaces it completely — which is why the interface sends all tiles with every change. |
Grid layout | no | grid data (columns/positions) | The free grid placement of the tiles on the start page. Maintained by the start page, not by this dialog. |
The tile dialog writes no field of its own but an entry in widgets:
| Tile key | Values / format | Meaning |
|---|---|---|
| Widget type | key from the widget catalogue | Which kind of tile. Operational tiles bring content and size themselves; there only the title can be chosen. |
| Metric | metric key | What the tile shows. Mandatory for non-operational tiles. |
| Title | text | Heading of the tile; empty = name of the metric. |
| Dimension | global, brand, customer, project, employee, team | How it is split. Only for tile types that need a dimension — mandatory there. team splits by the team set on the employee; a role limited to "own team only" sees just the rows of its own teams — likewise for employee (the employee's home team) and owner (the user's teams); people without a team stay visible. |
| Period | like dateRange, but without custom | Which period. A custom period is not offered on a tile. |
| Granularity | day, week, month, quarter, year | In which steps. |
| Comparison | none, previous_period, previous_year | Whether a comparison figure runs alongside. |
| Width / height | 1 or 2 | Size in the dialog grid. For operational tiles the start-page grid size stays untouched. |
Schedule
| Field | Required | Values / format | What it does |
|---|---|---|---|
Report reportDefinitionUlid | yes | a saved report | Which report is sent. |
Name name | no | text, max. 200 characters | What the schedule is called; empty = name of the report. |
Frequency frequency | yes | daily, weekly, monthly | How often a run falls due. |
Format format | yes | csv, xlsx, pdf | In which format it is exported. |
Recipients recipients | yes | list of email addresses or user ULIDs | Who receives the file. Without a recipient the mask does not accept the schedule. |
Active active | no | yes/no | Off pauses the schedule without deleting it. |
KPI target
| Field | Required | Values / format | What it does |
|---|---|---|---|
Metric metricKey | yes | metric key, max. 60 characters | What the target applies to. |
Dimension dimensionKey | no (defaults to global) | global, brand, customer, project, employee, team, owner, channel, stage (max. 30 characters) | At which level the target applies; team makes it a team target. If your role is limited to "own team only", you see and maintain team and person targets only for your teams — such a target "for all" (empty value) only as a cross-team manager. |
Dimension value dimensionValue | no | text, max. 60 characters | For which concrete value of the dimension — empty means: for all. With global the field is disabled. |
Period period | no (defaults to month) | day, week, month, quarter, year | Which time slice the target value refers to. |
Target value targetValue | yes | whole number in the metric's canonical unit | The target. The unit follows the metric: money in cents (150000 = 1,500.00), duration in minutes, percentages in basis points (8500 = 85.00 %), otherwise days or a count. The mask shows the matching input and names the unit in its hint. |
Comparison comparison | no (defaults to gte) | gte = reach or exceed · lte = stay below | In which direction the target applies. lte is the case for metrics where small is good — days sales outstanding, for instance. |
Valid from validFrom | no | date | From when the target applies; empty = no start. |
Valid to validTo | no | date | Until when; empty = no end. |
Brand brandId | no | one of your brands | Which brand the target applies to; empty = all brands. |
You see only what you may see. The permission cut sits inside the report — the same saved report can return different figures for two people without anything being broken. An export outputs exactly what was on screen; it is not a way around permissions.
Settings & permissions
- Dashboards:
reporting.dashboard.view/reporting.dashboard.manage - Reports and targets:
reporting.report.view/reporting.report.manage - Financial metrics (revenue, margin, DSO, MRR):
reporting.kpi.financial - People metrics (utilisation, cost rates):
reporting.kpi.hr - Export and schedule:
reporting.export· Cross-brand:reporting.brand.all
The two metric permissions stand on their own because their content does: being allowed to analyse projects does not imply being allowed to see salary cost rates.
Roles with the "own team only" option see only their team on team and person axes — and the overall total and the total per brand are also built only from the people they can see (own team, people without a team). This applies to metrics, time series, saved reports and dashboard tiles; otherwise another team could be worked out as the total minus one's own team. Metrics without any person or team reference stay unchanged.
Module flag: module.reporting.
FAQ & troubleshooting
A metric is missing from the selection. Then the module supplying it is not active, or you lack the metric permission.
Two people see different numbers. That is correct: reports run within the viewer's permission and brand scope.
A scheduled report did not arrive. Check schedule and recipients. Scheduled reports run on behalf of and with the permissions of the report owner: if there is no owner, the owner is deactivated or lacks the export or view permission, no export is created — the run shows the reason among the export runs.