# Import master data

> Office guide: import employees, clients and placements from one CSV file, with a check before anything is saved.

URL: https://timetracking.tech/developers/help/office/import
Last updated: 2026-10-24

Use "Importeren" (Import) to load employees ("Medewerkers"), clients ("Opdrachtgevers") and placements ("Plaatsingen") from one CSV file. This is the fastest way to start, or to bring over changes from your ATS or payroll system.

Exact file specification for developers: [CSV import](https://timetracking.tech/developers/data-in/csv-import).

## Prepare the file

One row per placement (person × client). A person without a client is allowed: then only the person is created or updated.

Download the template in "Importeren", or start from this example (semicolon-separated):

```csv
personeelsnummer;voornaam;achternaam;email;telefoon;opdrachtgever;plaatsing;functie;startdatum;einddatum
1005;Ahmed;Bakker;ahmed@example.com;+31612345678;VDL Montage;PL-2026-105;Monteur;01-11-2026;
```

Column names may be Dutch or English; these are recognised (not case-sensitive):

| Field | Accepted headers |
|---|---|
| Employee number (required) | `personeelsnummer`, `werknemersnummer`, `nummer`, `employee_number` |
| First name (required) | `voornaam`, `first_name` |
| Last name (required) | `achternaam`, `last_name` |
| Email | `email`, `e-mail`, `emailadres` |
| Phone | `telefoon`, `mobiel`, `phone` |
| Client | `opdrachtgever`, `klant`, `inlener`, `client` |
| Placement number | `plaatsing`, `plaatsingsnummer`, `placement`, `placement_ref` |
| Role | `functie`, `role` |
| Start date (required with a client) | `startdatum`, `begindatum`, `start_date` |
| End date | `einddatum`, `end_date` |

Dates: `DD-MM-JJJJ` (e.g. `01-11-2026`) or `JJJJ-MM-DD`. Other columns are ignored and listed as "not recognised".

## How rows are matched

- **Employees** are matched on employee number. Existing → updated (name, email, phone); new → created.
- **Clients** are matched on name, ignoring upper/lower case. A name that does not exist yet creates a new client, so check spelling ("VDL Montage" vs "VDL-Montage" gives two clients).
- **Placements** are matched on placement number. Without a placement number every import creates a new placement, so always fill it.

## Steps

1. Go to "Importeren" and choose the file.
2. Click "Controleer bestand" (check file). Nothing is saved yet. You see per row whether it is OK, plus how many employees, clients and placements would be created or updated.
3. Fix the rows with errors in your spreadsheet. Common messages: "personeelsnummer ontbreekt" (employee number missing), "naam ontbreekt" (name missing), "startdatum ontbreekt of is ongeldig (gebruik DD-MM-JJJJ)" (start date missing or invalid), "einddatum ligt vóór startdatum" (end date before start date).
4. Choose the file again ("Kies het bestand opnieuw als je na de controle importeert") and import.
5. Check "Medewerkers" and "Plaatsingen". Give app access to employees who need the app ("Toegang geven"; requires an email address).

## Common problems

| Problem | Fix |
|---|---|
| Accented letters look wrong | Save the CSV as UTF-8 ("CSV UTF-8" in Excel) |
| Duplicate clients after import | Client names must match exactly (case is ignored). Rename the file values and re-import; remove the duplicate client by hand |
| A placement end date cannot be set | Hours already exist after the new end date; the placement cannot be shortened past them |
| Duplicate placements | Fill the placement number column so later imports update instead of create |

## Automate it

`tt import file.csv` (check) and `tt import file.csv --commit` do the same from the command line; see [CLI](https://timetracking.tech/developers/tools/cli#tt-import). The API endpoint is [`POST /import`](https://timetracking.tech/developers/api/reference#post-import).
