Excel import
Move people and their balances into mTime with an ordinary Excel workbook — the format to reach for when the data comes out of a payroll or time system you are leaving behind.
Overview
The Simple Excel format is a single .xlsx workbook with two sheets:
| Sheet | One row per | What it carries |
|---|---|---|
| Employees | Employee | Personal details, address, and the current employment: org unit, manager, employment terms, start and end date, and the weekly work-time norm |
| Accounts | Employee | The current balance of every time account — one column per account |
You can open it, read it, and edit it in Excel, Numbers, or Google Sheets. That is the whole point: it is the format for onboarding a company’s employees in bulk, for mass edits, and for a migration from another system.
It is not the same thing as the full workspace backup:
Simple Excel (.xlsx) | Full backup (.zip) | |
|---|---|---|
| Contents | Employees and account balances | The entire workspace, every entity type |
| Readable by a human | Yes | No |
| Can create employees | Yes | Yes |
| Can delete anything | Never | Yes, in Restore mode |
| Typical use | Onboarding, mass changes, migration from another system | Backup, restore, moving a workspace |
Getting a workbook to start from
You have two starting points, and both are better than building the file from scratch — they already contain the exact column headers and your workspace’s live account names.
A blank template. Go to and click Download template
. You get import-template.xlsx with both sheets, all headers, one greyed-out example row to overwrite, and one column per time account configured in your workspace.
A filled export. Go to , choose the Simple Excel format and click Export . You get the same workbook with your current employees and balances already in it. Edit and import it back — the round trip is safe, because the export writes the identifiers and names the import expects.
The export offers three options:
- Employees only — leave out the Accounts sheet
- Anonymize personal data — replace names, emails, and contact details with placeholders
- Employee data scope — export one employee, one org unit, or everyone
How mTime reads the workbook
A few rules apply to the whole file. They are worth reading once, because most failed imports come from here rather than from the data itself.
- The sheets must be named
EmployeesandAccounts. Any other sheet in the workbook is ignored. A workbook with only one of the two sheets is fine. - The sheet names and the column headers are always in English, whatever language you use mTime in. The template and the export write them for you; if you build the file yourself, copy them exactly as they appear in this page.
- Row 1 is the header row. Every following row is data.
- Columns are matched by their header text, not by their position. You can reorder columns freely. Leading and trailing spaces in headers are ignored.
- Completely empty rows are skipped, so trailing blank rows at the bottom of a sheet do no harm.
- Extra columns on the Employees sheet are ignored — handy for keeping a note or your old system’s record number alongside the data. On the Accounts sheet the opposite is true: every column that is not
Employee ID,Full Name, orImport Dateis read as a time account, so a stray column there causes an error. - Dates must be written as
YYYY-MM-DD— for example2024-01-01. mTime reads each cell exactly as it is displayed in the sheet, so a cell that shows01/05/1990is rejected even though Excel considers it a date. The safest approach is to format the date columns as Text and type the dates in ISO form, which is what the template and the export do. - Numbers use a period as the decimal separator (
7.4, not7,4), with no thousands separator. Type numbers as numbers and Excel handles this for you; the risk is with values pasted in as text.
The Employees sheet
The Employee ID column
This one column decides whether a row creates a new person or updates an existing one, and it is what ties the two sheets together. It accepts three kinds of value:
| Value | What happens |
|---|---|
| A UUID | mTime looks up that exact employee and updates them. If no such employee exists, the row is rejected — a UUID is never used to create someone. This is what the export writes. |
| Any other text, such as initials or a staff number | mTime turns it into a stable internal identifier for your workspace. The first import with JD creates a person; every later import with JD updates that same person. |
| Blank | A new employee is created with a brand-new identifier. |
The middle option is the one that matters for a migration. Because EMP-4711 always resolves to the same person in the same workspace, you can:
- reference the same person from both the Employees and the Accounts sheet,
- re-run a corrected file and have it update people rather than duplicate them,
- keep your old system’s staff number as the link between the two systems.
Leave Employee ID blank only when you are importing employees and nothing else. A person created from a blank ID gets a random identifier, so no Accounts row can refer to them, and a second import of the same file creates them all over again.
If your old system’s record numbers happen to look like UUIDs, put a prefix in front of them (LEG-3f2b…) so mTime treats them as text rather than as an mTime identifier.
Column reference
| Column | Required | Notes |
|---|---|---|
Employee ID | No | See above. Blank creates a new employee. |
Full Name | Yes | Required on every row, including updates. |
Email | No | Must not already belong to a different employee. |
Birth Date | No | YYYY-MM-DD |
Phone | No | Free text |
Mobile | No | Free text |
Street | No | Free text |
City | No | Free text |
Postal Code | No | Free text |
Country | No | Free text, e.g. DK |
Org Unit | No | Must match the name of an existing org unit. Only applied when the row creates an employee. |
Manager | No | The manager’s full name or email address. Must match an existing employee. Only applied on create. |
Terms | No | Must match the name of existing employment terms. Only applied on create. |
Employment Start | No | YYYY-MM-DD. Required if any employment column is filled in. Only applied on create. |
Employment End | No | YYYY-MM-DD. Requires Employment Start. Only applied on create. |
Weekly Norm | No | Contracted hours per week as a decimal, e.g. 37. Only applied on create. |
Mon … Sun | No | The hours of the weekly norm spread over the week, as decimals, e.g. 7.4. Only applied on create. |
Org Unit, Manager, and Terms are matched by name, ignoring upper and lower case. The name has to be unique: if two org units are called “Support”, the row is rejected and you have to rename one of them first. These columns reference existing records — an Excel import never creates an org unit, a manager, or a set of employment terms.
What an update changes
When a row matches an existing employee, mTime writes every personal column from that row: name, email, birth date, phone, mobile, and the address.
On an update, a blank cell clears the value, and a column that is missing from the sheet altogether clears it too. A workbook with only Employee ID and Full Name will wipe the email address and the address of everyone it touches.
Always start from a template or an export, and keep all the columns — even the ones you have nothing to put in.
The employment is the exception, and it works the other way round: Org Unit, Manager, Terms, Employment Start, Employment End, Weekly Norm, and the day columns are only used when the row creates a new employee. On an existing employee they are ignored, and their employment is left untouched. To change someone’s employment afterwards, use their employee page or a bulk action.
Employment and the weekly norm
An employee is only given an employment when Employment Start is filled in. Leave it blank and you get a person in the workspace with no employment — occasionally useful, but rarely what you want.
The work-time norm can be given in two ways, and you can combine them:
Weekly Normalone — the contracted hours per week, e.g.37. No day-by-day distribution is stored.Mon…Sunalone — the norm is the sum of the days, spread as you wrote it.- Both — they must agree.
Weekly Norm37with7.4on Monday to Friday is accepted;37with8on five days is rejected.
Hours are decimal hours, not hours and minutes: seven and a half hours is 7.5, not 7.30. Values are rounded to the nearest minute. The norm must be greater than zero, and it describes a single week — repeating multi-week patterns cannot be imported and have to be set up on the employee.
The Accounts sheet
This sheet sets the current balance of each time account — the holiday days, flex hours, and other balances people are bringing with them.
Column reference
| Column | Required | Notes |
|---|---|---|
Employee ID | Yes | Same rules as on the Employees sheet. Cannot be blank here. |
Full Name | No | Purely a human reference so you can read the sheet. It is ignored on import — rows are matched on Employee ID only. |
Import Date | No | YYYY-MM-DD. The date the balance is recorded on. Defaults to today. |
| One column per time account | No | The target balance. See below. |
The account columns
Every remaining column is a time account, named after the account with its unit in parentheses:
Employee ID | Full Name | Import Date | Vacation (days) | Flex (minutes)
EMP-4711 | Jane Doe | 2026-01-01 | 12.5 | 450- The part before the parentheses must match the name of a time account in your workspace, ignoring upper and lower case.
- The unit in parentheses is optional, but when it is there it has to match the account. This is a guard: it stops a column of holiday days from silently landing in an hours account.
- Day-based accounts are in decimal days —
12.5means twelve and a half days. - Hour-based accounts are in minutes —
450means 7 hours 30 minutes. This trips people up; multiply your hours by 60. - Negative balances are allowed, for example a flex account in deficit.
The template and the export both fill these headers in from your workspace, which is the easiest way to get them right.
How a balance is applied
Each filled-in cell sets the balance to that value on Import Date. It is not added to what is already there. The entry shows up in the account’s history with the reason “Excel import”.
| Cell | Result |
|---|---|
| Blank | Nothing happens — the account is left as it is |
0 | The balance is set to zero |
| A number | The balance is set to that number |
Because the value is a target rather than a movement, importing the same file twice does not double anyone’s holiday. It also means a careless import can flatten balances that were correct — the Review step tells you how many balance changes are about to be made, so check that number before you confirm.
Set Import Date to your cut-over date: the day the balances were true in the old system. Anything mTime records after that date is added on top.
Running the import
The wizard is the same one described under Data import, with two differences: mTime recognises an Excel file by its .xlsx extension, and the Merge/Restore choice is replaced by a choice of sheet.
File — pick your
.xlsxfile. Maximum size is 100 MB.Parameters — choose which sheet to apply, then click Validate :
Choice What is imported Everything Both sheets. Employees are applied first, so an Accounts row can refer to somebody created in the same import Employees The Employees sheet only Accounts The Accounts sheet only Review — validation runs on the server without changing anything. You get a count of employees to create and update, a count of balance cells to apply, and a message per rejected row. Fix the file and try again, or click Run import .
Results — the outcome per sheet, with a detailed report you can download.
If validation flags the wrong choice of sheet, go Back and validate again — the file stays on the server and does not need re-uploading.
Importing from another system
This is what the format was built for: taking employees and balances out of a payroll or time-registration system and into mTime. The sequence below keeps the risky parts small and reversible.
1. Build the configuration in mTime first
The Excel import references configuration by name and never creates it. Before you import anything, set up:
- Org units — matching the names you will put in the
Org Unitcolumn - Employment terms — the contract types your people are on
- Time accounts — every balance you intend to carry over, with the right unit
- Holiday calendars and time-off policies, so the balances behave correctly afterwards
Make sure the names are unique. Two org units with the same name will reject every row that points at them.
2. Choose your key
Put your old system’s staff or payroll number in the Employee ID column, on both sheets. This is the single most valuable decision in the whole migration:
- it links each balance row to the right person,
- it makes the import repeatable, so a corrected file updates instead of duplicating,
- it stays a readable link back to the old system if you ever need to reconcile.
3. Map your old fields
Export your source data and map it onto the columns. A typical mapping:
| Data in the old system | Column in the workbook | Watch out for |
|---|---|---|
| Staff number / payroll number | Employee ID | Use it on both sheets |
| Name | Full Name | Required |
| Work email | Email | Must be unique across the workspace |
| Date of birth | Birth Date | Reformat to YYYY-MM-DD |
| Department / cost centre | Org Unit | Must already exist in mTime, matched by name |
| Line manager | Manager | Full name or email of somebody already in mTime |
| Contract type | Terms | Must already exist in mTime, matched by name |
| Hire date | Employment Start | Required if you fill in any employment column |
| Leaving date | Employment End | Only for people who have already left |
| Contracted hours per week | Weekly Norm | Decimal hours, e.g. 37 |
| Working pattern | Mon … Sun | Decimal hours per day; must add up to the weekly norm |
| Remaining holiday | Vacation (days) on the Accounts sheet | Decimal days |
| Flex / overtime balance | Flex (minutes) on the Accounts sheet | Minutes — multiply hours by 60 |
Managers are employees like everybody else, so they come in through the Employees sheet — but they have to be in mTime before the row that points at them is imported. A manager created by the same workbook cannot be referenced in that same import. Either import the management layer first in its own pass, or leave the Manager column empty on the first run and fill it in later on the employee pages.
4. Clean up dates and numbers
Before the first import, go through the file once:
- Date columns show
YYYY-MM-DD. Formatting them as Text and typing the ISO date is the reliable way. - Decimals use a period, not a comma.
- No thousands separators, no units, no stray characters —
450, never450 minor7,5 h. - Hour-based balances converted to minutes.
5. Import in two waves
Do not do it all in one go the first time.
Wave one — people. Import with the Employees sheet selected. Check a handful of employees in the app: are they in the right org unit, on the right terms, with the right weekly norm?
Wave two — balances. Import the same workbook again with the Accounts
sheet selected, with Import Date set to your cut-over date. Check the balances of the same handful of people.
Splitting the migration this way means a mistake in the balance columns cannot damage the employee records you have just verified, and vice versa.
Once you have done a migration or two and trust the file, Everything does both sheets in one pass — employees are always applied before balances, so people created in that import can receive their balances immediately.
6. Check the result
Export the workspace again in the Simple Excel format and compare it with your source file. Anything that did not come across shows up as a difference, and the export is a good record of what the workspace looked like at go-live.
Re-running and corrections
An Excel import is safe to repeat as long as the Employee ID values stay the same. Fix the source file and import it again:
- employees are updated, not duplicated,
- balances are set to the corrected value rather than added on top,
- employees that you removed from the file are left untouched — the import never deletes.
The one thing a second run cannot do is change an employment. Employment columns are only applied when the employee is created, so if you got the org unit or the weekly norm wrong, correct it on the employee page or with a bulk action.
On the roadmap
The workbook carries people and their balances today. Two more parts of a migration are planned but not supported yet:
- Absence — neither recorded absence history nor planned future absence can be imported from the workbook.
- Org units — the
Org Unitcolumn points at an org unit that already exists; building the organisation structure from the file is not possible yet.
If your migration needs one of these, or you have data that does not fit the workbook, contact support through the in-product help system before you start. Tell us what you are moving and we will find the best route for it.
Validation messages
Validation runs before anything is written and reports the sheet and row of every problem. Rows are numbered as they are in Excel, so “Employees row 2” is the first row under the headers.
| Message | What to do |
|---|---|
Employee ID … does not exist | The cell holds a UUID that is not in this workspace. Use initials or a staff number instead, or leave it blank to create the person. |
Full Name is required | Fill it in — it is required on updates too. |
email … is already used by another employee | Two people cannot share an email address. Check for a duplicate row or an old record. |
invalid Birth Date … (expected YYYY-MM-DD) | The cell is not displayed as an ISO date. Reformat the column as Text and retype it. |
Employment End requires Employment Start | Add the start date, or clear the end date. |
Org Unit / Manager / Terms / norm require Employment Start | These live on the employment, so the employment needs a start date. |
unknown or ambiguous org unit … | The name does not match any org unit, or matches more than one. Create or rename it in mTime first. |
unknown or ambiguous manager … | The manager is not in mTime yet, or two employees share that name. Use their email address instead. |
unknown or ambiguous employment terms … | Same, for employment terms. |
Employment terms … are not available for this employment's work country or org unit | The terms exist but are restricted to another country or part of the organisation. Widen their availability or pick different terms. |
Weekly Norm must equal the sum of the Mon–Sun day hours | The two ways of writing the norm disagree. Fix one of them, or delete one. |
Weekly Norm must be greater than zero | A norm of zero is not a norm. Leave the columns empty instead. |
Employee ID is required (Accounts sheet) | Every balance row needs to say whose balance it is. |
employee … not found (Accounts sheet) | Nobody with that ID exists, and no row on the Employees sheet is creating them in this import. Import the Employees sheet first, or use Everything . |
unknown or ambiguous account … | A column header on the Accounts sheet does not match a time account — often a leftover note column, a typo, or the wrong unit in the parentheses. |
invalid amount … | The cell is not a plain number. Remove units, spaces, and thousands separators, and use a period for decimals. |
Limits
| File format | .xlsx (Excel 2007 and later). .xls, CSV, and Numbers files are not accepted |
| Maximum file size | 100 MB |
| Sheets read | Employees and Accounts — others are ignored |
| Deletes | Never |
Permissions
Downloading the template, uploading, and running an Excel import all require the import permission. Producing a Simple Excel workbook from the workspace requires the export permission.