Detailed guide

Reports

A drag-and-drop pivot builder for answering revenue, margin, delivery, and spend questions across the workspace without exporting raw data first.

Reports is the analytical layer for the workspace. It turns the same operational records used across projects, time, and billing into cross-tabulated answers, so you can compare revenue, cost, and margin by any dimension without rebuilding spreadsheets each month.

Quick summary

  • Pick the smallest set of data sources that still contains every field your question needs before building the layout.
  • Frame the question as rows-by-columns first (for example client by month) so field placement is obvious.
  • Add filters before interpreting totals so you are not reading a whole-workspace number when you meant one client or period.
  • Save layouts you rebuild often instead of reassembling them each reporting cycle.
  • Export to CSV when the result needs to travel to finance, leadership, or a spreadsheet model.

Put it into practice

  1. Decide the exact business question first, phrased as a measure broken down by one or two dimensions (for example collected revenue by client by month). This tells you which sources and fields you need.

    InteractionsReports page: read the Data Sources checklist and Fields panel before dragging anything.
  2. Tick only the data sources that contain the fields your question needs. The Fields panel updates to show the chips available from the selected sources.

    InteractionsReports left sidebar: check the relevant Data Sources (for example Invoices and Invoice Lines for billing questions).
  3. Drag the grouping dimension into Rows and, if you are comparing across something, drag that dimension into Columns. Keep the layout to one or two dimensions so the pivot stays readable.

    InteractionsFields panel: drag a field chip into the Rows drop zone, then optionally another into Columns.
  4. Drag the numeric measure into Values and set its aggregation. Confirm the aggregation matches intent (sum for money, count for volume, average for rates).

    InteractionsFields panel: drop a numeric field into Values, then use the chip's inline aggregation selector.
  5. Add any constraints to Filters and complete their inputs so the result covers only the population you mean to analyse.

    InteractionsFields panel: drop fields into Filters, then fill the filter inputs in the warning bar that appears.
  6. Run the query and review the pivot, including the Grand Total row. If rows look truncated, raise Max rows and run again.

    InteractionsBuilder toolbar: click Run, then adjust Max rows if needed and run again.
  7. Save the configuration if this is a question you will revisit, giving it a clear name and optional description so it is reusable next cycle.

    InteractionsBuilder toolbar: click Save, name the report, and confirm it appears in the Saved Reports list.
  8. Export to CSV when the numbers need to leave the app, or pivot into the underlying operational area when a figure looks wrong so you can trace it to source records.

    InteractionsBuilder toolbar: click CSV to export; or open Projects, Time Entries, or Expenses to validate the source rows.
    Open workflow: Projects

What to review

Data Sources checklist

The left-sidebar checklist (Projects, Estimates, Estimate Lines, Quotes, Invoices, Invoice Lines, Timesheets, Expenses). Tick the sources that hold the fields your question needs; the available field chips update to match.

Fields panel

Draggable field chips grouped by source, tagged by data type (number, date, text, meta). Drag a chip into a drop zone to place it; drag it out to remove it.

Rows and Columns drop zones

Rows become the left-hand row headers and Columns become the across-the-top headers of the pivot. Put the dimension you are grouping by in Rows and the dimension you are comparing across in Columns.

Values drop zone

Holds the numeric measures being aggregated. Each Values chip has an inline aggregation selector (for example sum, count, average) so the same field can answer different questions.

Filters drop zone

Constrains the result set. When filters are active a warning bar appears with an input per filter field so you can narrow to a period, client, status, or project before reading totals.

Builder toolbar

Run executes the query, Max rows caps how many rows are returned (default 10000), Reset clears the layout, Save stores the configuration, and CSV exports the current result.

Pivot results table

The rendered cross-tab with a sticky header, right-aligned numeric cells, and a bold Grand Total row. Always read it against the active data sources and filters.

Saved Reports list

Previously saved report configurations. Select one to reload its sources, layout, and filters, or delete one you no longer need.

See guide: At A Glance

Guardrails

  • Report accuracy depends entirely on the underlying project, time, expense, and billing data being current; a clean-looking pivot built on stale records is still wrong.
  • Max rows caps the result set, so a large query can silently truncate. If a total looks low, raise Max rows and re-run before trusting it.
  • A pivot only answers the question implied by its Rows, Columns, Values aggregation, and Filters together. Change any one of them and the number means something different.
  • Reporting access is required to open the builder, and some commercially sensitive fields may be limited for users without broader financial or admin visibility.
  • Saved reports are workspace-level configurations, so deleting one removes it for everyone who relied on that saved question.

If it starts drifting

  • If the result is empty, check the Filters inputs and the selected data sources first; an over-tight filter or a missing source is the usual cause rather than a reporting fault.
  • If a total looks too small, raise Max rows and re-run in case the result was truncated.
  • If a field you expected is missing from the Fields panel, confirm the data source that provides it is ticked in the Data Sources checklist.
  • If a saved report loads unexpected numbers, verify it is pointing at the intended period and that its filters still match the current question before editing the layout.