TriblockHR Help Center
← All modules
Admin Guide

The Custom Report Builder

When none of the built-in reports answers your question, build your own: pick the data, narrow it, group it, chart it, and save it so it runs on demand or on a schedule.

A custom report is a saved definition, not a one-off export. Once saved it behaves like any built-in report — you run it, export it, schedule it, and share it — and it re-queries live data every time, so last month's report reflects this month's corrections.

The builder, whole screen
🖼 Image placeholder

The builder, whole screen

Screenshot from a demo admin account: the custom report builder with a report part-built — Name filled, a dataset chosen, three or four columns selected, one filter row, a group-by, and the live preview showing rows. Capture the app viewport only (no browser chrome or address bar). Annotate the main regions: Name, Dataset, Columns, Filters, Group-by, Sort, Preview.

Save as: admin-guide__reports__custom-reports__shot1.png

Who can build one

The builder is an administrator tool. Employees never see custom reports — not the builder, not the "Create custom report" action, and not saved reports shared with the account.

Some datasets carry payroll-sensitive figures and are limited further, to Payroll and HR Administrators. If a dataset doesn't appear in your list, that's why — your role can't reach that data anywhere in the platform, and a report is no exception. See Roles & Permissions.

Reports don't widen your access A report shows you only the people you could already see. If your account is scoped to certain employment levels, every row, total and chart counts just those employees — so two admins running the same saved report can legitimately get different numbers.

Anatomy of a report

Every custom report is built from the same seven parts:

PartWhat it decides
NameWhat it's called in the reports list. Name it for the question it answers — the field even suggests "e.g. Headcount by Department".
What is this report for?Optional description. Worth filling in on anything shared or scheduled — "Sent to BICCU each month for payroll deductions" saves the next person guessing.
DatasetWhich table of data you're reporting on. This is the one choice you can't casually change later — it determines every column available.
Output ColumnsThe fields that appear, chosen from Available Fields. Top to bottom in the list is left to right in the result. Charts can only use columns the report includes.
This report coversWhich rows qualify — the filter pane, headed "All of these are true — every condition must match".
Group-byCollapses rows and aggregates the numbers — up to three levels, each labelled with what it sits inside ("Nested inside Department"), and the pane confirms "Rows will be combined into one per group."
SortRow order, per column — A to Z or the reverse.
ChartsOptional visuals over the same data — as many as you like, in the order you arrange them.

The builder lays these out as panes side by side. Available Fields is searchable and grouped by business area — Person, Employment, Compensation, Time & Attendance — with an Add all per group, so you look where a field belongs rather than hunting an alphabetical list.

Each chosen column can be renamed; the row then shows "Renamed from…" so the original is never lost. Columns also carry badges telling you how they behave: GROUPED BY or TOTALLED PER GROUP. Reorder by dragging, or focus a row and press Alt + ↑ / ↓.

Data Sources shows the dataset with a plain-English Shape of the result — "One row per Department, then Schedule Status · 5 columns · Sorted by Department, a to z" — which is the quickest way to confirm you built what you meant.

Preview runs the report against real data whenever you want to check your work; Update (or Save on a new one) commits it. A preview is a sample rather than the finished figure — see Reading the preview for what it tells you about itself.

Building one, step by step

  1. From Reports, click Create custom report.
  2. Give it a Name.
  3. Choose the Dataset (see the list below). The column picker repopulates from your choice.
  4. Pick your Columns. Start with the few you'd actually read; you can add more once the shape looks right.
  5. Add Filters to narrow the rows.
  6. Optionally set a Group-by and a Sort.
  7. Optionally add Charts.
  8. Check the Preview, then save with a visibility.
Build it narrow, then widen A dataset can be large. Filter first and add columns second — a preview that returns in a second while you're designing is worth more than a complete one that takes twenty.

Datasets

There are 32 to choose from. A dataset is the grain of your report — one row per employee, per punch, per payslip line, and so on. Choosing the right grain is most of the work.

AreaDatasets
PeopleEmployees, headcount trend, attrition rate, retention rate, promotion rate, band drift
Time & attendanceTime entries, punch records, punch attempts, work-schedule hours, employee shifts, absenteeism rate
LeaveLeave usage, leave adjustments
RecruitmentApplicants, open positions, time to hire, hiring turnaround, offer acceptance rate
Employment historyEmployment history — promotions, transfers, terminations and rehires with their effective dates and before/after values
Performance & learningPerformance reviews, course progress
RecognitionRecognitions given and received, with points
Documents & formsDocuments, questionnaire responses
Payroll (Payroll/HR Administrators only)Pay-run lines, tax contributions, allowance history, deduction history, salary scales, employee bank accounts

