Automatisation de sauvegarde Clockify vers GitHub

Ce workflow n8n offre une solution automatisée pour sauvegarder les rapports détaillés de Clockify dans un dépôt GitHub. En récupérant les données de plusieurs mois, il assure une conservation à long terme des informations critiques sur le suivi du temps. Cette automatisation élimine le besoin de téléchargements manuels fastidieux, réduit les erreurs humaines et garantit que vos données sont toujours à jour et accessibles depuis votre dépôt GitHub.

91,621 vues
22,207 copies
Intégration

Documentation Complète

📋 Automatisation de sauvegarde Clockify vers GitHub

💡 Description

Ce workflow n8n offre une solution automatisée pour sauvegarder les rapports détaillés de Clockify dans un dépôt GitHub. En récupérant les données de plusieurs mois, il assure une conservation à long terme des informations critiques sur le suivi du temps. Cette automatisation élimine le besoin de téléchargements manuels fastidieux, réduit les erreurs humaines et garantit que vos données sont toujours à jour et accessibles depuis votre dépôt GitHub.

📈 Impact & ROI: En automatisant la sauvegarde des rapports Clockify vers GitHub, ce workflow réduit le risque de perte de données et améliore l'efficacité opérationnelle. Les utilisateurs peuvent consacrer plus de temps à l'analyse des données plutôt qu'à leur gestion, optimisant ainsi la productivité globale.

🚀 Fonctionnalités Clés

  • ✅ Automatisation complète du processus de sauvegarde
  • ✅ Sauvegarde mensuelle détaillée des rapports
  • ✅ Intégration fluide avec GitHub pour la gestion des versions
  • ✅ Surveillance continue des changements dans les données

📊 Architecture Technique

21
Nodes
13
Connexions
2
Services

🔌 Services Intégrés

ClockifyGitHub

🔧 Composition du Workflow

NodeTypeDescription
Extract from FileextractFromFileTraitement des données
Compare DatasetscompareDatasetsTraitement des données
Stop and ErrorstopAndErrorTraitement des données
GlobalssetTraitement des données
Set month indexessetTraitement des données
Split Out indexessplitOutDivision des données en plusieurs branches
Set intervalssetTraitement des données
Skip empty reportsfilterTraitement des données
Get first workspaceclockifyCondition logique pour router le flux
Get detailed monthly reporthttpRequestRequête HTTP vers une API externe
Check if file exists in GitHubgithubTraitement des données
Point to new datasetTraitement des données
Check for 404 error messageifCondition logique pour router le flux
Update file in GitHubgithubTraitement des données
Create file in GitHubgithubTraitement des données
Schedule TriggerscheduleTriggerTraitement des données
Sticky Note3stickyNoteTraitement des données
Sticky Note4stickyNoteTraitement des données
Sticky NotestickyNoteTraitement des données
Sticky Note1stickyNoteTraitement des données
Sticky Note2stickyNoteTraitement des données

📖 Guide d'Implémentation

  1. Import du workflow: Téléchargez le fichier JSON et importez-le dans votre instance n8n
  2. Configuration des credentials: Configurez les accès pour chaque service utilisé
  3. Personnalisation: Adaptez les paramètres selon vos besoins spécifiques
  4. Test: Exécutez le workflow en mode test pour vérifier le bon fonctionnement
  5. Activation: Activez le workflow pour une exécution automatique

🏷️ Tags

ClockifyGitHubsauvegarde

Structure JSON

