CSV Import
Bulk-import employees from a CSV file to quickly onboard multiple team members.
Downloading the Template
- Navigate to Employees.
- Click Import CSV.
- Click Download CSV 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 |
|---|---|
| firstName | Employee's first name |
| lastName | Employee's last name |
| Employee's email address | |
| startDate | Employment start date in YYYY-MM-DD format |
| locations | At least one location name; separate several with ;. See "Location Assignments" below. |
The employee number is not imported. Each employee is assigned a sequential
numeric employee number automatically. Any employeeNumber column in the file is
ignored. Employees are de-duplicated by email address.
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) |
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 required locations column creates location assignments for the employee at import time. Every row must name at least one location, so every imported employee is visible to the Supervisors and Managers of their location.
- 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 or missing column: the row fails validation with
locations: at least one location is required, and (like other validation errors) the whole batch is rejected. - 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
emailalready 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 CSV file and choose your CSV.
- Click Upload.
- The system validates each row.
Every employee that is created gets the next sequential employee number and is automatically sent an invitation email with the role from the role column.
Import Report
After processing, you will see a summary:
- Created — new employees added successfully
- Skipped — rows whose email address already belongs to an existing employee
- 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). - Rows whose email already exists are skipped (matched case-insensitively) — the import never updates existing employees.
- Fix errors and re-import only the failed rows.