The work-schedule dataset is a useful one to know: it brings Work Schedule, Schedule Status, Scheduled Hours and Scheduled Cost, which is how you compare what you rostered against what you paid.

Joined measures

Joined measures bolts extra figures — hours, leave, time-clock — onto a report without changing its dataset. It's only offered where it makes sense: datasets with one row per employee. On a per-day or per-transaction dataset the section tells you plainly that there are none to include.

Filters

Filters decide which rows qualify. Each row is a column, an operator, and a value; stack as many as you need.

The set as a whole reads as All of (every condition must hold) or Any of (one is enough) the following — the equivalent of AND and OR. + Add condition adds a row; + Add group nests a whole sub-set with its own All-of/Any-of, which is how you express "in Nassau, and either hourly or on contract".

OperatorUse it for
is / is notExact matches on a value or a picked option.
contains / starts withPartial text — a title fragment, a name prefix.
> ≥ < ≤Numeric and date thresholds.
betweenA range, bounds included — pay between two figures, a date window.
in / not inSeveral accepted values at once, without stacking rows.
is empty / is not emptyFinding gaps — missing tax IDs, no bank account, no manager.
within last N daysA rolling window on a date column — the filter a scheduled report usually wants.

A condition can also be set to Ask on run — instead of hard-coding the value, the report prompts for it each time it runs. One saved report then answers "which department?" for every department, rather than needing a copy per team.

Whoever opens that report sees the questions in a panel headed Asked each run at the top of the results: one input per asked condition, and a Run button. Answering changes only the values the author opened up — the structure, the other conditions and the dataset's own constraints stay as saved, and running with a different answer never edits the report. Two people can hold different answers on screen at the same time without affecting each other or the saved definition.

Where a report covers a period, you can use a preset — Yesterday, Month to Date, Quarter to Date, Year to Date, Last 12 Months — or Custom Range. Presets are relative, so a scheduled report keeps meaning the same thing each time it runs. Yesterday runs to the end of yesterday like every other preset, which makes it the one to pair with a daily schedule: a report that runs each morning covers the whole of the day before rather than a partial one.

Conditions the dataset always applies

Some datasets carry their own built-in constraints. These appear above your filters with a padlock and the words Always applied, written out in the same plain language as your own conditions — and you can't edit or remove them. They're shown rather than hidden so a total that looks short has a visible explanation instead of being a mystery.

Filter values read as words, not codes: a department filter shows the department's name rather than its internal ID, so a saved report still makes sense to whoever opens it next.

Employment level, across the datasets

Employment level is now available to filter and group by on many more datasets — performance reviews, recognition, salary scales, tax contributions, time entries, scheduled hours, and the punch datasets among them. It is the dimension most often needed to split a report the way an organisation actually pays people (full time, part time, contract, casual), and previously you had to approximate it with department or work title.

Report warnings

Before a report runs, the builder tells you what it's actually going to do. Two kinds of message appear:

These exist because two mistakes used to be invisible until the results arrived, if at all: grouping quietly changes which columns come back, and a filter left without a value quietly matches nothing. Read the warnings before you trust a total.

Reading the preview

The preview tells you what it is actually showing, which matters because it is a sample and a total is not.

What you seeWhat it means
Showing an earlier answer with Run againYou changed the report after the preview ran, so the rows below are from the previous version. The numbers are real, just not current — run it again before trusting them.
"Showing the first N rows"The preview is capped. Totals and charts still count every matching row, so they deliberately won't add up to the rows in the table. This is the single most common reason a preview looks inconsistent with itself.
"…hidden because your role cannot see…", and · hidden on the column headingA column your role isn't allowed to read — salary, most often. The rows still count. A headcount or an average is computed over everyone who matched, including the people whose figures are hidden from you, so the total is right even though the column is blank.
A hidden column is not an excluded row Masking changes what you can read, not what the report counts. If you need the underlying figures rather than the totals, you need the permission — not a different filter.

Charts

A report can carry charts as well as a table. Click Add chart and configure each one; use Move chart up / Move chart down to order them.

