AutomationFlowsSlack & Telegram › Daily Workflow Backup to Gitlab with Slack Notifications

Daily Workflow Backup to Gitlab with Slack Notifications

ByMeelioo @mookielian on n8n.io

This workflow creates automated daily backups of your n8n workflows to a GitLab repository: Scheduled Trigger - Runs automatically at noon each day to initiate the backup process Fetch Workflows - Retrieves all active workflows from your n8n instance, filtering out archived ones…

Cron / scheduled trigger★★★★☆ complexity22 nodesn8nGitLabSlack
Slack & Telegram Trigger: Cron / scheduled Nodes: 22 Complexity: ★★★★☆ Added:

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

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
{
  "nodes": [
    {
      "id": "05ee377d-5402-46ee-81b4-c56e6115ecd4",
      "name": "Get All Workflows",
      "type": "n8n-nodes-base.n8n",
      "position": [
        -496,
        16
      ],
      "parameters": {
        "filters": {},
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f107d96b-26cf-47ad-97fc-83f64c7b621e",
      "name": "Discard Archived Workflows",
      "type": "n8n-nodes-base.filter",
      "position": [
        -336,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3d21f751-35bf-439c-8536-ff5e8968672e",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.isArchived }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "67333676-710a-4721-82a4-f9288366c6d0",
      "name": "Convert to File",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        240,
        112
      ],
      "parameters": {
        "mode": "each",
        "options": {
          "format": true
        },
        "operation": "toJson"
      },
      "typeVersion": 1.1
    },
    {
      "id": "2d508a48-be41-40cd-be68-2aad83038cce",
      "name": "If File Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        400,
        112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9798deb6-300a-48ff-9f5c-a581b2d941a7",
              "operator": {
                "type": "array",
                "operation": "contains",
                "rightType": "any"
              },
              "leftValue": "={{ $('List of Names').item.json.name }}",
              "rightValue": "={{ $('Process Each File').item.json.name }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b816f0b9-26b1-438d-877a-d1d4ad86fe89",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -992,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "558377f5-54a6-4dd2-872a-dd1fa8f1fc9f",
              "name": "project_owner",
              "type": "string",
              "value": "PROJECT_OWNER e.g. mookielian"
            },
            {
              "id": "063bbfbf-697e-4825-8c68-af5cc7b6aa2d",
              "name": "project_name",
              "type": "string",
              "value": "PROJECT_NAME e.g. n8n"
            },
            {
              "id": "7938d2e2-b203-45fc-8432-f9f3ac241946",
              "name": "branch",
              "type": "string",
              "value": "main"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "517ef436-5323-4ffc-8ead-5c303930987e",
      "name": "List of Names",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -656,
        16
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "name"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5befe173-4171-4107-be94-4c5ad235ca76",
      "name": "Create New File - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "onError": "continueErrorOutput",
      "position": [
        560,
        192
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "branch": "={{ $('Configuration').item.json.branch }}",
        "filePath": "={{ $('Process Each File').item.json.name }}",
        "resource": "file",
        "binaryData": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "commitMessage": "=File created! {{ $('Process Each File').item.json.name }}"
      },
      "credentials": {
        "gitlabApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "20270a8c-ac47-4449-a506-618fe2362e17",
      "name": "Update File - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "onError": "continueErrorOutput",
      "position": [
        560,
        0
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "branch": "={{ $('Configuration').item.json.branch }}",
        "filePath": "={{ $('Process Each File').item.json.name }}",
        "resource": "file",
        "operation": "edit",
        "binaryData": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "commitMessage": "=File was updated! {{ $('Process Each File').item.json.name }}"
      },
      "credentials": {
        "gitlabApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "62bc4120-f641-456d-ae3c-2d450941ebe6",
      "name": "List All Files - GitLab",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        -832,
        16
      ],
      "parameters": {
        "owner": "={{ $('Configuration').item.json.project_owner }}",
        "resource": "file",
        "operation": "list",
        "returnAll": true,
        "repository": "={{ $('Configuration').item.json.project_name }}",
        "additionalParameters": {}
      },
      "credentials": {
        "gitlabApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2e8a6259-5530-4e15-babf-febbad2095ac",
      "name": "Daily Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1136,
        16
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 12
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "de6637b3-1a90-4683-b785-ee168de26cbe",
      "name": "Process Each File",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -144,
        16
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "17b4693e-d52c-4f1a-97fa-2c42da170df3",
      "name": "Remove Unwanted Fields",
      "type": "n8n-nodes-base.code",
      "position": [
        64,
        112
      ],
      "parameters": {
        "jsCode": "return $input.all().map(item => {\n  const { createdAt, updatedAt, id, name, active, isArchived, ...rest } = item.json;\n  return { json: rest };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "d96386b2-75df-49c1-9645-f50a96c92d23",
      "name": "Send Message to Channel",
      "type": "n8n-nodes-base.slack",
      "position": [
        64,
        -80
      ],
      "parameters": {
        "text": "=*Successful Backup!*\n\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.3
    },
    {
      "id": "25cc4169-c68e-4ed8-a85c-43e432cf5dbf",
      "name": "New File - Failed",
      "type": "n8n-nodes-base.slack",
      "position": [
        752,
        208
      ],
      "parameters": {
        "text": "=*Failed creating a new file - GitLab.*\n\n- File Name: {{ $('Process Each File').item.json.name }}\n- Error: {{ $json.error }}\n- Workflow State: _active={{ $('Process Each File').item.json.active }}_\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "2a2bad0d-af10-494b-aa21-48c2b1f277c3",
      "name": "Update File - Failed",
      "type": "n8n-nodes-base.slack",
      "position": [
        752,
        16
      ],
      "parameters": {
        "text": "=*Failed updating specified file - GitLab.*\n\n- File Name: {{ $('Process Each File').item.json.name }}\n- Error: {{ $json.error }}\n- Workflow State: _active={{ $('Process Each File').item.json.active }}_\n- Execution ID: {{ $execution.id }}\n- Mode: {{ $execution.mode }}\n- Timestamp(Workflow Region): {{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KF70UXL3",
          "cachedResultName": "backup-notifications"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "48ea9738-ef97-452b-b6ce-10db70d0920c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 704,
        "content": "# Welcome\n\n## Summary of Nodes\n\n- Daily Trigger (Customizable)\n- Conf. (GitLab)\n- List All Files (Necessary for comparison)\n- List of Names (Turns all names into an array of single field)\n- Get All Workflows (JSON of all workflows, base code)\n- Discard Archived Workflows (Toggle of if you want to backup archived too)\n- Process Each File (Loop to execute nodes for each workflow)\n  - Remove Unwanted Fields (Returns clean node code of the workflow)\n  - Convert to File (Turns JSON code into a formatted file ready for upload)\n  - If File Exists (Route into two path, Update or Create in GitLab)\n  - Update File - GitLab (Updates existing file, no update if the file is the same)\n  - Update File - Failed (Informs you on Slack about the file that failed)\n  - Create New File - GitLab (Push new file to repo.)\n  - New File - Failed (Informs you about failed file creation)\n- Send Message to Channel (Done branch of loop, success message)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bbaad52a-b34c-4b43-aad2-cf187bf7c6be",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1440,
        -240
      ],
      "parameters": {
        "color": 5,
        "width": 2608,
        "height": 704,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "a5eabdaa-c744-4272-868a-7a60740278b9",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1856,
        480
      ],
      "parameters": {
        "color": 6,
        "width": 3024,
        "height": 336,
        "content": "# CREDENTIALS"
      },
      "typeVersion": 1
    },
    {
      "id": "cdcf207f-0efd-4124-95b3-3d6a329e14c2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1840,
        576
      ],
      "parameters": {
        "width": 496,
        "height": 176,
        "content": "## Configuration Node\n\n- Create a project in GitLab.\n- Type the owner of the project as 'project_owner'.\n- Type the name of the project as 'project_name'.\n- Type the branch name. Will create a branch if main doesn't exist."
      },
      "typeVersion": 1
    },
    {
      "id": "45f50d44-40c7-4e04-9e7f-36ee2cc075d4",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        576
      ],
      "parameters": {
        "width": 480,
        "height": 176,
        "content": "## GitLab - [Docs](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gitlab/)\n\n- Enter your project settings on GitLab Dashboard.\n- Go to access tokens page and create a new token.\n- Paste in your token in n8n credential and save.\n- No need to change the GitLab server parameter."
      },
      "typeVersion": 1
    },
    {
      "id": "819a6463-8222-47e9-aca2-36e4f20e0489",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        576
      ],
      "parameters": {
        "width": 496,
        "height": 176,
        "content": "## n8n Internal - [Docs](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.n8n/)\n\n- From left menu and bottom go to your user settings.\n- Go to API Keys page and create a new key.\n- Paste in the API Key in the credential page.\n- As base URL, enter your domain with '/api/v1' at the end and save."
      },
      "typeVersion": 1
    },
    {
      "id": "ef82a762-7d0c-4928-a404-5a1f691aed71",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        576
      ],
      "parameters": {
        "width": 1440,
        "height": 176,
        "content": "## Slack - [Docs](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/)\n\n- Go to 'api.slack.com/apps' and create an account if you haven't already.\n- Create a new app in your workspace and go to OAuth screen from left menu.\n- Add a redirect URL which is your domain with this at the end: '/rest/oauth2-credential/callback'. In scopes section add these scopes as Bot Token Scopes: chat:write, channels:join, channels:read, groups:read... \n- From OAuth Tokens section copy bot token and paste as access token in n8n credential. From basic information page copy signature secret, paste in n8n credential and save."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Configuration": {
      "main": [
        [
          {
            "node": "List All Files - GitLab",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Trigger": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List of Names": {
      "main": [
        [
          {
            "node": "Get All Workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If File Exists": {
      "main": [
        [
          {
            "node": "Update File - GitLab",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create New File - GitLab",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to File": {
      "main": [
        [
          {
            "node": "If File Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get All Workflows": {
      "main": [
        [
          {
            "node": "Discard Archived Workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New File - Failed": {
      "main": [
        [
          {
            "node": "Process Each File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each File": {
      "main": [
        [
          {
            "node": "Send Message to Channel",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Remove Unwanted Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update File - Failed": {
      "main": [
        [
          {
            "node": "Process Each File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update File - GitLab": {
      "main": [
        [
          {
            "node": "Process Each File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update File - Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Unwanted Fields": {
      "main": [
        [
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List All Files - GitLab": {
      "main": [
        [
          {
            "node": "List of Names",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New File - GitLab": {
      "main": [
        [
          {
            "node": "Process Each File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "New File - Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Discard Archived Workflows": {
      "main": [
        [
          {
            "node": "Process Each File",
            "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

This workflow creates automated daily backups of your n8n workflows to a GitLab repository: Scheduled Trigger - Runs automatically at noon each day to initiate the backup process Fetch Workflows - Retrieves all active workflows from your n8n instance, filtering out archived ones…

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow is ideal for n8n self-hosted users, DevOps engineers, and automation developers who want to automatically back up their n8n workflows to GitHub on a regular basis.

GitHub, n8n, HTTP Request +1
Slack & Telegram

⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n ins

N8N Nodes Scrapegraphai, GitLab, Slack
Slack & Telegram

This n8n automation detects unused (“dead”) feature flags in an Android Kotlin/Java codebase by comparing your GitLab repository code against LaunchDarkly’s feature flag list.

GitLab, Google Sheets, Slack +2
Slack & Telegram

This workflow fully automates your team's daily standup process using Slack for communication, Notion for structured data storage, and Redis for real-time session management.

Notion, Slack, Redis
Slack & Telegram

This workflow is an automated employee time tracking and reporting system that monitors weekly work hours via TMetric, then delivers personalized summaries directly to each team member on Slack. It co

HTTP Request, Item Lists, Data Table +1