Grouping lets you collapse many rows of detail into a smaller summary table. Use it when you want to answer questions like "how many hours did each staff member work last month?" or "how many shifts ran at each site this week?" — instead of seeing every individual shift.
This article walks through how grouping works, the controls you'll see in the Reports page, and a few common recipes.
When should I group?
Group a report when you want totals or counts per category, rather than a row-by-row breakdown.
You want to know... | Group by | Result |
Total hours each staff member worked this month |
| One row per staff member with their total hours |
How many shifts happened at each site |
| One row per site with a shift count |
Daily total hours per role |
| One row per day per role with summed hours |
Cost of NDIS interactions per participant |
| One row per participant with total billed |
If you just want the underlying detail (every shift listed individually), don't group — leave Group By empty and you'll get one row per record.
How to use grouping
Build your report normally — pick a Data Source, choose Columns, add any Filters.
Open the Options step.
Under Group by, click the columns you want to group on. They'll turn dark to show they're selected.
Click Run Report.
That's it. The results table at the bottom will collapse rows that share the same combination of grouped values into a single row.
Reading the grouping bar
When you run a grouped report, a strip appears above the results table:
Grouped by [Date ✕] [Staff ✕] 12 groups from 84 source rows · 7.0× aggregation Clear grouping
This combines rows that have the same "Date" and "Staff" into a single row. "Duration (Hours)" will be totalled for each group.
Here's what each part means:
The chips (
Date,Staff) are the columns you grouped on. Click the ✕ on any chip to remove that column from grouping and immediately re-run the report."12 groups from 84 source rows" — your filtered query found 84 underlying records, and grouping collapsed them into 12 unique combinations.
"7.0× aggregation" — on average, each group contains 7 source rows. Higher numbers mean grouping is doing more for you. Numbers near 1 mean grouping is barely reducing the table.
The italic sentence below describes in plain English what the current grouping will do, including which numeric columns will be totalled. It updates live as you change the chips.
Clear grouping removes all grouping and re-runs the report.
The "Rows" column
When grouping is active, an extra column called Rows appears at the end of the table. It tells you how many original records were collapsed into each row.
For example, if a row reads:
Date | Staff | Duration (Hours) | Rows |
15 Apr 2026 | Joe Doe | 17.5 | 3 |
That means Adamus Prime worked 3 separate shifts on 15 April 2026, and the total of those three shifts was 17.5 hours.
You can sort by the Rows column to see your largest groups first.
What gets totalled?
When you group, every numeric column you've selected that isn't in the Group By list gets summed automatically. For example:
Duration (Hours) → totalled per group
Break (minutes) → totalled per group
Total Cost (in NDIS Invoicing) → totalled per group
Non-numeric columns (text fields like Status, Notes, Site Name, etc.) must either be in the Group By list or be removed from the Columns selection — there's no sensible way to "sum" text. If you select a non-numeric column without grouping it, the report builder will warn you on the Options step and the Run Report button will be disabled until you fix it.
The auto-fix buttons next to each warning will either Add to Group By (so it becomes part of the grouping key) or Remove column (so it disappears from the report) in one click.
Recipe book
Common groupings that produce useful reports:
Hours per staff member per month
Source: Shifts
Columns: Staff, Duration (Hours)
Filters: Date
between1 Apr 2026 and 30 Apr 2026Group by: Staff
Sort: Duration (Hours) descending
Result: one row per staff member with their total hours for April, biggest at the top.
Daily total hours per site
Source: Shifts
Columns: Date, Site, Duration (Hours)
Group by: Date, Site
Result: one row per Date/Site combination with summed hours. Easy to spot a quiet day or a busy weekend.
Compliance certificates expiring soon, by branch
Source: Compliance
Columns: Branch, Days Until Expiry
Filters: Days Until Expiry
<=30Group by: Branch
Result: one row per branch showing how many staff have certificates expiring within 30 days (the Rows column tells you the count).
NDIS billing per participant
Source: NDIS Invoicing
Columns: Participant, Units, Total Cost
Filters: Interaction Start
betweenstart of month and end of monthGroup by: Participant
Sort: Total Cost descending
Result: one row per participant with their billable units and total cost for the period.
Why isn't my grouping working?
If your grouped report has nearly as many rows as your unfiltered data, your grouping is probably too granular.
The most common cause is including time-based columns like Start Time or End Time in Group By. Because every shift has a slightly different start and end time, two rows almost never share an exact combination — so almost every shift becomes its own group, and the table doesn't shrink.
The grouping bar will warn you when this happens:
⚠ Each group is averaging 1.3× source rows — grouping is barely reducing the table. Try removing "Start Time" or "End Time" from Group By.
Click the suggested Remove "Start Time" / Remove "End Time" links and the report will re-run with much more meaningful aggregation.
A good rule of thumb: group on coarse columns (Date, Staff, Site, Role, Branch, Participant) and avoid grouping on fine-grained ones (exact times, IDs, durations). If you want to see results bucketed by week or month rather than by exact date, that's coming in a future update — for now, group by Date and use a filter to narrow the range.
Grouping and search
Search is disabled when grouping is active. Search filters individual records before they're grouped, which would silently drop matched records into seemingly unrelated groups — confusing more often than it helps.
If you switch from an ungrouped to a grouped report and you had a search query active, you'll see a notice that the search was cleared. To search within grouped results, clear the grouping first.
Grouping and exports
CSV and PDF exports include exactly what you see on screen — including the Rows column and the totals for each group. The header row of the CSV will read Date, Staff, Duration (Hours), Rows and the row totals will be the sums you see in the table.
If you want the underlying detail rows in your export, clear grouping before exporting. With no Group By, every record is exported individually.
Grouping and pagination
Pagination works on groups, not source rows. If your report shows "101 groups · 1/5", that means 101 unique groupings split across 5 pages of 25 each. Sort and pagination apply to the grouped output.
Sorting a grouped report
You can only sort by columns that are either:
in the Group By list, or
numeric columns we've totalled.
Trying to sort by an ungrouped, non-numeric column (e.g. Notes when you've grouped by Staff) will be blocked with a clear message. To enable that sort, either add the column to Group By, remove it from your selection, or pick a different sort column.
A note on timezones
When you group by Date on a column that's actually a date-and-time (like a shift's Start Time), the date is calculated using your computer's timezone. So a Sydney user grouping by date will see a shift that started at 11:30 PM AEST on 14 April under "14 Apr", while the same shift might appear under "13 Apr" in UTC.
This matches what you see in the table itself — the Date and Start Time columns are always shown in your local timezone, and grouping bins them the same way.
Quick reference
Control | What it does |
Group by chip in Options step | Adds a column to the grouping key |
✕ on a chip in the grouping bar | Removes that column from grouping |
Clear grouping | Removes all grouping |
Rows column | Shows how many source records are in each group |
"X groups from Y source rows" | Shows how much grouping has compressed the dataset |
"× aggregation" number | Higher = more aggregation. Numbers near 1 mean grouping isn't doing much |
Plain-English description | Human-readable summary of what the current grouping will do |
Low-yield warning | Suggests specific columns to remove when grouping isn't reducing rows |
If you have a reporting question this article didn't answer, or you'd like to see a new grouping recipe added, contact support.
