Workflow: Clockify Backup Template
Integrations: clockify, compareDatasets, extractFromFile, filter, github, httpRequest, if, scheduleTrigger, set, splitOut, stickyNote, stopAndError

{"id": "k22TSNIZXHaQ9rGr", "meta": {"instanceId": "workflow-8909a408", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:55.743000", "updatedAt": "2025-09-29T07:07:55.743005", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "name": "Clockify Backup Template", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "nodes": [{"id": "24115363-9a03-4f8a-aa6e-2a9d4247f035", "name": "Extract from File", "type": "n8n-nodes-base.extractFromFile", "position": [660, 400], "parameters": {"options": {}, "operation": "fromJson"}, "typeVersion": 1, "notes": "This extractFromFile node performs automated tasks as part of the workflow."}, {"id": "11aa4b51-98f9-4df8-b2d2-6757fe686894", "name": "Compare Datasets", "type": "n8n-nodes-base.compareDatasets", "position": [880, 280], "parameters": {"options": {}, "mergeByFields": {"values": [{"field1": "data", "field2": "data"}]}}, "typeVersion": 2.3, "notes": "This compareDatasets node performs automated tasks as part of the workflow."}, {"id": "831ad368-6a46-4dd4-bb6c-8ea46200cdf0", "name": "Stop and Error", "type": "n8n-nodes-base.stopAndError", "position": [880, 700], "parameters": {"errorMessage": "={{ $json.error }}"}, "typeVersion": 1, "notes": "This stopAndError node performs automated tasks as part of the workflow."}, {"id": "2f838fc8-96bf-4111-aaba-743e0c88b688", "name": "Globals", "type": "n8n-nodes-base.set", "position": [-660, 480], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "6bd5904d-0218-4075-a767-d4b659def9b0", "name": "workspace_id", "type": "string", "value": "={{ $json.id }}"}, {"id": "63fa6231-6c5b-414f-b813-18f7dd5c33e9", "name": "github_repo.owner", "type": "string", "value": ""}, {"id": "be2530d7-b2b5-41c5-af19-ab8d27f18e2e", "name": "github_repo.name", "type": "string", "value": ""}]}}, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "bea9590e-355e-410a-bc4b-ae777efb9f15", "name": "Set month indexes", "type": "n8n-nodes-base.set", "position": [-440, 480], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "ad278249-5320-4ffa-8d75-e47194c83e58", "name": "monthIndex", "type": "array", "value": "=[0, 1, 2]"}]}}, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "f541d535-80d9-439d-8543-9c3cb156a5ff", "name": "Split Out indexes", "type": "n8n-nodes-base.splitOut", "position": [-220, 480], "parameters": {"options": {}, "fieldToSplitOut": "monthIndex"}, "typeVersion": 1, "notes": "This splitOut node performs automated tasks as part of the workflow."}, {"id": "76c74727-d338-4a61-9bf2-e97893721995", "name": "Set intervals", "type": "n8n-nodes-base.set", "position": [0, 480], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "7f5ff2ee-b93c-4121-b3dc-ce592513db88", "name": "reportName", "type": "string", "value": "=detailed_report_{{ $now.minus($json.monthIndex, 'month').format('yyyy-MM') }}"}, {"id": "ea571bdb-8f51-4852-9fda-55ff1a929d1f", "name": "startDate", "type": "string", "value": "={{ $now.minus($json.monthIndex, 'month').startOf('month').format('yyyy-MM-dd') }}"}, {"id": "e88726c4-1eb8-4f29-9805-7b0a5ee484a4", "name": "endDate", "type": "string", "value": "={{ $now.minus($json.monthIndex, 'month').endOf('month').format('yyyy-MM-dd') }}"}]}}, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "6d5e917e-68ac-4dbd-98be-4c8ad97fa54a", "name": "Skip empty reports", "type": "n8n-nodes-base.filter", "position": [880, 500], "parameters": {"options": {}, "conditions": {"options": {"version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "f6c69f9b-9e78-4a1e-af33-a1197f35e970", "operator": {"type": "array", "operation": "notEmpty", "singleValue": true}, "leftValue": "={{ $json.timeentries }}", "rightValue": ""}]}}, "typeVersion": 2.2, "notes": "This filter node performs automated tasks as part of the workflow."}, {"id": "60c7a408-74d3-4c6c-ac78-1ed1071e873e", "name": "Get first workspace", "type": "n8n-nodes-base.clockify", "position": [-880, 480], "parameters": {"limit": 1, "resource": "workspace"}, "credentials": {"clockifyApi": {"id": "CMJ0LAYOs143GAXw", "name": "Clockify (octionictest)"}}, "typeVersion": 1, "notes": "This clockify node performs automated tasks as part of the workflow."}, {"id": "824bf2c6-9159-40ec-83f3-3f0b8d87c208", "name": "Get detailed monthly report", "type": "n8n-nodes-base.httpRequest", "position": [220, 480], "parameters": {"url": "{{ $env.BASE_URL }}", "method": "POST", "options": {}, "jsonBody": "={\n  \"dateRangeStart\": \"{{ $json.startDate }}T00:00:00Z\",\n  \"dateRangeEnd\": \"{{ $json.endDate }}T23:59:59.999Z\",\n  \"detailedFilter\": {\n    \"page\": 1,\n    \"pageSize\": 50\n  },\n  \"exportType\": \"json\"\n}", "sendBody": true, "specifyBody": "json", "authentication": "{{ $credentials.predefinedCredentialType }}", "nodeCredentialType": "YOUR_CREDENTIAL_HERE"}, "credentials": {"clockifyApi": {"id": "CMJ0LAYOs143GAXw", "name": "Clockify (octionictest)"}}, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow."}, {"id": "f9323c68-c70f-4f22-ae18-916d5fc1b264", "name": "Check if file exists in GitHub", "type": "n8n-nodes-base.github", "onError": "continueErrorOutput", "position": [440, 480], "parameters": {"owner": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.owner }}"}, "filePath": "=reports/{{ $('Set intervals').item.json.reportName }}", "resource": "file", "operation": "get", "repository": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.name }}"}, "additionalParameters": {}}, "credentials": {"githubApi": {"id": "Eb9yCfVJGJvXD05z", "name": "GitHub (n8n-test-01)"}}, "retryOnFail": false, "typeVersion": 1, "notes": "This github node performs automated tasks as part of the workflow."}, {"id": "41877a6a-ba5b-43bd-8ca3-f8402793685f", "name": "Point to new data", "type": "n8n-nodes-base.set", "position": [660, 200], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "00d2885f-451e-436e-8852-b9ad086d231b", "name": "data", "type": "array", "value": "={{ $('Get detailed monthly report').item.json.timeentries }}"}]}}, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "9f448921-5b9d-4937-a7d9-00a62b1fba99", "name": "Check for 404 error message", "type": "n8n-nodes-base.if", "position": [660, 600], "parameters": {"options": {}, "conditions": {"options": {"version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "6b34c09d-0136-433c-856d-b29a0c3aac34", "operator": {"type": "string", "operation": "contains"}, "leftValue": "={{ $json.error }}", "rightValue": "could not be found"}]}}, "typeVersion": 2.2, "notes": "This if node performs automated tasks as part of the workflow."}, {"id": "900905ed-cff6-4ebb-b0da-67db9f02b301", "name": "Update file in GitHub", "type": "n8n-nodes-base.github", "position": [1100, 180], "parameters": {"owner": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.owner }}"}, "filePath": "=reports/{{ $('Set intervals').item.json.reportName }}", "resource": "file", "operation": "edit", "repository": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.name }}"}, "fileContent": "={{ JSON.stringify($json.data, null, 2) }}", "commitMessage": "Update report"}, "credentials": {"githubApi": {"id": "Eb9yCfVJGJvXD05z", "name": "GitHub (n8n-test-01)"}}, "typeVersion": 1, "notes": "This github node performs automated tasks as part of the workflow."}, {"id": "b928cdb2-b21a-45ff-9bc6-9be483891c4c", "name": "Create file in GitHub", "type": "n8n-nodes-base.github", "position": [1100, 500], "parameters": {"owner": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.owner }}"}, "filePath": "=reports/{{ $('Set intervals').item.json.reportName }}", "resource": "file", "repository": {"__rl": true, "mode": "name", "value": "={{ $('Globals').first().json.github_repo.name }}"}, "fileContent": "={{ JSON.stringify($json.timeentries, null, 2) }}", "commitMessage": "Create report"}, "credentials": {"githubApi": {"id": "Eb9yCfVJGJvXD05z", "name": "GitHub (n8n-test-01)"}}, "typeVersion": 1, "notes": "This github node performs automated tasks as part of the workflow."}, {"id": "04a5b42d-ea1f-4b32-98b5-953e22b26819", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [-1100, 480], "parameters": {"rule": {"interval": [{"triggerAtHour": 5}]}}, "typeVersion": 1.2, "notes": "This scheduleTrigger node performs automated tasks as part of the workflow."}, {"id": "4728f389-df04-4f8d-a436-ac06508d28ba", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [-720, 260], "parameters": {"width": 220, "height": 380, "content": "## Set Globals\n- Define the repository owner (username / organization) and repository name\n- By default the fist available Clockify workspace ID is set. This can be overridden here."}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "2e31df0a-1e67-4a9a-8dc1-42360b4da978", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [-1160, 360], "parameters": {"width": 220, "height": 280, "content": "## Set trigger\nBy default this workflow runs once a day."}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "696721c6-25fc-48f9-b0f5-53d1b6462183", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [-500, 300], "parameters": {"width": 220, "height": 340, "content": "## Set Scope (optional)\nBy default the last three moths are being backed up.\n_0 = current month, 1 = last month, etc._"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "a0ebb845-7472-40ec-b2b5-abc2f118b0e1", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [160, 360], "parameters": {"color": 7, "width": 220, "height": 280, "content": "A detailed report is being retrieved for every month across all entries in the workspace."}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "feb9f194-4c9d-41c8-9b46-3759dcdae9d5", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [380, 100], "parameters": {"color": 7, "width": 920, "height": 780, "content": "The reports are created or updated in GitHub.\n**It is essential to back up previous months as well, as values like tags may still change over time.**"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}], "active": false, "pinData": {}, "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "versionId": "34ab93f2-a965-42ac-bd44-478c19a0f7d6", "connections": {"24115363-9a03-4f8a-aa6e-2a9d4247f035": {"main": [[{"node": "error-handler-24115363-9a03-4f8a-aa6e-2a9d4247f035-aee60a84", "type": "main", "index": 0}]]}, "824bf2c6-9159-40ec-83f3-3f0b8d87c208": {"main": [[{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-599ddd3c", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-3e5303fb", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-b5dbe594", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-dcc40646", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-2c75fbad", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-44b76d13", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-9094a1f0", "type": "main", "index": 0}], [{"node": "error-handler-824bf2c6-9159-40ec-83f3-3f0b8d87c208-7c88429d", "type": "main", "index": 0}]]}}, "description": "Automated workflow: Clockify Backup Template. This workflow integrates 12 different services: filter, httpRequest, stickyNote, scheduleTrigger, splitOut. It contains 23 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Clockify Backup Template. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}