Skip to content

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:

SheetOne row perWhat it carries
EmployeesEmployeePersonal details, address, and the current employment: org unit, manager, employment terms, start and end date, and the weekly work-time norm
AccountsEmployeeThe 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)
ContentsEmployees and account balancesThe entire workspace, every entity type
Readable by a humanYesNo
Can create employeesYesYes
Can delete anythingNeverYes, in Restore mode
Typical useOnboarding, mass changes, migration from another systemBackup, restore, moving a workspace
An Excel import is always a non-destructive update: rows create or update people and set balances. Employees that are not in the file are left completely alone, and nothing is ever deleted.

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 AdminData Import 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 AdminData Export, 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 Employees and Accounts. 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, or Import Date is read as a time account, so a stray column there causes an error.
  • Dates must be written as YYYY-MM-DD — for example 2024-01-01. mTime reads each cell exactly as it is displayed in the sheet, so a cell that shows 01/05/1990 is 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, not 7,4), with no thousands separator. Type numbers as numbers and Excel handles this for you; the risk is with values pasted in as text.
If you build the file by pasting from another system, check the date and number columns before you import. A whole column formatted in your local date style is by far the most common reason for a rejected file.

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:

ValueWhat happens
A UUIDmTime 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 numbermTime 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.
BlankA 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

ColumnRequiredNotes
Employee IDNoSee above. Blank creates a new employee.
Full NameYesRequired on every row, including updates.
EmailNoMust not already belong to a different employee.
Birth DateNoYYYY-MM-DD
PhoneNoFree text
MobileNoFree text
StreetNoFree text
CityNoFree text
Postal CodeNoFree text
CountryNoFree text, e.g. DK
Org UnitNoMust match the name of an existing org unit. Only applied when the row creates an employee.
ManagerNoThe manager’s full name or email address. Must match an existing employee. Only applied on create.
TermsNoMust match the name of existing employment terms. Only applied on create.
Employment StartNoYYYY-MM-DD. Required if any employment column is filled in. Only applied on create.
Employment EndNoYYYY-MM-DD. Requires Employment Start. Only applied on create.
Weekly NormNoContracted hours per week as a decimal, e.g. 37. Only applied on create.
MonSunNoThe 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 Norm alone — the contracted hours per week, e.g. 37. No day-by-day distribution is stored.
  • MonSun alone — the norm is the sum of the days, spread as you wrote it.
  • Both — they must agree. Weekly Norm 37 with 7.4 on Monday to Friday is accepted; 37 with 8 on 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

ColumnRequiredNotes
Employee IDYesSame rules as on the Employees sheet. Cannot be blank here.
Full NameNoPurely a human reference so you can read the sheet. It is ignored on import — rows are matched on Employee ID only.
Import DateNoYYYY-MM-DD. The date the balance is recorded on. Defaults to today.
One column per time accountNoThe 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 days12.5 means twelve and a half days.
  • Hour-based accounts are in minutes450 means 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”.

CellResult
BlankNothing happens — the account is left as it is
0The balance is set to zero
A numberThe 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.

  1. Go to AdminData Import and click Import .

  2. File — pick your .xlsx file. Maximum size is 100 MB.

  3. Parameters — choose which sheet to apply, then click Validate :

    ChoiceWhat is imported
    EverythingBoth sheets. Employees are applied first, so an Accounts row can refer to somebody created in the same import
    EmployeesThe Employees sheet only
    AccountsThe Accounts sheet only
  4. 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 .

  5. 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 Unit column
  • 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 systemColumn in the workbookWatch out for
Staff number / payroll numberEmployee IDUse it on both sheets
NameFull NameRequired
Work emailEmailMust be unique across the workspace
Date of birthBirth DateReformat to YYYY-MM-DD
Department / cost centreOrg UnitMust already exist in mTime, matched by name
Line managerManagerFull name or email of somebody already in mTime
Contract typeTermsMust already exist in mTime, matched by name
Hire dateEmployment StartRequired if you fill in any employment column
Leaving dateEmployment EndOnly for people who have already left
Contracted hours per weekWeekly NormDecimal hours, e.g. 37
Working patternMonSunDecimal hours per day; must add up to the weekly norm
Remaining holidayVacation (days) on the Accounts sheetDecimal days
Flex / overtime balanceFlex (minutes) on the Accounts sheetMinutes — 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, never 450 min or 7,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 Unit column 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.

MessageWhat to do
Employee ID … does not existThe 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 requiredFill it in — it is required on updates too.
email … is already used by another employeeTwo 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 StartAdd the start date, or clear the end date.
Org Unit / Manager / Terms / norm require Employment StartThese 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 unitThe 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 hoursThe two ways of writing the norm disagree. Fix one of them, or delete one.
Weekly Norm must be greater than zeroA 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 size100 MB
Sheets readEmployees and Accounts — others are ignored
DeletesNever

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.