Tidsrapporter ska inte kännas sköra. Men när någon uppdaterar en post i efterhand (eller en kund ifrågasätter en siffra) fastnar du i att leta igenom exporter, skärmdumpar och “vad stod det förra veckan?”-meddelanden.
Det är här Clockify GitHub-backuper börjar betala sig. Byråägare får färre fakturadiskussioner, ops-ansvariga får mer strukturerad månadsrapportering, och konsulter får äntligen ett spår som inte ligger i någons inkorg.
Det här arbetsflödet sparar automatiskt dina månatliga Clockify-rapporter i ett privat GitHub-repo som versionshanterade filer, så att du kan spåra ändringar över tid och plocka fram en revisionsredo ögonblicksbild när du behöver den.
Så fungerar den här automatiseringen
Hela n8n-arbetsflödet, från trigger till slutresultat:
n8n Workflow Template: Clockify till GitHub, versionshanterade rapportkopior
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Extract from File", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/compare.svg' width='40' height='40' /></div><br/>Compare Datasets"]
n2@{ icon: "mdi:location-exit", form: "rounded", label: "Stop and Error", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Globals", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set month indexes", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out indexes", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set intervals", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Skip empty reports", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/clockify.dark.svg' width='40' height='40' /></div><br/>Get first workspace"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get detailed monthly report"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/github.dark.svg' width='40' height='40' /></div><br/>Check if file exists in GitHub"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Point to new data", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check for 404 error message", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/github.dark.svg' width='40' height='40' /></div><br/>Update file in GitHub"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/github.dark.svg' width='40' height='40' /></div><br/>Create file in GitHub"]
n15@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n3 --> n4
n6 --> n9
n1 --> n13
n15 --> n8
n0 --> n1
n11 --> n1
n4 --> n5
n5 --> n6
n7 --> n14
n8 --> n3
n12 --> n7
n12 --> n2
n9 --> n10
n10 --> n11
n10 --> n0
n10 --> n12
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n15 trigger
class n7,n8,n12 decision
class n9 api
classDef customIcon fill:none,stroke:none
class n1,n8,n9,n10,n13,n14 customIcon
Problemet: tidsrapporter ändras efter att du har exporterat dem
Clockify-data är “live”. Det är bra – tills det inte är det. Folk korrigerar beskrivningar, flyttar tid mellan projekt, uppdaterar taggar eller tidrapporterar i efterhand. Då är din “slutliga” månadsrapport inte längre slutlig, och du får förklara varför förra månadens faktura inte matchar den här månadens export. Det skapar också en tyst risk i verksamheten: ledningsbeslut tas på siffror som kan driva, och ingen vet exakt när de ändrades. Ärligt talat är det så här små fel blir långa, obekväma trådar.
Friktionen bygger på. Den syns på några förutsägbara ställen:
- Du exporterar en rapport, upptäcker sedan att den har redigerats efteråt, och nu kan du inte bevisa vad originalet sa.
- Kunder ber om en uppdelning “per fakturadatum”, och du återskapar historiken från minnet.
- Månadsadmin blir återkommande detektivarbete, särskilt när flera personer rör samma projekt.
- Det finns ingen tydlig diff på vad som ändrades, så tvister blir åsiktsbaserade i stället för bevisbaserade.
Lösningen: dagliga versionshanterade backuper av Clockifys månadsrapporter
Det här arbetsflödet körs dagligen och hämtar rapportdata för din Clockify-arbetsyta via Clockify Reports API. I stället för att spara en enda export som blir inaktuell genererar det en rapportfil per månad (som standard aktuell månad plus de tre föregående). Sedan kontrollerar det ditt privata GitHub-repo för att se om det redan finns en fil för den månaden. Om den gör det jämför arbetsflödet den nyhämtade rapporten med den befintliga filen och uppdaterar bara GitHub när något faktiskt har ändrats. Om filen saknas skapas den, så att dina backuper bygger upp sig själva över tid.
Det börjar med en schemalagd körning, hämtar din primära arbetsyta och expanderar en kort månadslista till enskilda månads-“batcher”. Varje batch beräknar datumintervallet, begär den detaljerade månadsrapporten och skapar eller uppdaterar sedan en versionshanterad fil i GitHub. Slutresultatet är en commit-historik du kan hänvisa till med trygghet.
Det här får du: automatisering vs resultat
| Det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du hanterar en Clockify-arbetsyta och exporterar fyra månadsrapporter (innevarande månad plus tre tidigare) varje dag under intensiva perioder för att hålla fakturor i linje. Om varje export-, namngivnings- och arkiveringssteg tar cirka 5 minuter blir det ungefär 20 minuter per dag. På en månad landar du på cirka 10 timmar repetitivt arbete. Med det här arbetsflödet blir “jobbet” en schemalagd körning och några minuters granskning i GitHub bara när du själv vill. Backuperna sker i bakgrunden och din rapporthistorik förblir intakt.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger funkar bra)
- Clockify som källa för rapportdata från tidsregistrering.
- GitHub för att lagra versionshanterade månadsrapportfiler.
- Clockify API-nyckel (hämta den i dina profilinställningar i Clockify).
Svårighetsgrad: Medel. Du kopplar upp konton, skapar ett privat repo och bekräftar några rapportparametrar som arbetsyta och datumintervall.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett dagligt schema startar allt. n8n kör arbetsflödet automatiskt (dagligen som standard), så backuperna hålls uppdaterade även när teamet glömmer rapporteringen.
Din Clockify-arbetsyta identifieras. Arbetsflödet hämtar först den primära arbetsytan och sätter sedan några globala värden som används under körningen (som var filer ska sparas och vilka månader som ska bearbetas).
Senaste månaderna expanderas till en kort “att göra”-lista. Det tilldelar månadsindex och delar upp dem i enskilda poster, beräknar sedan varje månads start- och slutdatum innan den detaljerade månadsrapporten begärs via HTTP.
GitHub blir din single source of truth för historik. För varje månad hittar arbetsflödet motsvarande fil i GitHub, jämför den nyhämtade rapporten med det som redan är lagrat och uppdaterar eller skapar sedan filen. Tomma rapporter filtreras bort så att du inte skräpar ner repot.
Du kan enkelt ändra antalet månader som backas upp för att täcka ett längre intervall utifrån dina behov. Se hela implementeringsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera den schemalagda triggern
Ställ in schemat som startar arbetsflödet varje dag.
- Lägg till noden Scheduled Run Trigger och öppna dess inställningar.
- Ställ in schemaregeln så att den triggar vid
triggerAtHour: 5så att den körs dagligen kl. 5:00. - Anslut Scheduled Run Trigger till Fetch Primary Workspace.
Steg 2: Anslut Clockify och definiera globala inställningar
Hämta arbetsytan och definiera globala variabler som används i hela arbetsflödet.
- Konfigurera Fetch Primary Workspace med Resource inställt på
workspaceoch Limit inställt på1. - Autentiseringsuppgifter krävs: Anslut era
clockifyApi-autentiseringsuppgifter i Fetch Primary Workspace. - I Define Globals ställer ni in workspace_id till
{{ $json.id }}. - I Define Globals ställer ni in github_repo.owner och github_repo.name till era GitHub-värden för ägare och repository.
- Anslut Fetch Primary Workspace → Define Globals → Assign Month Indices.
Steg 3: Bygg månadsloopen och datumintervall
Skapa en rullande lista med månader och beräkna intervall för rapporter.
- I Assign Month Indices ställer ni in monthIndex till
[0, 1, 2]för att bearbeta aktuell månad och de två föregående. - I Expand Month List ställer ni in Field to Split Out till
monthIndex. - I Compute Date Range ställer ni in reportName till
=detailed_report_{{ $now.minus($json.monthIndex, 'month').format('yyyy-MM') }}. - Ställ in startDate till
{{ $now.minus($json.monthIndex, 'month').startOf('month').format('yyyy-MM-dd') }}. - Ställ in endDate till
{{ $now.minus($json.monthIndex, 'month').endOf('month').format('yyyy-MM-dd') }}.
Steg 4: Begär Clockify-rapporter och lokalisera GitHub-filer
Hämta månadsdata för rapporten och slå upp befintliga filer i GitHub.
- I Request Monthly Detail ställer ni in URL till
https://reports.api.clockify.me/v1/workspaces/{{ $('Define Globals').item.json.workspace_id }}/reports/detailed. - Ställ in Method till
POSToch JSON Body till{ "dateRangeStart": "{{ $json.startDate }}T00:00:00Z", "dateRangeEnd": "{{ $json.endDate }}T23:59:59.999Z", "detailedFilter": { "page": 1, "pageSize": 50 }, "exportType": "json" }. - Autentiseringsuppgifter krävs: Anslut era
clockifyApi-autentiseringsuppgifter i Request Monthly Detail. - I Locate GitHub File ställer ni in File Path till
reports/{{ $('Compute Date Range').item.json.reportName }}. - Autentiseringsuppgifter krävs: Anslut era
githubApi-autentiseringsuppgifter i Locate GitHub File. - Notera det parallella flödet: Locate GitHub File skickar utdata till både Map New Report Data och Parse File Data parallellt.
Steg 5: Jämför data och uppdatera befintliga rapporter
Tolka befintliga filer, jämför med ny data och uppdatera rapporter vid behov.
- I Map New Report Data ställer ni in data till
{{ $('Request Monthly Detail').item.json.timeentries }}. - I Parse File Data ställer ni in Operation till
fromJsonför att tolka filinnehållet. - I Compare Records ställer ni in Merge By Fields för att jämföra
datamotdata. - I Modify GitHub File ställer ni in File Path till
reports/{{ $('Compute Date Range').item.json.reportName }}. - Ställ in File Content till
{{ JSON.stringify($json.data, null, 2) }}och Commit Message tillUpdate report. - Autentiseringsuppgifter krävs: Anslut era
githubApi-autentiseringsuppgifter i Modify GitHub File.
Steg 6: Skapa nya rapporter när filer saknas
Hantera saknade filer och skapa endast rapporter när det finns data.
- I Detect Missing File bekräftar ni att villkoret kontrollerar att
{{ $json.error }}innehållercould not be found. - I Filter Empty Reports säkerställer ni att villkoret kontrollerar att
{{ $json.timeentries }}ärnotEmpty. - I Create GitHub File ställer ni in File Path till
reports/{{ $('Compute Date Range').item.json.reportName }}. - Ställ in File Content till
{{ JSON.stringify($json.timeentries, null, 2) }}och Commit Message tillCreate report. - Autentiseringsuppgifter krävs: Anslut era
githubApi-autentiseringsuppgifter i Create GitHub File.
Steg 7: Lägg till felhantering
Stoppa arbetsflödet när fel inte är relaterade till saknade filer.
- Verifiera att Locate GitHub File har beteendet Continue On Fail (den skickar utdata till felgrenen när filen saknas).
- Anslut falsk-vägen från Detect Missing File till Halt on Error.
- I Halt on Error ställer ni in Error Message till
{{ $json.error }}.
Steg 8: Testa och aktivera ert arbetsflöde
Validera körningen och slå på schemat.
- Klicka på Execute Workflow för att köra Scheduled Run Trigger manuellt.
- Bekräfta att Request Monthly Detail returnerar
timeentriesoch att Locate GitHub File hittar filer eller routar saknade filer korrekt. - Verifiera GitHub-uppdateringar: Modify GitHub File ska committa uppdaterad JSON, eller så ska Create GitHub File skapa en ny fil under
reports/. - Ställ arbetsflödet till Active för att aktivera den dagliga körningen kl. 5:00.
Vanliga fallgropar
- GitHub-inloggningar kan löpa ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera först token-scope för repo-åtkomst och n8n-skärmen för Credentials.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera output i all evighet.
Vanliga frågor
Cirka 30 minuter när dina API-nycklar och repot är på plats.
Nej. Du kommer mest att koppla konton och klistra in API-nycklar. Logiken i arbetsflödet är redan byggd, så du konfigurerar – du programmerar inte.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer startar på 20 USD/månad för högre volym. Du behöver också räkna in användning av Clockify och GitHub, vilket normalt är minimalt för små månadsfiler.
Två alternativ: n8n Cloud (hanterad, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och hanterar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, men gör det med eftertanke. Ändra månadslistan i delarna “Assign Month Indices” och “Expand Month List” så att den genererar 12 poster i stället för 4. Om du också byter filnamn (till exempel per kund eller per arbetsyta) uppdaterar du mappningssteget som förbereder GitHub-filnamnet före “Locate GitHub File”. Vanliga justeringar är att gå från dagliga till veckovisa körningar, spara JSON i stället för CSV och skriva till en annan branch för godkännanden.
Oftast handlar det om en utgången eller felaktig API-nyckel, så generera en ny i Clockify och uppdatera inloggningen i n8n. Det kan också vara behörighetsrelaterat om nyckeln inte har åtkomst till arbetsytan du riktar in dig på. En sak till: säkerställ att Reports API-endpointen du använder matchar din Clockify-plan och att arbetsyte-ID:t som hämtas är det du förväntar dig.
Betydligt fler än vad de flesta små team behöver. Med n8n Cloud Starter begränsas du av antalet körningar per månad, men en daglig körning som backar upp fyra månader är fortfarande ganska lätt. Om du kör egen hosting finns ingen körningsgräns (det beror på din server), och det här arbetsflödet är mest API-anrop plus filuppdateringar.
Ofta, ja, eftersom logiken “jämför och uppdatera” är viktig här och du vill inte betala extra för flerstegs-branchning. n8n hanterar också loopar bra (bearbeta flera månader i en körning) och mönster för filjämförelse som blir klumpiga i enklare verktyg. Zapier eller Make kan fortfarande fungera om du bara backar upp en export och inte bryr dig om diffar, commits eller versionshistorik. Om du behöver att revisionsspåret håller i en kunddialog är GitHub-versionering hela poängen. Prata med en automationsexpert om du vill ha hjälp att välja den enklaste setupen.
När det här väl rullar slutar tidsrapporter vara en återkommande brandövning. Du får ett levande revisionsspår i GitHub och kan lägga tiden på arbete som faktiskt driver verksamheten framåt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.