Voir le code JSON complet
{
    "id": "k22TSNIZXHaQ9rGr",
    "meta": {
        "instanceId": "fb8bc2e315f7f03c97140b30aa454a27bc7883a19000fa1da6e6b571bf56ad6d",
        "templateCredsSetupCompleted": true
    },
    "name": "Clockify Backup Template",
    "tags": [
        {
            "id": "RKga6I6NviNI12bx",
            "name": "template",
            "createdAt": "2024-09-19T19:09:21.997Z",
            "updatedAt": "2024-09-19T19:09:21.997Z"
        }
    ],
    "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
        },
        {
            "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
        },
        {
            "id": "831ad368-6a46-4dd4-bb6c-8ea46200cdf0",
            "name": "Stop and Error",
            "type": "n8n-nodes-base.stopAndError",
            "position": [
                880,
                700
            ],
            "parameters": {
                "errorMessage": "={{ $json.error }}"
            },
            "typeVersion": 1
        },
        {
            "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
        },
        {
            "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
        },
        {
            "id": "f541d535-80d9-439d-8543-9c3cb156a5ff",
            "name": "Split Out indexes",
            "type": "n8n-nodes-base.splitOut",
            "position": [
                -220,
                480
            ],
            "parameters": {
                "options": [],
                "fieldToSplitOut": "monthIndex"
            },
            "typeVersion": 1
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "id": "824bf2c6-9159-40ec-83f3-3f0b8d87c208",
            "name": "Get detailed monthly report",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                220,
                480
            ],
            "parameters": {
                "url": "=https:\/\/reports.api.clockify.me\/v1\/workspaces\/{{ $('Globals').item.json.workspace_id }}\/reports\/detailed",
                "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": "predefinedCredentialType",
                "nodeCredentialType": "clockifyApi"
            },
            "credentials": {
                "clockifyApi": {
                    "id": "CMJ0LAYOs143GAXw",
                    "name": "Clockify (octionictest)"
                }
            },
            "typeVersion": 4.2
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        },
        {
            "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
        }
    ],
    "active": false,
    "pinData": [],
    "settings": {
        "executionOrder": "v1"
    },
    "versionId": "34ab93f2-a965-42ac-bd44-478c19a0f7d6",
    "connections": {
        "Globals": {
            "main": [
                [
                    {
                        "node": "Set month indexes",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Set intervals": {
            "main": [
                [
                    {
                        "node": "Get detailed monthly report",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Compare Datasets": {
            "main": [
                [
                    {
                        "node": "Update file in GitHub",
                        "type": "main",
                        "index": 0
                    }
                ],
                [],
                []
            ]
        },
        "Schedule Trigger": {
            "main": [
                [
                    {
                        "node": "Get first workspace",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract from File": {
            "main": [
                [
                    {
                        "node": "Compare Datasets",
                        "type": "main",
                        "index": 1
                    }
                ]
            ]
        },
        "Point to new data": {
            "main": [
                [
                    {
                        "node": "Compare Datasets",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Set month indexes": {
            "main": [
                [
                    {
                        "node": "Split Out indexes",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Split Out indexes": {
            "main": [
                [
                    {
                        "node": "Set intervals",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Skip empty reports": {
            "main": [
                [
                    {
                        "node": "Create file in GitHub",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get first workspace": {
            "main": [
                [
                    {
                        "node": "Globals",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Check for 404 error message": {
            "main": [
                [
                    {
                        "node": "Skip empty reports",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Stop and Error",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get detailed monthly report": {
            "main": [
                [
                    {
                        "node": "Check if file exists in GitHub",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Check if file exists in GitHub": {
            "main": [
                [
                    {
                        "node": "Point to new data",
                        "type": "main",
                        "index": 0
                    },
                    {
                        "node": "Extract from File",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Check for 404 error message",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        }
    }
}
                                

Workflows Similaires

Optimisation de la gestion des Pull Requests avec Pipedrive

Ce workflow permet d'automatiser le suivi des Pull Requests GitHub en les intégrant directement dans Pipedrive. Lorsqu'...

Synchronisation Automatisée des Événements Discord et Google Calendar

Ce workflow puissant automatise la synchronisation des événements programmés sur Discord avec Google Calendar, garant...

Automatisez les commandes Squarespace vers Google Sheets

Ce workflow automatise le processus de récupération des commandes de Squarespace et leur enregistrement dans Google Sh...