CSV Import
Bulk-import employees from a CSV file to quickly onboard multiple team members.
Downloading the Template
- Navigate to Employees.
- Click "Import".
- Click "Download Template".
The CSV template includes all supported columns with headers.
Preparing the File
Fill in employee data using the columns below.
Required Columns
| Column | Description |
|---|---|
| employeeNumber | Unique identifier for the employee |
| firstName | Employee's first name |
| lastName | Employee's last name |
| Employee's email address | |
| startDate | Employment start date in YYYY-MM-DD format |
Optional Columns
| Column | Accepted Values |
|---|---|
| phone | Phone number |
| endDate | YYYY-MM-DD |
| employmentType | permanent or fixed_term |
| payType | hourly or monthly |
| payGroup | Pay group code (e.g., "A", "B") |
| experienceMonths | Number of months |
| baseHourlyRate | Decimal number |
| monthlySalary | Decimal number |
| workingTimeModel | 2_week, 3_week, equalization_2_week, equalization_3_week, annual_2_week, or annual_3_week. See "Working-time model and contract hours" below. |
| contractPeriodHours | Decimal number, per working-time period (not per week). See "Working-time model and contract hours" below. |
| hasAlcoholLicense | true or false |
| isFullTime | true or false |
| unionDuesPercentage | Decimal number |
| terminationCause | employer or employee |
| rateOverride | true or false |
| role | employee, supervisor, manager, company_admin, or accounting (defaults to employee) |
| locations | Semicolon-separated list of location names (e.g. Main Park;Water Park). See "Location Assignments" below. |
Working-time model and contract hours
The workingTimeModel column specifies the TES working-time framework the employee is on. The six valid values combine a system (regular / equalization / annual) with a period length (2 or 3 weeks):
| Value | System | Period | Per-period cap (h) |
|---|---|---|---|
2_week | Regular | 2 weeks | 80 |
3_week | Regular | 3 weeks | 120 |
equalization_2_week | Equalization | 2 weeks | 86 |
equalization_3_week | Equalization | 3 weeks | 129 |
annual_2_week | Annual | 2 weeks | 90 |
annual_3_week | Annual | 3 weeks | 135 |
The contractPeriodHours column is the contracted working hours per period, not per week. For example, a typical full-time employee on the 3-week model has contractPeriodHours: 112.5 (= 37.5 h/week × 3 weeks). On the 2-week model the same employee has contractPeriodHours: 75 (= 37.5 h/week × 2 weeks).
The CSV importer rejects the row if contractPeriodHours exceeds the per-model cap above.
Legacy CSVs
Prior to April 2026 the columns were workingTimeModel with values equalization/annual (collapsed to the 3-week variant under the hood) and contractWeeklyHours (in weekly hours). Uploading a CSV with the legacy column name or enum values now fails with a descriptive error that points here. Convert:
contractWeeklyHours: 37.5→contractPeriodHours: 112.5(× 3 for 3-week model, × 2 for 2-week).workingTimeModel: equalization→workingTimeModel: equalization_3_week(or_2_weekif the employee is actually on the 2-week variant).workingTimeModel: annual→workingTimeModel: annual_3_week(likewise).
Location Assignments
The optional locations column creates location assignments for the employee at import time.
- Format: one or more location names separated by
;(semicolon). Example:Main Park;Water Park;Restaurant. - Primary location: the first-listed location is marked as the employee's primary assignment; the rest are secondary.
- Case-insensitive match:
main PARKandMain Parkresolve to the same location. - Whitespace: leading/trailing whitespace on each entry is trimmed; consecutive semicolons (
a;;b) are allowed and silently skipped. - Duplicates within one cell (e.g.
Main Park;main park) are deduplicated silently — one assignment is created. - Empty cell: no assignments are created for the row. The employee is imported as before.
- Unknown name: the row fails validation with
locations: unknown location "X". Consistent with other validation errors, the entire batch is rejected (no employees created) and the admin must fix the CSV and re-upload. - Ambiguous name (two locations in the tenant with the same name, case-insensitively): the row fails with
locations: ambiguous location name "X" (matches N locations). Rename one of the locations to disambiguate. - Re-upload behaviour: a CSV row whose
employeeNumberoremailalready exists in the tenant is skipped entirely — including itslocationscell. Re-uploading a CSV to update assignments on existing employees does not work; use the "Add assignment" / "Remove assignment" controls on the employee detail page instead.
Uploading
- Click "Select File" and choose your CSV.
- Click "Upload".
- The system validates each row.
Import Report
After processing, you will see a summary:
- Created — new employees added successfully
- Skipped — duplicate employee numbers that already exist
- Errors — per-row validation issues with the row number and error details
Tips
- Ensure dates are in YYYY-MM-DD format.
- Boolean fields accept
trueorfalse(case-insensitive). - Duplicate employee numbers are silently skipped.
- Fix errors and re-import only the failed rows.