Importing data

Bring entries in from Toggl Track, Clockify, or any CSV — with a dry-run preview before anything is written.

Settings → Import moves your history into Tick in three steps: pick a source and file → review a dry-run preview (nothing is written yet) → commit. Files up to 5 MB are accepted.

Behind a reverse proxy, make sure the proxy allows a body that big — both shipped configs set an 8 MB limit. The commit step is one of the operations demo mode blocks; preview keeps working there.

Supported formats

Toggl Track

Export from Toggl via Reports → Detailed → Export → CSV. Keeps client, project, task, tags and the billable flag. Expected columns:

Email, Client, Project, Task, Description, Billable,
Start date, Start time, End date, End time, Duration, Tags

Clockify

Export via Reports → Detailed → Export → Save as CSV. Keeps project, client, task, tags and the billable flag. Expected columns:

Project, Client, Description, Task, Tags, Billable,
Start Date, Start Time, End Date, End Time, Duration (h)

Generic CSV

Anything else — a spreadsheet, another tracker, a script. Header row:

ColumnRequiredFormat
namenoentry description
startyesISO datetime, e.g. 2025-03-14T09:00:00
endyesISO datetime; must be after start
clientnoclient name
projectnoproject name
tasknotask name
tagsnocomma- or semicolon-separated
billablenotrue/false, yes/no, 1/0
rateno$/h, becomes the entry's rate override

The CSV parser is forgiving about the mechanics: UTF-8 BOM, quoted fields, escaped quotes (""), commas and newlines inside quotes, and CRLF/LF/CR line endings all work.

The preview

Uploading runs the whole import as a dry run and shows:

  • Entry count and the date range they span.
  • Catalog reconciliation: which clients, projects, tasks and tags will be matched to existing rows (by case-insensitive name, within your org, trash excluded) and which will be created.
  • The first 10 rows as they will land.
  • Warnings: rows that will be skipped, each with its line number and reason (unparseable dates, end ≤ start, …). Bad rows never abort the import — they are simply left out, and the commit result reports the skip count.

After commit

Commit creates the missing catalog rows, inserts the entries (each pointing at its deepest reference per Rule 1), attaches tags, and reports what happened: entries inserted, created vs matched counts per entity, and rows skipped. Imported entries behave exactly like native ones — rates resolve per Rule 2 unless the row carried an explicit rate override.