A workforce platform that can't get its own data back out isn't really yours — it's a silo with a nice UI. So Reports is deliberately unglamorous: pick a report type and a date range, click generate, get a CSV. No account manager, no data request form, no 48-hour SLA.
Four report types, four different audiences
- Attendance — every check-in/check-out in the range, with lateness and overtime already computed, for whoever needs the raw numbers behind a payroll dispute or a compliance question.
- Leave — every request in the range regardless of status, so HR can see approved, rejected, and still-pending requests side by side.
- Payroll — regular and overtime minutes, rate, and computed pay per employee. This one is admin/owner-only, same boundary as the Payroll page itself, because it's compensation data.
- Headcount — a point-in-time roster snapshot by role and department, for the 'how many people do we actually have right now' question that attendance and leave data can't answer.
Why redownloading a report re-runs the query instead of storing a file
Every report generation is logged — type, period, timestamp — so there's a real history to browse, not just the most recent export. What we didn't do is bolt on file storage to cache the actual CSV bytes: we don't have an object storage bucket wired up, and pretending to have 'permanent' exports we can't actually guarantee the durability of felt worse than being upfront that a re-download recomputes the report fresh from current data. For attendance and payroll history that doesn't change after the fact, that distinction is invisible in practice. It only matters if you'd expect a six-month-old export to reflect data as it looked six months ago rather than as it looks today — worth knowing, so we're saying it plainly here instead of leaving it to be discovered.