Flume

Reporting · the query engine

Ask it here.
Not in a spreadsheet.

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.

Report · overtime by departmentexample data
datasetPayrollgroupDepartmentgroupPay period · monthmeasureOvertime hours · sumfilterRun status is paid
Total · 2026-08 · all 9 departments7,800 h

Why managers can be handed this

Self-service reporting and a payroll leak are the same feature — until the scope is applied server-side.

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

22hMahmoud Ezzat · ProductionIn scope
18hNour Hassan · ProductionIn scope
26hKarim Adel · ProductionIn scope
14hAmira Saleh · ProductionIn scope
31hYoussef Farouk · MaintenanceFiltered out
19hOla Mansour · MaintenanceFiltered out
9hSalma Abdel Rahman · QualityFiltered out
12hHussein Nabil · QualityFiltered out
15hMona Fathy · LogisticsFiltered out
11hTamer Zaki · LogisticsFiltered out

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.

rows in scope4 of 10
departments returned1
overtime hours80h
datasets offered15 of 18
Production80h
Scope appliedHany Refaat · reporting subtreeThe definition is identical in all three cases. Only the viewer changed.

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

A report is four choices, and none of them is a table name.

01

Eighteen datasets

Workforce, attendance, leave, overtime, payroll, payroll components, expenses, recruitment, onboarding, offboarding, lifecycle, objectives, KPIs, skills, training, disciplinary, assets and engagement.

02

A stated grain

Every dataset declares what one row means — one payslip, one employee per day, one candidate — so a report cannot quietly double-count.

03

Joined for you

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

Date bucketing

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

Six aggregations

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

Sixteen filter operators

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

Nine shapes

Table, bar, stacked bar, line, area, pie, donut, KPI tile and pivot — switched without re-specifying the report.

08

Row-level scope

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

Database-side totals

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

Excel export

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

The mechanism, not the marketing.

Field keys

A report carries field names. It never carries SQL.

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.

Rows vs groups

Filtering a row and filtering a total are different operations.

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.

Business dates

A shift ending at 00:40 belongs to the night it was worked.

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.

Validated at boot

A broken catalog stops the server, not a board report.

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.

Ceilings

One curious query cannot become a production incident.

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

A straight answer about what runs today.

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.

Live in the product
The monthly attendance and overtime pack with per-day drill-down and Excel export, the company overview, the role-scoped dashboards, and the Command Center detectors.
Built, landing next
The query engine on this page — the eighteen-dataset catalog, the compiler, the scoping and the ceilings — is implemented and tested. The builder interface on top of it is the piece still in flight.
What it means for a pilot
Bring a question from the catalog and we will run it against your own data. A real answer from your numbers is worth more than a screenshot of ours.

Book a demo

Bring us your messiest month.

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.