Payroll export

Overview
HR → Payroll Export is the one way payroll data leaves the company: hours, working time account, absences and master data per month (or custom period) and brand — as an overview, as a DATEV LODAS file or as a wage type CSV for the payroll office. Every export is logged: who, when, which period, which brand, which file.
What this page explicitly does not do is calculate. No payslip is produced, no tax and no social security computation. The system supplies the figures; the payroll office does the calculation. That line is drawn on purpose and is not meant as a gap.
The figures come from the Working time module (approved attendance days, working time account) and from Absences. Without the Working time module the export stays blocked — the page says so at the top.
Core tasks
Choose month and brand. Month sets the whole calendar month; From and To can also be chosen freely. Brand narrows the export to one brand — empty means all brands you are allowed to run the payroll export for. From the team view of Working time, Go to payroll export leads here with the month selected there.
Check the status. Below the fields you see whether the period is locked for payroll and how many attendance days are not approved yet. Both are checked again whenever period or brand change.
Create the export. If everything is closed, the export is created straight away. If the period is not locked or days are open, a dialog lists the warnings first — only Export anyway creates the file. Open days are missing from the export (only approved days count), and an unlocked month may still change afterwards.
Get the file. The result shows the overview per employee; above it is the download of the file in the chosen format — under exactly the name recorded in the log. For the DATEV and wage type formats, the overview can also be downloaded as CSV.
Look it up in the log. Every run — from this page, via the API/MCP or as the monthly run — is in the log, including the checksum of the file. That lets you prove later which file the payroll office received.
Fields in detail
The form has five inputs. Everything else comes from Working time, Absences and the employee records. The grey name after the label is the API field.
Export period
| Field | Required | Values / format | What it does |
|---|---|---|---|
From from | yes | Date | First day of the payroll period. Month fills it with the first of the month. |
To to | yes | Date | Last day, inclusive. It must not be before From, and the period may span at most 366 days — anything longer is no longer a payroll run. |
Brand brandId | no | Brand | Only employees and bookings of this brand. Empty = all brands in which you hold the hr.payroll.export permission. A brand without that permission is rejected as if it did not exist. |
Format format | no | csv overview · datev DATEV LODAS · wage-types wage types (CSV) | Which file is produced. Defaults to csv. datev and wage-types apply per payroll month — the period must lie within one calendar month. With datev the result states explicitly that the format must be finalised with the payroll office. |
Export anyway confirmWarnings | no | yes/no | Confirms the warnings (unlocked period, open days). Without confirmation an export with warnings answers with a conflict and produces nothing. The user interface sets it via the dialog. |
What the files contain
Overview (CSV) — per employee employed during the period, even if they left during the year: personnel number, name, type, contract, weekly hours, attendance (hours of approved days), account (change of the working time account), vacation, paid special leave, sick, time off in lieu, unpaid and home office in days.
DATEV LODAS — movement data per personnel number and wage type (industrial hours with decimal comma, days in half steps). Hourly workers get the attendance hours, salaried employees only the change of the working time account, plus paid absences per type.
Wage types (CSV) — the same wage type lines as in the DATEV file, as a table with semicolons, decimal comma and UTF-8 with BOM: personnel number, name, month, wage type, key, value, unit. This is the immediately usable route while the DATEV file has not been agreed with the payroll office.
Freelancers are in none of the files. Home office is working time, not a payroll absence. Working days according to the work schedule and public holidays are counted, not calendar days. The wage type numbers are Working time settings.
Internal sales commission appears as its own wage type line in the wage type CSV and the DATEV file (key affiliate_commission, unit euro, wage type from affiliate.payroll_wage_type, default 300): for employees linked as an internal partner in the partner programme, in the month in which the settlement run was paid — each commission exactly once.
Log
Every export is logged; the log has no input fields, it is the evidence:
| Column | Field | What it shows |
|---|---|---|
| Run at | createdAt | When the export ran. |
| Period | from, to | Which period was handed over. |
| Format | format | Which file; on a DATEV run the note externalApprovalPending ("DATEV approval pending"). |
| Brand | brandId, brandScope | The filtered brand, or all brands of the run. |
| Rows | rowCount | How many employee rows the overview had. |
| File | fileName, fileChecksum | File name and SHA-256 checksum — so a file at the payroll office can be matched to this run unambiguously. |
| Warnings | warnings, warningsConfirmed, locked | Which warnings applied at export time and whether someone confirmed "Export anyway". The monthly run only logs them. |
| Run by | createdByName | Who exported; for the monthly run it says "Monthly run". |
A second run over the same period is not a silent replacement but a second entry.
Monthly run
On the 1st of every month a run prepares the closed previous month — across all brands and exactly once per month. It produces the overview, logs it with file and warnings and notifies everyone holding hr.payroll.export. It sends nothing outside; you fetch the file here as usual.
Settings & permissions
- Module
module.hr, plus the Working time module (module.workforce) — that is where the
calculation happens.
- Permission
hr.payroll.export— export and log. It is cut per brand: whoever holds it in one
brand only exports and sees that brand only (and their own runs). The former Working time export permission has been merged into it; whoever held it now holds this one.
- Locking the month happens in the Working time team view
(workforce.period_lock.manage) — which also links here.
- Sick days and vacation days follow the absence types, see HR settings.
FAQ & troubleshooting
A dialog with warnings appears when exporting. The period is not locked or there are attendance days without approval. Cleanest route: approve the days and lock the month in the team view, then export. If it has to happen earlier, confirm with Export anyway — the log records the confirmation.
The hours look too low. Only approved attendance days count. The number of open days is shown below the fields.
A brand cannot be exported ("not found"). You do not hold the hr.payroll.export permission in that brand.
DATEV or wage types report "per payroll month". Both formats apply to exactly one calendar month. Choose the month or a period within one month.
An employee is missing from the export. Check period and brand: included is whoever was employed during it and belongs to the brand. Freelancers are deliberately not included.
A row shows a long letter code instead of the personnel number. Then no personnel number is stored on the employee. Add it, otherwise the payroll office cannot match the row.
Can we produce the payslips directly? No. The module supplies the figures; the calculation stays with the payroll office.