AutomationFlowsWeb Scraping › Automated N8n Workflow Backup to Github with Deletion Tracking

Automated N8n Workflow Backup to Github with Deletion Tracking

ByMarcial Ambriz @marskdev on n8n.io

Remixed Backup your workflows to GitHub from Solomon's work. Check out his templates.

Event trigger★★★★★ complexity31 nodesHTTP RequestGitHubExecute Workflow Triggern8n
Web Scraping Trigger: Event Nodes: 31 Complexity: ★★★★★ Added:

This workflow corresponds to n8n.io template #5898 — we link there as the canonical source.

This workflow follows the Execute Workflow Trigger → 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "638dcc28-8b20-40e6-81fd-96efec4d4111",
      "name": "On clicking 'execute'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        260,
        640
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "287eabd3-013d-41cd-a9c3-ae71b8d26ef9",
      "name": "Return",
      "type": "n8n-nodes-base.set",
      "position": [
        1800,
        1680
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8d513345-6484-431f-afb7-7cf045c90f4f",
              "name": "Done",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "edc8da3b-fcf1-4487-8963-464c18c209b5",
      "name": "Get File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        920,
        1140
      ],
      "parameters": {
        "url": "={{ $json.download_url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "63859d24-34b7-4545-a3fb-fe45b3678cef",
      "name": "If file too large",
      "type": "n8n-nodes-base.if",
      "position": [
        700,
        1160
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "45ce825e-9fa6-430c-8931-9aaf22c42585",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.content }}",
              "rightValue": ""
            },
            {
              "id": "9619a55f-7fb1-4f24-b1a7-7aeb82365806",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8509afb5-c772-445d-af47-de54c9deae6e",
      "name": "isDiffOrNew",
      "type": "n8n-nodes-base.code",
      "position": [
        920,
        1420
      ],
      "parameters": {
        "jsCode": "const orderJsonKeys = (jsonObj) => {\n  const ordered = {};\n  Object.keys(jsonObj).sort().forEach(key => {\n    ordered[key] = jsonObj[key];\n  });\n  return ordered;\n}\n\n// Check if file returned with content\nif (Object.keys($input.all()[0].json).includes(\"content\")) {\n  // Decode base64 content and parse JSON\n  const origWorkflow = JSON.parse(Buffer.from($input.all()[0].json.content, 'base64').toString());\n  const n8nWorkflow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n// No file returned / new workflow\n} else if (Object.keys($input.all()[0].json).includes(\"data\")) {\n  const origWorkflow = JSON.parse($input.all()[0].json.data);\n  const n8nWorkflow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n\n} else {\n  // Order JSON object\n  const n8nWorkflow = $input.all()[1].json;\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n  \n  // Proper formatting\n  $input.all()[0].json.github_status = \"new\";\n  $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n// Return items\nreturn $input.all();"
      },
      "typeVersion": 1
    },
    {
      "id": "ac50a21b-f850-495a-9e41-8fdd075c3c62",
      "name": "Same file - Do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1360,
        1600
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "293179e5-9ef0-4f75-b39c-987ebf13a9b5",
      "name": "File is different",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1360,
        1420
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ab03b5e9-61eb-4512-9675-afd048a761c6",
      "name": "File is new",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1360,
        1240
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a0431fdb-41ff-4bf0-8618-c743d6be159e",
      "name": "Create new file",
      "type": "n8n-nodes-base.github",
      "position": [
        1580,
        1240
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.id}}.json",
        "resource": "file",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "fileContent": "={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}",
        "commitMessage": "={{$('Switch').first().json.name}} ({{$json.github_status}})",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e0a9e1f0-bd40-4009-8945-24a264ddbf0d",
      "name": "Edit existing file",
      "type": "n8n-nodes-base.github",
      "position": [
        1580,
        1420
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.id}}.json",
        "resource": "file",
        "operation": "edit",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "fileContent": "={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}",
        "commitMessage": "={{$('Switch').first().json.name}} ({{$json.github_status}})",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a4d50217-3d8c-48f3-a486-fb3c033fcef4",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1580,
        740
      ],
      "parameters": {
        "options": {
          "reset": "={{ $node[\"Loop Over Items\"].context[\"done\"] }}"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4f529f31-26a2-4f19-b8f3-42ce583b11ad",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        260,
        840
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c8c0bc8a-3538-4c63-8882-3dd846830649",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 371,
        "height": 601,
        "content": "## Backup to GitHub \nThis workflow will backup all instance workflows to GitHub and also deleted it if was deleted in n8n.\n\nThe files are saved `ID.json` for the filename.\n\n### Setup\nOpen `Globals` node and update the values below \ud83d\udc47\n\n- **repo.owner:** your Github username\n- **repo.name:** the name of your repository\n\n\nIf your username was `john-doe` and your repository was called `n8n-backups`:\n\n- repo.owner - john-doe\n- repo.name - n8n-backups\n\n\nThe workflow calls itself using a subworkflow, to help reduce memory usage."
      },
      "typeVersion": 1
    },
    {
      "id": "d527bac6-971b-4be7-8481-97dd023e85e1",
      "name": "Get file data",
      "type": "n8n-nodes-base.github",
      "position": [
        480,
        1160
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $json.repo.owner }}"
        },
        "filePath": "={{ $('Switch').item.json.id }}.json",
        "resource": "file",
        "operation": "get",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $json.repo.name }}"
        },
        "authentication": "oAuth2",
        "asBinaryProperty": false,
        "additionalParameters": {}
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "continueOnFail": true,
      "alwaysOutputData": true
    },
    {
      "id": "6c7b66fa-bfdd-47ea-9161-835415d116dd",
      "name": "Execute Workflow Trigger",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -100,
        1540
      ],
      "parameters": {
        "inputSource": "passthrough"
      },
      "typeVersion": 1.1
    },
    {
      "id": "a3021ade-6778-49df-8ad4-4d43f28d51e2",
      "name": "Execute Workflow",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        1800,
        740
      ],
      "parameters": {
        "mode": "each",
        "options": {},
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "workflowInputs": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e6675677-07ac-48d9-a920-58065cc79d77",
      "name": "Globals",
      "type": "n8n-nodes-base.set",
      "position": [
        480,
        740
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6cf546c5-5737-4dbd-851b-17d68e0a3780",
              "name": "repo.owner",
              "type": "string",
              "value": "john-doe"
            },
            {
              "id": "452efa28-2dc6-4ea3-a7a2-c35d100d0382",
              "name": "repo.name",
              "type": "string",
              "value": "n8n-backup"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fba69d35-d05b-45a1-bdd9-93a83fddf63e",
      "name": "List files",
      "type": "n8n-nodes-base.github",
      "position": [
        1140,
        840
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Globals').item.json.repo.owner }}"
        },
        "resource": "file",
        "operation": "list",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Globals').item.json.repo.name }}"
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 1.1
    },
    {
      "id": "f235efb7-3ff9-497d-bc32-c94f38f76183",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        120,
        1540
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "n8n",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8f6b31b0-a75c-4299-a530-d15b3ff65c9a",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.origin }}",
                    "rightValue": "n8n"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "github",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "09e36861-1120-4343-8d38-4797e9d67eec",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.origin }}",
                    "rightValue": "github"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "7c35c3da-b364-4ad0-b192-3691cb73eb6f",
      "name": "Get many workflows",
      "type": "n8n-nodes-base.n8n",
      "position": [
        700,
        740
      ],
      "parameters": {
        "filters": {},
        "requestOptions": {
          "allowUnauthorizedCerts": true
        }
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "12a90225-5a32-4b69-bee6-d61bc4369eb2",
      "name": "Workflows",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        920,
        840
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "799e5c1f-43aa-4375-b8f2-25a3335ddb18",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        700,
        1420
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "5acad04e-0c07-4663-be6f-d8cdf4ecee4e",
      "name": "Check Status",
      "type": "n8n-nodes-base.switch",
      "position": [
        1140,
        1420
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "new",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "aea200f9-9f83-4e4e-a965-65fddcbb6a5f",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "new"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "different",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "706ebf35-6f74-43b6-9f98-94cf14107947",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "different"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "same",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "30c8c5a8-269f-424a-93ed-d2cbe52acf7c",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{$json.github_status}}",
                    "rightValue": "same"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "a5979392-d277-4580-aa16-09d18e3eb577",
      "name": "isDeleted",
      "type": "n8n-nodes-base.code",
      "position": [
        920,
        1740
      ],
      "parameters": {
        "jsCode": "const workflows = $input.first().json.workflows;\n\nconst some = workflows.some(x => x.id === $input.first().json.name.split(\".\")[0])\n\nreturn [{json: { isDeleted: !some }}];"
      },
      "typeVersion": 2
    },
    {
      "id": "c08dde95-3a3a-4ac1-a92b-c9bcd5c7743b",
      "name": "Delete a file",
      "type": "n8n-nodes-base.github",
      "position": [
        1580,
        1860
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.owner }}"
        },
        "filePath": "={{$('Switch').first().json.name}}",
        "resource": "file",
        "operation": "delete",
        "repository": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Switch').item.json.repo.name }}"
        },
        "commitMessage": "={{$('Switch').first().json.name}} (deleted)",
        "authentication": "oAuth2"
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1e769761-5f93-4d67-b801-e2d6a8443aed",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        1140,
        1740
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bb927e0c-f27b-4dce-80df-8d7611467045",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.isDeleted }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "39ad6ee3-acde-4019-b850-7a8add4e795a",
      "name": "n8n",
      "type": "n8n-nodes-base.set",
      "position": [
        1360,
        640
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5e73d2e7-4b1a-4180-8af2-047e52eb8a0a",
              "name": "repo.owner",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.owner }}"
            },
            {
              "id": "22445c28-5431-45a5-86ca-0ab2ff26cff5",
              "name": "repo.name",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.name }}"
            },
            {
              "id": "232d9947-a43f-48a9-b385-da1aa8f5139e",
              "name": "origin",
              "type": "string",
              "value": "n8n"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "fc83af27-10a8-4ec4-94e7-15ab074c8ab6",
      "name": "github",
      "type": "n8n-nodes-base.set",
      "position": [
        1360,
        840
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5e73d2e7-4b1a-4180-8af2-047e52eb8a0a",
              "name": "repo.owner",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.owner }}"
            },
            {
              "id": "22445c28-5431-45a5-86ca-0ab2ff26cff5",
              "name": "repo.name",
              "type": "string",
              "value": "={{ $('Globals').item.json.repo.name }}"
            },
            {
              "id": "232d9947-a43f-48a9-b385-da1aa8f5139e",
              "name": "origin",
              "type": "string",
              "value": "github"
            },
            {
              "id": "456ec816-8c15-498b-bbc5-a96abce95d59",
              "name": "workflows",
              "type": "array",
              "value": "={{ $('Workflows').item.json.data }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "99e64b8f-3446-4b74-8ce6-5eccd47d0aa7",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        460,
        600
      ],
      "parameters": {
        "color": 4,
        "width": 150,
        "height": 80,
        "content": "## Edit this node \ud83d\udc47"
      },
      "typeVersion": 1
    },
    {
      "id": "734112c4-9175-4f50-a2d6-7970d2938624",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        180,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 1831,
        "height": 601,
        "content": "## Main workflow loop"
      },
      "typeVersion": 1
    },
    {
      "id": "0dbfd9fc-e5c8-4a98-8435-5a44c1f3d56d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        1100
      ],
      "parameters": {
        "color": 6,
        "width": 2231,
        "height": 941,
        "content": "## Subworkflow"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Delete a file",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "n8n": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "isDiffOrNew",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Return": {
      "main": [
        []
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Get file data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "isDeleted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "github": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Globals": {
      "main": [
        [
          {
            "node": "Get many workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get File": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflows": {
      "main": [
        [
          {
            "node": "List files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "isDeleted": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List files": {
      "main": [
        [
          {
            "node": "github",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File is new": {
      "main": [
        [
          {
            "node": "Create new file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "isDiffOrNew": {
      "main": [
        [
          {
            "node": "Check Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Status": {
      "main": [
        [
          {
            "node": "File is new",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "File is different",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Same file - Do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete a file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get file data": {
      "main": [
        [
          {
            "node": "If file too large",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create new file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Execute Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Globals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "File is different": {
      "main": [
        [
          {
            "node": "Edit existing file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If file too large": {
      "main": [
        [
          {
            "node": "Get File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit existing file": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many workflows": {
      "main": [
        [
          {
            "node": "Workflows",
            "type": "main",
            "index": 0
          },
          {
            "node": "n8n",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Globals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Same file - Do nothing": {
      "main": [
        [
          {
            "node": "Return",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow Trigger": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Remixed Backup your workflows to GitHub from Solomon's work. Check out his templates.

Source: https://n8n.io/workflows/5898/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

Based on Jonathan & Solomon work.

n8n, HTTP Request, GitHub +1
Web Scraping

Backup Workflows to GitHub. Uses n8n, httpRequest, github, executeWorkflowTrigger. Event-driven trigger; 24 nodes.

n8n, HTTP Request, GitHub +1
Web Scraping

Based on Jonathan's work. Check out his templates.

n8n, HTTP Request, GitHub +1
Web Scraping

This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

Git Commit. Uses github, n8n, formTrigger, httpRequest. Event-driven trigger; 34 nodes.

GitHub, n8n, Form Trigger +2