01
Eighteen datasets
Workforce, attendance, leave, overtime, payroll, payroll components, expenses, recruitment, onboarding, offboarding, lifecycle, objectives, KPIs, skills, training, disciplinary, assets and engagement.
Reporting · the query engine
Every HR system will export you a CSV, and that is where most reporting actually happens — in a workbook, joined by hand, stale the moment it is saved. Flume answers the question inside the product, across eighteen subject areas of one database, scoped to what the person asking is allowed to see.
Why managers can be handed this
This is why most HR platforms lock reporting down to a handful of fixed exports: give people a query tool over an HR database and someone eventually reads a salary they should not see. Open the same saved report as three different people and watch the rows it returns change without the definition changing at all.
One saved report — “overtime hours by department” — opened by
The same saved report, opened by a line supervisor. Nothing about the definition changed — the engine added the scope after reading it, so there is no version of this link that returns Maintenance.
Scope is resolved from the reporting tree at query time, not stored in the report. Three datasets with no individual subject — recruitment, disciplinary cases, survey responses — are HR-only and never appear in a manager’s picker.
What ships
01
Workforce, attendance, leave, overtime, payroll, payroll components, expenses, recruitment, onboarding, offboarding, lifecycle, objectives, KPIs, skills, training, disciplinary, assets and engagement.
02
Every dataset declares what one row means — one payslip, one employee per day, one candidate — so a report cannot quietly double-count.
03
A payroll report already knows each employee’s department, branch, manager and hire date. The joins the fields need are resolved from the catalog, not typed.
04
Roll any date up to day, week, month, quarter, year or day-of-week in place, so one report answers "by day" and "by quarter" without being rebuilt.
05
Sum, average, min, max, count and count-distinct on any numeric field — plus ratios like attendance rate that arrive already defined so nobody computes them two ways.
06
Offered per field according to its real type: ranges and rolling windows on dates, a value picker on a status, text matching on a name.
07
Table, bar, stacked bar, line, area, pie, donut, KPI tile and pivot — switched without re-specifying the report.
08
A manager gets their reporting subtree, an employee gets themselves, and HR-only subjects are absent from the picker rather than refused on run.
09
The grand total is computed across the whole result rather than summed from the page you are looking at, so paging never changes the answer.
10
Currency as currency, hours as hours, dates on the Cairo business calendar — and the definition travels with the file so next month it can be run again.
How it actually works
Every expression that reaches the database is authored in the catalog, in code, at startup; every value you type is bound as a parameter. There is no path from something a user typed to a fragment of query text, which is what lets the builder be this expressive without opening a hole.
Ask for departments where average overtime exceeds 20 hours and you are filtering groups; ask for the night shift only and you are filtering rows. Confusing the two is the classic way a report quietly describes the wrong population, so the engine decides which you meant from the field itself rather than from the request.
Timestamps are converted to the Cairo business day before they are bucketed, while columns that are already business dates are left alone. Skip that distinction and every month boundary drifts by a shift, which is exactly the kind of error nobody catches until an inspector does.
A field pointing at a table that is not joined, a join depending on one that does not exist, or two fields sharing a key will refuse to start up. The failure lands in deployment rather than in front of the person who just ran the report.
Preview, result and export row limits are enforced inside the engine rather than in the interface, alongside caps on how many columns, measures and filters a single definition may carry. A caller cannot raise them by editing a request.
Where this stands
We would rather say this here than in the third meeting. Reporting is arriving in two parts, and both are code rather than a roadmap slide.
Book a demo
The fastest way to judge Flume is to run it against a period you already argued about. Send a month of punches and the payroll you produced from it, and we will show you the same month reconciled — including what the anomaly detectors flag.