Markus Michalski FAQ

LeaveFlow: Privacy and GDPR

Privacy in LeaveFlow: retention period, manual anonymization, stored data, visibility of illness, external connections and exports.

Deutsche Version

Back to overview

LeaveFlow: Privacy and GDPR

This page describes what LeaveFlow stores, for how long and how former employees are anonymized. It is not legal advice.

LeaveFlow runs on your own infrastructure. There is no vendor service that data is sent to. Outbound connections only result from features you set up yourself (see below).

Retention period

You set the retention period under Admin → Organisation → Company settings in the field "GDPR retention period (months)". The default is 36 months, 1 to 360 months are allowed. The period starts with the employee's exit date.

Anonymization

Anonymization is strictly manual. There is no daily scheduler for it and no advance warning before the due date.

  1. Open Admin → System → GDPR Anonymization (/admin/anonymization).
  2. The section "Due for anonymization" lists all former employees whose exit date plus retention period has been reached, with "Due since".
  3. Click Anonymize and confirm in the dialog with Anonymize now. The action cannot be undone.

Completed cases appear in the section "Already anonymized". LeaveFlow refuses to anonymize before the period has elapsed and for active employees.

Record What happens
Employee The name becomes "Ehemaliger Mitarbeiter #"
Linked user account The email address becomes anonymized-<ID>@leaveflow.local; password, 2FA key, backup codes, iCal token, external sign-in ID, Slack ID and language setting are cleared, and the account is deactivated

Anonymization changes only the employee record and the linked user account. Employee number, join and exit dates, leave requests, leave balances and absence data are kept for statistics. Notifications that were already sent and the reasons in decision histories are not cleaned up separately.

The interface offers no function to delete employees or users completely. If you must remove the complete record, you have to do it in the database.

Employee exit

Under Admin → Organisation → Employees, Exit employee... starts the exit dialog: you set the exit date and choose the "Remaining leave policy" (leave payout, mandatory consumption before exit, or paid release from work). If the date is today or in the past, the user account is deactivated immediately, for a future date the job exit-deactivation-check does it. LeaveFlow shows the remaining balance and a note about the chosen policy. The policy is information for you: LeaveFlow books neither a payout nor a release from work.

You set the default policy in the company settings. The option "Paid release from work (Freistellung)" can only be selected there if an absence type named Freistellung exists.

What data LeaveFlow stores

Area Contents
User account Email address, password hash, role, language, sign-in method, optionally TOTP key and backup codes (hashed), iCal token, Slack ID
Employee Name, employee number, location, department, work schedule, join, exit and probation dates
Absences Absence type, period, hours, status, decision history with reasons
Leave balances Granted and used hours, expiry dates, change history with reason
Notifications In-app notifications with names and periods
Company Name, address, tax and register number, logo, integration credentials (encrypted)
API tokens Only the SHA-256 hash of the token, never the plain text

Absence types with the property "Counts toward the 6-week illness threshold" (called "Krankheit" in the demo data) can represent illness. Note where this is visible:

The team calendar offers no restriction of visibility by role or department. Take that into account in your privacy assessment.

Statistics and anonymity

The statistics dashboard hides departments with fewer than 3 active employees in the charts (anonymity threshold). The PDF export carries the note "anonymisierte Auswertung".

Access protection

Measure Implementation
Roles Admin, manager, employee; access to /admin for admins only
Four-eyes principle Nobody can decide their own request, not even an admin
Sign-in protection Throttling to 5 attempts per 15 minutes, CSRF protection in all forms
2FA TOTP with 10 backup codes, can be enforced company-wide
Session Cookie with Secure, HttpOnly and SameSite=Lax; "Remember me" lasts 7 days
Passwords At least 10 characters on reset, 12 in the setup wizard; reset links are valid for one hour
Integration credentials Slack token, signing secret and LDAP bind password are stored encrypted in the database

External connections

The pages load their scripts and stylesheets from your own instance, there are no embedded trackers or third-party fonts. Outbound connections only occur in these cases:

Exports

Export Where Contents
Employee list (CSV) Admin → Employees → Export CSV Name, employee number, location, status, weekly hours, joined, left, login
Leave balances (CSV) Admin → Leave balances → Export as CSV Eight columns: Employee, Employee number, Year, Type, Granted (h), Used (h), Remaining (h), Expires (ISO)
Statistics (PDF) Admin → Statistics → Export as PDF Key figures and department overview