Run time and billing reports

Report minutes and money by person, project, ticket, client, period, category, or outcome for a date range, as the current net or as each period stood when it was closed.

Written for
user, admin, integration-developer
Roles
owner, admin, member, agent
Requires
Workspace user (Owner, Admin, or Member); Rows are limited to tickets and projects you can see
Feature
reports

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.