SettingWhat it does
TitleThe chart's heading. Required.
TypeKPI tile (a single headline figure), Bar, Line, Area, or Pie.
MeasureWhat to compute: Count of rows, Sum, Average, or Median.
Of columnWhich column the measure applies to (not needed for a row count).
Group byThe axis or slices — department, month, work title, and so on.
Break down by (optional)Splits each group into series, so a bar per department becomes a bar per department per division.
Compare to previous (optional)Draws the preceding period alongside the current one, labelled Current and Previous — "this month vs last" without a second report. This control only appears when you group the chart by a date column; there is no previous period to compare against when the axis is departments.

Showing a breakdown: stacked or small multiples

Once a chart has a breakdown you choose how to show it:

They're alternatives, not a combination — pick one. Both need a breakdown column to exist first, and a KPI tile or Pie can't be broken into series at all.

Configuring a chart
🖼 Image placeholder

Configuring a chart

Screenshot from a demo admin account: the chart configuration block — Type, Title, Group by, Measure, Of column, Break down by, and the Stack series / Small multiples toggles. Note: the builder is a horizontally scrolling multi-pane layout, so the Charts pane sits off-screen to the RIGHT at a 1680px viewport — a full-page capture does not reach it. Capture with a wider viewport (or scroll right first). App viewport only.

Save as: admin-guide__reports__custom-reports__shot2.png

Charts and exports always agree Chart figures are aggregated by the database, not summed in your browser. That means a downloaded export shows the same numbers the chart showed — a common source of "the spreadsheet disagrees with the dashboard" confusion elsewhere.

Saving & sharing

Save the report with a visibility:

VisibilityWho sees it
Only meJust you. Good for works in progress.
Everyone in my accountEvery administrator who can reach the underlying dataset.
Specific rolesOnly the roles you name — for example, payroll reports visible to payroll staff only.

Sharing a report never shares access to data: each person still sees only the employees their own role and scope allow.

The builder spells out the consequence before you commit — changing a report to account-wide says "Everyone in your account will be able to see this report from now on", and narrowing one back to yourself warns "Everyone else will lose access to this report. Anything scheduled from it keeps running." That last clause matters: restricting visibility does not stop a schedule that's already sending it. After saving you land on the saved report rather than back in a list.

A report you'll want to build variations of can also be saved as a template to start from next time.

Running & exporting

A saved report runs on demand from the reports list, and exports as Excel (.xlsx), CSV (.csv), or PDF (.pdf). Excel for onward analysis, CSV for loading into another system, PDF when it's going to a person rather than a spreadsheet.

Scheduling

Any saved report can run on a recurrence and email its output:

Pair a schedule with a relative date preset. Month to Date on a monthly schedule keeps reporting the right window forever; a Custom Range will still be reporting last March next March.

The Runs log records every execution with its status — Queued, Running, Succeeded, or Failed — plus row counts, duration, who ran it, and the error when one fails.

When it won't save

The builder validates a chart before letting it through. The messages say exactly what's wrong:

MessageWhat to do
"Give the chart a title."Every chart needs a title.
"Pick a column to group by."A chart needs an axis. Only a KPI tile can stand without one.
"A KPI or pie cannot be broken down into series."Remove the breakdown, or switch to a bar, line, or area chart.
"Break down by a different column than the one grouped by."Grouping and breaking down on the same column produces nothing meaningful.
"Stacking needs a breakdown column." / "Small multiples need a breakdown column."Add a breakdown first — there are no series to arrange without one.
"Pick either stacked or small multiples, not both."They're two ways of showing the same breakdown. Choose one.
"That group-by column is no longer one of the report's columns."You removed a column a chart depended on. Put the column back, or point the chart at one that's still there.
"Every filter needs a column."A half-finished filter row. Complete it or remove it — a report whose filters could never run is refused rather than saved and left to fail later.
"Filters are nested too deeply."Simplify the filter groups; there's a limit to how far sub-groups can nest.

That last one is the common trap: charts reference columns by name, so pruning the column list can silently orphan a chart you built earlier.

▶ Video placeholder

From question to scheduled report (6–7 min)

Screen recording on a demo admin account, answering one real question end to end — "overtime hours by department this quarter": create the report, pick the time dataset, add columns, filter to the quarter, group by department, add a bar chart with a breakdown by division, switch the breakdown from stacked to small multiples to show the difference, turn on Compare to previous, preview, save shared-with-account, export to Excel and show the totals matching the chart, then schedule it monthly to an outside email address and show the run appearing in the Runs log. Seeded demo data only.

Save as: admin-guide__reports__custom-reports__vid1.mp4