Export presets
The built-in export mappings preset-sdworx (SD Worx concept), preset-generic (generic CSV per day), preset-generic-xml and preset-generic-fixed: full JSON, real output, and their limitations.
Last updated: · Markdown version
Two mappings are built in. Use them directly, or copy one in the dashboard ("Export" → "Exportformaten beheren" → "Beginnen vanaf") and edit the copy. See export mappings.
mappingId |
Name | Status | Use for |
|---|---|---|---|
preset-sdworx |
SD Worx — variabele looncomponenten (concept) | Live, concept: wage codes are placeholders | Starting point for SD Worx variable wage components |
preset-generic |
Generiek CSV (per dag) | Live | Spreadsheets, BI, iPaaS, as the base for any custom format |
preset-generic-xml |
Generiek XML (per dag) | Live | Same columns as preset-generic as XML (<timesheet><line>…); see fixed-width and XML |
preset-generic-fixed |
Generiek TXT vaste breedte (per kracht en uursoort) | Live | Fixed-width TXT, Windows-1252: employee number (8, zero-padded), name (30), hour type (20), hours (8, right), date YYYYMMDD (8) |
The CLI default (tt export) and the MCP default (export_preview) are preset-sdworx.
preset-sdworx
One line per employee per hour type for the whole range. Semicolon-separated, Dutch decimals, UTF-8 with BOM, CRLF.
{
"id": "preset-sdworx",
"name": "SD Worx — variabele looncomponenten (concept)",
"format": "csv",
"delimiter": ";",
"includeHeader": true,
"encoding": "utf-8-bom",
"lineEnding": "crlf",
"groupBy": ["employeeNumber", "hourType"],
"columns": [
{ "header": "Werknemersnummer", "source": "employeeNumber" },
{ "header": "Naam", "source": "employeeName" },
{ "header": "Looncomponent", "source": "hourType", "transform": { "kind": "map", "table": "wageCodes" } },
{ "header": "Aantal", "source": "minutes", "transform": { "kind": "hours_decimal", "decimals": 2, "decimalSeparator": "," } },
{ "header": "Bedrag", "source": "amountCents", "transform": { "kind": "cents_decimal", "decimalSeparator": "," } },
{ "header": "Ingangsdatum", "source": "date", "transform": { "kind": "date", "format": "DD-MM-YYYY" } }
],
"tables": {
"wageCodes": {
"normal": "[CODE_NORMAAL]", "overtime_125": "[CODE_OW125]", "overtime_150": "[CODE_OW150]",
"ort_night": "[CODE_ORT_NACHT]", "ort_evening": "[CODE_ORT_AVOND]", "ort_saturday": "[CODE_ORT_ZATERDAG]", "ort_sunday": "[CODE_ORT_ZONDAG]",
"holiday": "[CODE_FEESTDAG]", "allowance_travel": "[CODE_REISKOSTEN]",
"expense_km": "[CODE_KM]", "expense_travel_time": "[CODE_REISUREN]", "expense_public_transport": "[CODE_OV]",
"expense_parking": "[CODE_PARKEREN]", "expense_meal": "[CODE_MAALTIJD]", "expense_other": "[CODE_OVERIG]",
"leave_vacation": "[CODE_VAKANTIE]", "leave_sick": "[CODE_ZIEK]", "leave_special": "[CODE_BIJZONDER]", "leave_unpaid": "[CODE_ONBETAALD]"
}
},
"validation": [
{ "column": "Werknemersnummer", "required": true, "pattern": "^\\d+$" },
{ "column": "Looncomponent", "required": true },
{ "column": "Aantal", "required": true, "min": 0, "max": 400 }
]
}
Real preview output (week 2026-11-30, two approved days of 8.00 h and 7.50 h):
Werknemersnummer;Naam;Looncomponent;Aantal;Bedrag;Ingangsdatum
1004;Sanne Janssen;[CODE_NORMAAL];15,50;;01-12-2026
Before going live:
- Copy the preset and replace every
[CODE_…]with your SD Worx wage component codes. Check the column names and order against your SD Worx import template with your SD Worx consultant. The preset is a concept until the real template is confirmed. - Hour types missing from
wageCodes(for example custom rule-pack types orallowance_<code>) become empty, and therequiredrule on "Looncomponent" then blocks the commit. Add them. - "Ingangsdatum" is the first day of each group (see grouping). If SD Worx expects the period start, keep exporting exactly one payroll period per run.
- Employee numbers must be digits only (
^\d+$).
Guide: SD Worx integration.
preset-generic
One line per person × day × hour type, with ISO dates and decimal hours using a point.
{
"id": "preset-generic",
"name": "Generiek CSV (per dag)",
"format": "csv",
"delimiter": ";",
"includeHeader": true,
"encoding": "utf-8-bom",
"lineEnding": "crlf",
"columns": [
{ "header": "employee_number", "source": "employeeNumber" },
{ "header": "employee_name", "source": "employeeName" },
{ "header": "client", "source": "clientName" },
{ "header": "placement", "source": "placementRef" },
{ "header": "date", "source": "date", "transform": { "kind": "date", "format": "YYYY-MM-DD" } },
{ "header": "hour_type", "source": "hourType" },
{ "header": "hours", "source": "minutes", "transform": { "kind": "hours_decimal", "decimals": 2 } }
],
"tables": {},
"validation": [{ "column": "employee_number", "required": true }]
}
Real committed output:
employee_number;employee_name;client;placement;date;hour_type;hours
1004;Sanne Janssen;Bakkerij Ruijters;PL-2026-104;2026-12-01;normal;8.00
1004;Sanne Janssen;Bakkerij Ruijters;PL-2026-104;2026-12-02;normal;7.50
Limitations:
- No amount column. Expense and allowance lines (
expense_*,allowance_*) appear withhours0.00(or travel-time hours), and their money amount is lost. Copy the preset and add{"header":"amount","source":"amountCents","transform":{"kind":"cents_decimal"}}when you export expenses. - Leave lines have an empty
clientandplacement.
XLSX and JSON
Every committed run can be downloaded from the dashboard ("Export" → previous exports) as the mapped file, as XLSX (?as=xlsx, the same rows in one sheet) or as JSON (?as=json, an array of objects keyed by header). Over the API, GET /exports/runs/{id}/file returns the mapped file. For JSON-shaped data, use pay_lines from GET /exports/runs/{id}.