The Reports page aggregates time entries over a date range: "Minutes and money by person, project, ticket, client, period, category, or outcome. Adjustments appear in the period they were made; free and bank hours are valued at their notional rate." Any workspace user can run it; the rows only contain time on tickets that user can see, so a Member sees their projects and Owners and Admins see everything.
Before you start
- You need to be a workspace user. Client users have no Reports page.
- Money columns only have values once a billing run has priced the entries. Unbilled time has minutes but no money.
- There is no export button. Use the API (
GET /api/w/{slug}/reports) to pull the same rows as JSON; see Periods and reports.
Controls
| Control | Options and meaning |
|---|---|
| From, To | Work dates, inclusive. At most 366 days apart. Defaults to the current month to date. |
| Group | Person, Project, Ticket, Client, Period, Category, Outcome. |
| Billable | All, Billable, Non-billable. |
| Report view | Current net: entries as they are now, including corrections in the period they were made. As of period close: only entries in closed periods, with the facts each period was closed with. |
| Work in progress (on close) | Keep only billable, unbilled entries on open tickets billed When the ticket closes: the work that will bill when those tickets close. |
Columns
| Column | Meaning |
|---|---|
| Minutes | Net minutes in the row, corrections included. |
| Adjustments | The part of Minutes that comes from corrections. |
| Billable | Minutes on entries marked billable. |
| Not yet billed | Billable minutes no billing run has priced. |
| Estimate | The ticket's estimate; for a parent, the sum of its visible children. Only filled when grouping by Ticket; shown as "—" otherwise. |
| Charged minutes | Billed minutes a run charged at a rate. |
| Bank minutes | Billed minutes a run covered from a time bank. |
| Free minutes | Billed minutes a run priced as free (a free policy or free overage). |
| Charged amount | Money charged, per currency. |
| Notional value | Every billed minute, charged, bank, or free, valued at the rate it was priced with, per currency: what the work would have cost. |
Rows with money in more than one currency show one line per currency. Amounts are never added across currencies, and the page has no money total. The line under the table, "Total: {minutes}", sums minutes only.
When grouping by Ticket, an entry also counts towards every visible ancestor of its ticket, and such rows are marked "Includes visible descendants". Rounding applied at billing runs shows in the billed columns, so Charged minutes can exceed Billable for the same row.
Outcomes
Grouping by Outcome puts every entry in exactly one row:
| Outcome | Meaning |
|---|---|
| Charged | Priced by a run at a rate. |
| Bank | Covered by a time bank. |
| Free | Priced by a run at no charge. |
| Not yet billed | Billable, but no run has priced it. |
| Non-billable | Marked non-billable when logged. |
An entry a run split, for example partly covered by a bank and partly charged as overage, appears in both rows with the minutes the run gave each.
Which grouping answers which question
| Question | Settings |
|---|---|
| How many hours did each person log this month? | Group: Person, Billable: All |
| How much unbilled billable work do we have per client? | Group: Client; read Not yet billed |
| Which deliverables carry work that bills when they close? | Group: Ticket with Work in progress (on close) ticked |
| How does spent time compare with estimates on a project? | Group: Ticket and compare Minutes with Estimate |
| What did August look like when we closed it, ignoring later corrections? | From/To covering August, Report view: As of period close |
| How much of a client's work went to their time bank versus charged? | Group: Outcome, or Group: Client and compare Bank minutes with Charged minutes |
| What is our internal (non-billable) share? | Group: Person, Billable: Non-billable |
Example
curl "https://saq.no/api/w/acme/reports?from=2026-08-01&to=2026-08-31&groupBy=client&view=closed" \
-H "Authorization: Bearer saq_YOUR_TOKEN"
{
"rows": [
{
"id": "01924c3e-6b2a-7d11-9d0e-3a1f4b5c6d7e",
"label": "Acme AS",
"minutes": 5400,
"adjustments": 0,
"billableMinutes": 5100,
"unbilledMinutes": 0,
"estimateMinutes": null,
"includesDescendants": false,
"chargedMinutes": 4200,
"bankMinutes": 900,
"freeMinutes": 0,
"money": [
{
"currency": "NOK",
"chargedAmount": 10500000,
"notionalAmount": 12750000
}
]
}
],
"totalMinutes": 5400
}
Amounts are integer minor units: 10500000 is NOK 105 000,00.
Common problems
"Choose a range of at most 366 days." Shorten the range.
The money columns are empty. No billing run has priced these entries yet, or the entries are non-billable or internal.
"As of period close" shows fewer rows than "Current net". The closed view only includes entries in closed periods. Open periods are left out entirely.
A person's hours look low. You only see time on tickets you can see. Owners and Admins see all of it.
"This token has reached its rate limit. Wait a minute and try again." Report requests are limited to 30 per minute per person.