Skip to main content

CSV Import

Bulk-import employees from a CSV file to quickly onboard multiple team members.

Downloading the Template​

  1. Navigate to Employees.
  2. Click Import CSV.
  3. 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​

ColumnDescription
firstNameEmployee's first name
lastNameEmployee's last name
emailEmployee's email address
startDateEmployment start date in YYYY-MM-DD format
locationsAt least one location name; separate several with ;. See "Location Assignments" below.
note

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​

ColumnAccepted Values
phonePhone number
endDateYYYY-MM-DD
employmentTypepermanent or fixed_term
payTypehourly or monthly
payGroupPay group code (e.g., "A", "B")
experienceMonthsNumber of months
baseHourlyRateDecimal number
monthlySalaryDecimal number
workingTimeModel2_week, 3_week, equalization_2_week, equalization_3_week, annual_2_week, or annual_3_week. See "Working-time model and contract hours" below.
contractPeriodHoursDecimal number, per working-time period (not per week). See "Working-time model and contract hours" below.
hasAlcoholLicensetrue or false
isFullTimetrue or false
unionDuesPercentageDecimal number
terminationCauseemployer or employee
rateOverridetrue or false
roleemployee, 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):

ValueSystemPeriodPer-period cap (h)
2_weekRegular2 weeks80
3_weekRegular3 weeks120
equalization_2_weekEqualization2 weeks86
equalization_3_weekEqualization3 weeks129
annual_2_weekAnnual2 weeks90
annual_3_weekAnnual3 weeks135

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_week if 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 PARK and Main Park resolve 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 email already exists in the tenant is skipped entirely — including its locations cell. 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​

  1. Click Select CSV file and choose your CSV.
  2. Click Upload.
  3. 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 true or false (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.