{"id":20768492,"url":"https://github.com/pieye/toggl2clockify","last_synced_at":"2025-08-09T23:45:15.677Z","repository":{"id":35142519,"uuid":"183902345","full_name":"pieye/toggl2clockify","owner":"pieye","description":"Migrate data from toggl to clockify","archived":false,"fork":false,"pushed_at":"2022-03-26T11:49:45.000Z","size":80663,"stargazers_count":22,"open_issues_count":4,"forks_count":13,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-30T12:15:17.803Z","etag":null,"topics":["clockify","migration","migration-tool","toggl"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pieye.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-28T11:58:46.000Z","updated_at":"2024-10-04T03:25:56.000Z","dependencies_parsed_at":"2022-07-25T19:17:15.571Z","dependency_job_id":null,"html_url":"https://github.com/pieye/toggl2clockify","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pieye%2Ftoggl2clockify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pieye%2Ftoggl2clockify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pieye%2Ftoggl2clockify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pieye%2Ftoggl2clockify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pieye","download_url":"https://codeload.github.com/pieye/toggl2clockify/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253544991,"owners_count":21925316,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clockify","migration","migration-tool","toggl"],"created_at":"2024-11-17T11:39:11.153Z","updated_at":"2025-05-11T09:32:03.691Z","avatar_url":"https://github.com/pieye.png","language":"Python","readme":"# toggl2clockify\nMigrate data from toggl to clockify\n\n**No warranty that the tools works as expected. Read the following lines CAREFULLY and TEST it on a non productive system!**\n\n# Quick start\n\nMigration consists of six steps (which are described in detail below):\n1. Prepare clockify workspace \n2. Prepare Toggl workspace\n3. Modify **config.json**\n4. Run the migration tool **bin/toggl2clockify.exe** (or **python toggl2clockify.py** on other platforms)\n5. After the import go through **log.txt** and search for \"WARNING\" entries (if you're unsure post a bug report)\n6. Finalize migration (archive projects in clockify which were archived on toggl) by running **bin/toggl2clockify.exe --skipClients --skipProjects --skipEntries --skipTags --doArchive**\n\n# Migration Guide\n\n## Prepare clockify workspace\n![Prepare clockify workspace](clockify_workspace.png)\n\n## Prepare Toggl workspace\n![Prepare Toggl workspace](toggl_workspace.png)\n\n## Configure import process\nOpen the file config.json. The file already contains all required keywords (**TogglKey** , **ClockifyKeys**, **ClockifyAdmin** and **StartTime**).\n\n### Configure toggl and clockify API keys\nYou need your **toggl** API key (https://toggl.com/app/profile) and the **clockify** API keys of **all users** to be migrated (every clockify user has to open https://clockify.me/user/settings ).\nPut the keys in the file **config.json**. \n\nSuppose your toggl API key is ABCDEF and you want to migrate **yourself** (clockify API key 123456) and a **second user** (clockify API key XYZCDF).\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\"]\n}\n```\n\n### Configure clockify admin mail address\nYou have to configure the mail address of **one clockify workspace admin**. Suppose you have admin rights on the clockify workspace and your clockify account mail is **me@info.org**\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\"],\n  \"ClockifyAdmin\": \"me@info.org\"\n}\n```\n\n### Configure start time of import\nEnter the start time from when you want to import your entries. This string is parsed by python's dateutil parser (details: https://dateutil.readthedocs.io/en/stable/parser.html).\n\nSome valid examples:\n\n- \"2012-01-19\"\n- \"2012-01-19 17:21:00\"\n- \"2012-01-19 17:21:00 CST\"\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\"],\n  \"ClockifyAdmin\": \"me@info.org\",\n  \"StartTime\": \"2019-01-19\"\n}\n```\n\n### Configure end time of import (optional)\nEntering an end time until when you want to import entries is optional. If not given, all time entries until NOW are imported. The EndTime string follows the same formation rules as the StartTime string.\n\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\"],\n  \"ClockifyAdmin\": \"me@info.org\",\n  \"StartTime\": \"2019-01-19\"\n  \"EndTime\": \"2019-05-14\"\n}\n```\n\n### Configure workspace of import (optional)\n\nThe last step is to configure the workspace to be imported. You can also give a list of multplie workspaces, but this is an **untested** feature.\nMake sure that the toggl and clockify workspace names match **exactly** (no spaces, UPPER/lower case).\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\"],\n  \"ClockifyAdmin\": \"me@info.org\",\n  \"StartTime\": \"2019-01-19\",\n  \"Workspaces\": [\"myWorkspace\"]\n}\n```\n\n### Clockify fallback user mail\n\nIf there are time entries in the toggl workspace that don't match to any clockify user, you can define a **fallback user mail on the clockify workspace**.\nAll time entries with no clockify user match will than be assigned to this user on the clockify workspace.\nLet's assume that the fallback user has a mail address fallback@company.com and a ClockifyKeys \"ABCDEF\", than you have to add the Clockify API key to the **ClockifyKeys** and the \nmail address of the fallback user to the key **FallbackUserMail**:\n\n```bash\n{\n  \"TogglKey\": \"ABCDEF\",\n  \"ClockifyKeys\": [\"123456\", \"XYZCDF\", \"ABCDEF\"],\n  \"ClockifyAdmin\": \"me@info.org\",\n  \"StartTime\": \"2019-01-19\",\n  \"FallbackUserMail\": \"fallback@company.com\",\n  \"Workspaces\": [\"myWorkspace\"]\n}\n```\n\n\n## Run the import\n\n### Regular import\nIf you're on windows you can run the file directly:\n```bash\nbin/toggl2clockify.exe\n```\n\nOr through python by installing the requirements, and then running it.\n```bash\npip install -r requirements.txt\npython main.py\n```\n\nMake sure you have a file called **config.json in the folder from where you invoke the program**.\n\nRun\n```bash\nbin/toggl2clockify.exe --help \n```\nto get a list of all supported commands.\n\n**You can run the tool as often as you wish. All time entries, projects, \nclients and tags are checked for existance before being added to the clockify workspace**\n\n### Remarks on archived projects\n**If you have archived projects in the toggl workspace, use the flag --doArchive at \nthe very end when you are sure, that all data has been migrated successfully**\n\nYour very last invokation of the import tool should be\n```bash\nbin/toggl2clockify.exe --skipClients --skipProjects --skipTasks --skipEntries --skipTags --doArchive\n```\n\nWhen you try to add time entries for projects, which are **already archived in clockify**, the tool gets messed up:\n- the entries are added without project reference\n- the \"entry exists\" check doesn't work and the time entries will be added as duplicates on each invokation of the tool\n\nBefore you start the migration, you should **unarchive all clockify projects** first.\n\n### Check the log\n\nThe tool creates a file **log.txt** parse the contents for \"INFO\" and \"WARNING\" entries. \nMake sure to understand them or post a bug report if things don't work as expected.\n\n## What is migrated\n- All clients of the workspace\n- All tags of the workspace\n- The following project attributes are migrated:\n    - name\n    - client\n    - isPublic\n    - billable\n    - color\n    - membership\n\n    - NOT MIRGATED: hourlyRate, estimate\n\n- The following time entry attributes are migrated:\n    - start\n    - billable\n    - description\n    - projectID\n    - userID\n    - end\n    - tagIds\n    \n    - NOT MIGRATED: timeInterval (not sure what purpose this serves), isLocked\n    - BUG: Duplicate entry detection has a bug unless setting timezone to \"Z\"\n- All tasks of the workspace\n- User groups\n\n## Clearing the workspace\nYou can use the `--wipeAll` flag to clear the entire workspace. \nThis is useful for development/testing, since the duplication entry detection isn't perfect.\nThis restores the workspace to a blank slate without having to create a new workspace. \nThe program will wipe everything first, then immediately exit.\n\n\n## Development\n\nAfter running `pip install -r requirements.txt`, run:\n\n`pre-commit install`\n\nThis adds a small script that checks your code before commits. \nIt will prevent you from committing unless your code passes formatting and pylint.\n\nTo run the commands individually:\n\nUse black for auto-formatting\n\n```bash\npip install black\nblack .\n```\n\nUse pylint_runner for linting code\n\n```bash\npip install pylint\npip install pylint-runner\npylint_runner\n```\n\n## Building a new version\n\nFor windows, simply navigate to the builder folder and run `build_windows.bat`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpieye%2Ftoggl2clockify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpieye%2Ftoggl2clockify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpieye%2Ftoggl2clockify/lists"}