AutomationFlowsWeb Scraping › Automate n8n Workflow Backups to GitLab

Automate n8n Workflow Backups to GitLab

Original n8n title: Automated Backup of N8n Workflows to Gitlab Organized by Username

Automated Backup of n8n Workflows to GitLab Organized by Username. Uses n8n, gitlab, emailSend, httpRequest. Event-driven trigger; 16 nodes.

Event trigger★★★★☆ complexity16 nodesn8nGitLabEmail SendHTTP Request
Web Scraping Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:
Automate n8n Workflow Backups to GitLab — n8n workflow card showing n8n, GitLab, Email Send integration

This workflow follows the Emailsend → 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
{
  "name": "Automated Backup of n8n Workflows to GitLab Organized by Username",
  "nodes": [
    {
      "parameters": {},
      "id": "77ecc07d-8501-4453-b387-eced2a197dc8",
      "name": "Manual Backup Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -304,
        1440
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "filters": {},
        "requestOptions": {}
      },
      "id": "afc4596c-b07f-471c-8ac8-ecfca567a608",
      "name": "Fetch N8N Workflows",
      "type": "n8n-nodes-base.n8n",
      "position": [
        112,
        1552
      ],
      "typeVersion": 1,
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "backup-date",
              "name": "backupDate",
              "type": "string",
              "value": "={{ $now.setZone('UTC').toFormat('yyyy-MM-dd') }}"
            },
            {
              "id": "backup-path",
              "name": "backupPath",
              "type": "string",
              "value": "=backups/{{ $now.setZone('UTC').toFormat('yyyy') }}/{{ $now.setZone('UTC').toFormat('MM') }}"
            },
            {
              "id": "52c796e4-aafe-4144-b9a6-8d98574dddb9",
              "name": "gitlabprojectOwner",
              "value": "idstar-project/devops/automation",
              "type": "string"
            },
            {
              "id": "6f026178-903b-4b9f-b08f-67c9a7dcf150",
              "name": "gitlabprojectPath",
              "value": "n8n-global-backup",
              "type": "string"
            },
            {
              "id": "bb698da4-e76a-451d-95ed-da6af2d2407f",
              "name": "workflowOwner",
              "value": "",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "e582efab-3f34-4376-80a9-2b72a5f4d01f",
      "name": "Prepare Backup Metadata",
      "type": "n8n-nodes-base.set",
      "position": [
        368,
        1536
      ],
      "typeVersion": 3.3
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "b0601be4-c36e-4f32-8a6e-9c3820d71d7d",
      "name": "Process Each Workflow",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        592,
        1536
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "workflow-data",
              "name": "workflowData",
              "type": "object",
              "value": "={{\n  {\n    \"id\": $('Fetch N8N Workflows').item.json.id,\n    \"name\": $('Fetch N8N Workflows').item.json.name,\n    \"active\": $('Fetch N8N Workflows').item.json.active,\n    \"nodes\": $('Fetch N8N Workflows').item.json.nodes,\n    \"connections\": $('Fetch N8N Workflows').item.json.connections,\n    \"settings\": $('Fetch N8N Workflows').item.json.settings,\n    \"tags\": $('Fetch N8N Workflows').item.json.tags,\n    \"createdAt\": $('Fetch N8N Workflows').item.json.createdAt,\n    \"updatedAt\": $('Fetch N8N Workflows').item.json.updatedAt\n  }\n}}"
            },
            {
              "id": "creator-name",
              "name": "creatorName",
              "type": "string",
              "value": "={{ ($('Fetch Users').first().json.data.find(u => u.id === ($('Fetch N8N Workflows').item.json.owner?.id || $('Fetch N8N Workflows').item.json.userId))?.email?.split('@')[0] || 'general').toLowerCase() }}"
            },
            {
              "id": "file-name",
              "name": "fileName",
              "type": "string",
              "value": "={{ $('Fetch N8N Workflows').item.json.name }}.json"
            },
            {
              "id": "file-path",
              "name": "filePath",
              "type": "string",
              "value": "=workflows/{{ $('Fetch N8N Workflows').item.json.name }}/{{ $('Fetch N8N Workflows').item.json.name }}.json"
            },
            {
              "id": "8d4963f3-35a6-4d29-9142-9ead35ade7a3",
              "name": "projectName",
              "value": "={{ $json.project?.name || 'Personal' }}",
              "type": "string"
            },
            {
              "id": "85671fd2-a739-493a-8af8-c1b863ae7529",
              "name": "folderName",
              "value": "={{ $json.tags && $json.tags.length > 0 ? $json.tags[0].name : 'General' }}",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "50db5244-5350-4614-8b1d-59052897120d",
      "name": "Format Workflow for GitLab",
      "type": "n8n-nodes-base.set",
      "position": [
        912,
        1264
      ],
      "typeVersion": 3.3
    },
    {
      "parameters": {
        "amount": 1
      },
      "id": "31c9717e-1399-4600-9af5-4e25639e7131",
      "name": "Rate Limit Control",
      "type": "n8n-nodes-base.wait",
      "position": [
        1136,
        1264
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "6edbebb3-1dc9-4e70-bd4b-0c02e6574808",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": "Bad request - please check your parameters"
            }
          ]
        },
        "options": {}
      },
      "id": "2e97d466-0acc-4ce3-8d62-5b104f967a1e",
      "name": "Check Backup Status",
      "type": "n8n-nodes-base.if",
      "position": [
        1584,
        1264
      ],
      "typeVersion": 2.2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "error-log",
              "name": "errorLog",
              "type": "string",
              "value": "=Failed to process {{ $json.fileName }}: {{ $json.error?.message || 'Unknown error' }}"
            },
            {
              "id": "success-log",
              "name": "successLog",
              "type": "string",
              "value": "=Successfully processed {{ $json.fileName }} for {{ $json.creatorName }}"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "8a9e5b26-6be4-4b23-8f6d-dacb6685043a",
      "name": "Log Backup Results",
      "type": "n8n-nodes-base.set",
      "position": [
        816,
        1456
      ],
      "typeVersion": 3.3
    },
    {
      "parameters": {
        "resource": "file",
        "operation": "edit",
        "owner": "={{ $('Prepare Backup Metadata').item.json.gitlabprojectOwner }}",
        "repository": "={{ $('Prepare Backup Metadata').item.json.gitlabprojectPath }}",
        "filePath": "={{ $('Rate Limit Control').item.json.filePath }}",
        "fileContent": "={{ JSON.stringify( $('Rate Limit Control').item.json.workflowData, null, 2) }}",
        "commitMessage": "=Update {{ $('Rate Limit Control').item.json.fileName }} in {{ $('Rate Limit Control').item.json.creatorName }} at {{ $now.format('dd/mm/yyyy') }}",
        "branch": "main"
      },
      "id": "d6abe5c3-441c-47a7-8903-e59549e34701",
      "name": "Update Backup Summary",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        1696,
        1552
      ],
      "typeVersion": 1,
      "credentials": {
        "gitlabApi": {
          "name": "<your credential>"
        }
      },
      "continueOnFail": true
    },
    {
      "parameters": {
        "fromEmail": "noreply-forge@idstar.group",
        "toEmail": "it-ops@idstar.group",
        "subject": "=N8N Backup to Gitlab Notification",
        "html": "=<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>N8N Backup Notification</title>\n    <style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background-color: #f4f7f9;\n            margin: 0;\n            padding: 0;\n            color: #333;\n        }\n\n        .container {\n            max-width: 600px;\n            margin: 20px auto;\n            background-color: #ffffff;\n            border-radius: 12px;\n            overflow: hidden;\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n        }\n\n        .header {\n            background-color: #1a2b4b;\n            padding: 40px 20px;\n            text-align: center;\n            color: #ffffff;\n        }\n\n        .header h1 {\n            margin: 0;\n            font-size: 24px;\n            letter-spacing: 2px;\n            text-transform: uppercase;\n            font-weight: 300;\n        }\n\n        .status-badge {\n            display: inline-block;\n            background-color: #10b981;\n            color: white;\n            padding: 8px 20px;\n            border-radius: 50px;\n            font-weight: bold;\n            margin-top: 15px;\n            font-size: 14px;\n            box-shadow: 0 4px 10px rgba(16, 185, 129, 0.3);\n        }\n\n        .content {\n            padding: 30px;\n        }\n\n        .summary-grid {\n            display: grid;\n            grid-template-columns: 1fr 1fr;\n            gap: 15px;\n            margin-bottom: 30px;\n        }\n\n        .summary-card {\n            background-color: #f9fafb;\n            padding: 15px;\n            border-radius: 8px;\n            border: 1px solid #e5e7eb;\n        }\n\n        .summary-card label {\n            display: block;\n            font-size: 10px;\n            color: #6b7280;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            margin-bottom: 5px;\n        }\n\n        .summary-card span {\n            font-size: 16px;\n            font-weight: 600;\n            color: #1a2b4b;\n        }\n\n        h3 {\n            color: #1a2b4b;\n            font-size: 18px;\n            margin-bottom: 15px;\n            border-left: 4px solid #3b82f6;\n            padding-left: 10px;\n        }\n\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 25px;\n        }\n\n        th {\n            text-align: left;\n            font-size: 12px;\n            color: #6b7280;\n            text-transform: uppercase;\n            padding: 10px;\n            border-bottom: 2px solid #f3f4f6;\n        }\n\n        td {\n            padding: 12px 10px;\n            border-bottom: 1px solid #f3f4f6;\n            font-size: 14px;\n        }\n\n        .user-tag {\n            background-color: #e0e7ff;\n            color: #4338ca;\n            padding: 2px 8px;\n            border-radius: 4px;\n            font-size: 11px;\n            font-weight: 600;\n        }\n\n        .status-success {\n            color: #10b981;\n        }\n\n        .footer {\n            background-color: #f9fafb;\n            padding: 25px;\n            text-align: center;\n            border-top: 1px solid #e5e7eb;\n        }\n\n        .btn {\n            display: inline-block;\n            padding: 12px 25px;\n            border-radius: 6px;\n            text-decoration: none;\n            font-weight: 600;\n            font-size: 14px;\n            margin: 5px;\n            transition: all 0.2s;\n        }\n\n        .btn-primary {\n            background-color: #1a2b4b;\n            color: #ffffff !important;\n        }\n\n        .btn-outline {\n            border: 1.5px solid #1a2b4b;\n            color: #1a2b4b !important;\n        }\n\n        .footer-text {\n            font-size: 12px;\n            color: #9ca3af;\n            margin-top: 15px;\n        }\n    </style>\n</head>\n\n<body>\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>N8N Automation Bot</h1>\n            <div class=\"status-badge\">BACKUP SUCCESSFUL</div>\n        </div>\n        <div class=\"content\">\n            <p>The scheduled backup of all n8n workflows has been completed successfully.</p>\n            <div class=\"summary-section\"\n                style=\"background-color: #f9fafb; padding: 20px; border-radius: 8px; border-left: 4px solid #1a2b4b; margin-bottom: 30px;\">\n                <h3 style=\"margin-top: 0; color: #1a2b4b; font-size: 16px; border: none; padding: 0;\">Backup Details\n                </h3>\n                <div style=\"font-size: 14px; line-height: 2;\">\n                    <strong>Total Workflow:</strong> {{ $('Fetch N8N Workflows').all().length }}<br>\n                    <strong>Target Repo:</strong> n8n-global-backup<br>\n                    <strong>Backup Date:</strong> {{ $now.format('FFF') }}<br>\n                    <strong>Repository Link:</strong> <a\n                        href=\"https://your_gitlab_reository_url\"\n                        style=\"color: #3b82f6; text-decoration: none;\">idstar-project/devops/automation/n8n-global-backup</a><br>\n                    <strong>N8N Workflow Link:</strong> <a href=\"https://forge.idstar.group/workflow/y7pbJsav1V96jmOd\"\n                        style=\"color: #3b82f6; text-decoration: none;\">forge.idstar.group</a>\n                </div>\n            </div>\n        </div>\n        <div class=\"footer\">\n            <a href=\"https://your_gitlab_reository_url\"\n                class=\"btn btn-primary\">View Repository</a>\n            <a href=\"https://forge.idstar.group/workflow/y7pbJsav1V96jmOd\" class=\"btn btn-outline\">Check\n                Workflow</a>\n            <p class=\"footer-text\">This is an automated notification from IDStar DevOps Forge.</p>\n        </div>\n    </div>\n</body>\n\n</html>",
        "options": {}
      },
      "id": "01e39ceb-57ba-4453-b1fc-2d3b38c207a1",
      "name": "Send email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1040,
        1456
      ],
      "typeVersion": 2.1,
      "executeOnce": true,
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "resource": "file",
        "owner": "={{ $('Prepare Backup Metadata').item.json.gitlabprojectOwner }}",
        "repository": "={{ $('Prepare Backup Metadata').item.json.gitlabprojectPath }}",
        "filePath": "={{ $json.filePath }}",
        "fileContent": "={{ JSON.stringify($json.workflowData, null, 2) }}",
        "commitMessage": "={{ $now.format('ff') }} Backup: {{ $('Fetch N8N Workflows').item.json.name }}.json",
        "branch": "main"
      },
      "id": "e1f6b787-4ae7-4d1a-ac06-1cfc209ca171",
      "name": "Create to GitLab Repository",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        1360,
        1264
      ],
      "typeVersion": 1,
      "credentials": {
        "gitlabOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "continueOnFail": true
    },
    {
      "parameters": {
        "content": "## Backup Initiation: \n\nTriggers manually or weekly to start the process ",
        "height": 816
      },
      "id": "bbb84f69-0df0-4e99-8857-8f7ea999165a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        960
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## Workflow Retrieval & Prep: \n\nFetches workflows and prepares metadata",
        "height": 784,
        "width": 604,
        "color": 3
      },
      "id": "e308bc58-3616-40d0-8ea6-4bc97dd3817a",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        976
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## Combined Processing, Storage, and Notification: \n\nProcesses and formats workflows, saves them to GitLab with file existence checks and updates user-wise, logs results, and sends a success email.",
        "height": 816,
        "width": 1340,
        "color": 6
      },
      "id": "a360c7a0-5e61-41f8-9515-ca0947017207",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        544,
        976
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {},
            {
              "triggerAtHour": 12
            }
          ]
        }
      },
      "id": "1a8e38f2-b504-4c7f-9db0-2a4676c82a9d",
      "name": "Scheduled Daily Backup",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -304,
        1632
      ],
      "notesInFlow": true,
      "typeVersion": 1.2,
      "notes": "midnight and noon daily backup"
    },
    {
      "parameters": {
        "url": "https://forge.idstar.group/api/v1/users",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "n8nApi",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        752,
        1264
      ],
      "id": "9f203c82-cdb9-4606-839b-bb6aa93708d7",
      "name": "Fetch Users",
      "executeOnce": true,
      "alwaysOutputData": true,
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Log Backup Results": {
      "main": [
        [
          {
            "node": "Send email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rate Limit Control": {
      "main": [
        [
          {
            "node": "Create to GitLab Repository",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Backup Status": {
      "main": [
        [
          {
            "node": "Update Backup Summary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Process Each Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch N8N Workflows": {
      "main": [
        [
          {
            "node": "Prepare Backup Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Backup Trigger": {
      "main": [
        [
          {
            "node": "Fetch N8N Workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Workflow": {
      "main": [
        [
          {
            "node": "Log Backup Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Fetch Users",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Backup Summary": {
      "main": [
        [
          {
            "node": "Process Each Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Backup Metadata": {
      "main": [
        [
          {
            "node": "Process Each Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Workflow for GitLab": {
      "main": [
        [
          {
            "node": "Rate Limit Control",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create to GitLab Repository": {
      "main": [
        [
          {
            "node": "Check Backup Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scheduled Daily Backup": {
      "main": [
        [
          {
            "node": "Fetch N8N Workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Users": {
      "main": [
        [
          {
            "node": "Format Workflow for GitLab",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false,
    "timeSavedMode": "fixed",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "versionId": "7e512d9f-16eb-48b7-9cfe-55e542c719d5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "y7pbJsav1V96jmOd",
  "tags": [
    {
      "updatedAt": "2026-02-26T07:20:27.831Z",
      "createdAt": "2026-02-26T07:20:27.831Z",
      "id": "YXaoVUcoCkAEndgW",
      "name": "N8N"
    },
    {
      "updatedAt": "2025-07-07T07:22:17.625Z",
      "createdAt": "2025-07-07T07:22:17.625Z",
      "id": "rTlvA6WEJCPUsE7r",
      "name": "GitLab"
    },
    {
      "updatedAt": "2026-02-26T07:20:20.467Z",
      "createdAt": "2026-02-26T07:20:20.467Z",
      "id": "vaYXgtSjjk9x2ufa",
      "name": "Backup"
    }
  ]
}

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

Automated Backup of n8n Workflows to GitLab Organized by Username. Uses n8n, gitlab, emailSend, httpRequest. Event-driven trigger; 16 nodes.

Source: https://github.com/taufiqpsumarna/n8n-global-backup/blob/main/workflow.json — 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

This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t

Execute Command, Read Write File, HTTP Request +3
Web Scraping

N8n recently introduced folders and it has been a big improvement on workflow management on top of the tags.

HTTP Request, n8n, Form Trigger +1
Web Scraping

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

GitHub, n8n, Form Trigger +2
Web Scraping

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

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

This workflow provides everything you need to package and deploy multiple workflows from a single workflow you distribute.

n8n, Stop And Error, GitHub +1