This workflow follows the GitHub → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"name": "GitHub Edit",
"type": "n8n-nodes-base.github",
"position": [
1190,
610
],
"parameters": {
"owner": "YOUR_USERNAME",
"filePath": "={{$json[\"data\"][\"name\"]}}.json",
"resource": "file",
"operation": "edit",
"repository": "REPO_NAME",
"fileContent": "={{JSON.stringify($json[\"data\"])}}",
"commitMessage": "=[N8N Backup] {{$json.data[\"name\"]}} ({{new Date(Date.now()).toLocaleDateString()}})"
},
"credentials": {
"githubApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Get Files",
"type": "n8n-nodes-base.github",
"position": [
200,
500
],
"parameters": {
"owner": "YOUR_USERNAME",
"filePath": "/",
"resource": "file",
"operation": "get",
"repository": "REPO",
"asBinaryProperty": false
},
"credentials": {
"githubApi": "<your credential>"
},
"executeOnce": true,
"typeVersion": 1,
"alwaysOutputData": false
},
{
"name": "Transform",
"type": "n8n-nodes-base.function",
"position": [
400,
500
],
"parameters": {
"functionCode": "return items[0].json.map(item => {\n return {\n json: item\n }\n});\n"
},
"typeVersion": 1
},
{
"name": "Create file",
"type": "n8n-nodes-base.github",
"position": [
1240,
280
],
"parameters": {
"owner": "YOUR_USERNAME",
"filePath": "={{$json[\"data\"][\"name\"]}}.json",
"resource": "file",
"repository": "REPO",
"fileContent": "={{JSON.stringify($node['Merge'].json[\"data\"])}}",
"commitMessage": "=[N8N Backup] {{$json.data[\"name\"]}}.json ({{new Date(Date.now()).toLocaleDateString()}})"
},
"credentials": {
"githubApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
930,
280
],
"parameters": {
"mode": "removeKeyMatches",
"propertyName1": "data.name",
"propertyName2": "data.name"
},
"typeVersion": 1
},
{
"name": "Get workflows",
"type": "n8n-nodes-base.httpRequest",
"position": [
200,
300
],
"parameters": {
"url": "http://localhost:5678/rest/workflows",
"options": {},
"authentication": "basicAuth"
},
"credentials": {
"httpBasicAuth": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Get workflow data",
"type": "n8n-nodes-base.httpRequest",
"position": [
600,
300
],
"parameters": {
"url": "=http://localhost:5678/rest/workflows/{{$json[\"id\"]}}",
"options": {},
"authentication": "basicAuth"
},
"credentials": {
"httpBasicAuth": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Download Raw Content",
"type": "n8n-nodes-base.httpRequest",
"position": [
600,
500
],
"parameters": {
"url": "={{$json[\"download_url\"]}}",
"options": {},
"authentication": "headerAuth",
"responseFormat": "string"
},
"credentials": {
"httpHeaderAuth": "<your credential>"
},
"typeVersion": 1
},
{
"name": "transform",
"type": "n8n-nodes-base.function",
"position": [
390,
300
],
"parameters": {
"functionCode": "const newItems = [];\nfor (item of items[0].json.data) {\n newItems.push({json: item});\n}\nreturn newItems;"
},
"typeVersion": 1
},
{
"name": "Daily at 23:59",
"type": "n8n-nodes-base.cron",
"position": [
-20,
300
],
"parameters": {
"triggerTimes": {
"item": [
{
"hour": 23,
"minute": 59
}
]
}
},
"typeVersion": 1
},
{
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
970,
610
],
"parameters": {
"mode": "removeKeyMatches",
"propertyName1": "data.updatedAt",
"propertyName2": "data.updatedAt"
},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Create file",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "GitHub Edit",
"type": "main",
"index": 0
}
]
]
},
"Get Files": {
"main": [
[
{
"node": "Transform",
"type": "main",
"index": 0
}
]
]
},
"Transform": {
"main": [
[
{
"node": "Download Raw Content",
"type": "main",
"index": 0
}
]
]
},
"transform": {
"main": [
[
{
"node": "Get workflow data",
"type": "main",
"index": 0
}
]
]
},
"Get workflows": {
"main": [
[
{
"node": "transform",
"type": "main",
"index": 0
}
]
]
},
"Daily at 23:59": {
"main": [
[
{
"node": "Get workflows",
"type": "main",
"index": 0
}
]
]
},
"Get workflow data": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
},
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Download Raw Content": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
},
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
githubApihttpBasicAuthhttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Safeguard your n8n workflows from data loss by automatically backing them up to a GitHub repository, ensuring you can always recover or version-control your automations with ease. This is ideal for automation enthusiasts and teams managing multiple workflows who need reliable off-site storage without manual exports. The key step involves fetching workflow data via HTTP requests from the n8n API, transforming it into a suitable format, and committing the updates to GitHub using its integration for seamless file management.
Use this workflow for regular, hands-off backups on a schedule, such as daily or weekly, especially if your n8n instance hosts critical business processes. Avoid it for one-off exports or when dealing with highly sensitive data requiring encrypted storage beyond GitHub's defaults. Common variations include adding filters to backup only specific workflows or integrating notifications via email upon successful commits.
About this workflow
Backup Workflows To Github. Uses github, httpRequest. Scheduled trigger; 11 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Display Project Data On A Smashing Dashboard. Uses httpRequest, github. Scheduled trigger; 24 nodes.
Code Github. Uses manualTrigger, stickyNote, n8n, httpRequest. Event-driven trigger; 25 nodes.
Who is this for? This template is ideal for n8n administrators, automation engineers, and DevOps teams who want to maintain bidirectional synchronization between their n8n workflows and GitHub reposit
Code Github. Uses manualTrigger, stickyNote, httpRequest, noOp. Event-driven trigger; 24 nodes.