{"workflow":{"id":12873,"name":"Sync Android env config to Gradle files with GitHub and Slack alerts","views":7,"recentViews":0,"totalViews":7,"createdAt":"2026-01-21T13:31:00.287Z","description":"# Environment Config Diff & Propagate for Android Builds\n\nThis workflow automatically detects changes in the .env.staging file in a GitHub repository and keeps Android configuration files (build.gradle and gradle.properties) in sync.It creates a new Git branch, applies updates safely, opens a pull request and notifies the team on Slack — all without manual effort.\n\nWhenever .env.staging changes:\n\n* The workflow detects the change via GitHub webhook\n*   Compares ENV values with Android config files\n*   Automatically updates build.gradle and gradle.properties\n*   Creates a new Git branch\n*   Opens a pull request\n*   Sends a Slack notification\n    \nYou get:\n\n*   **Automatic Android config synchronization**\n*   **Safe updates via pull requests**\n*   **Zero manual copying of ENV values**\n*   **Instant Slack visibility for the team**\n\nIdeal for teams managing Android app configuration across environments without mistakes.\n\n## What It Does\n\nThis workflow automates Android configuration updates end-to-end:\n\n1.  Listens for GitHub push events.\n2.  Checks if .env.staging was modified.\n3.  Stops execution if ENV file was not changed.\n4.  Fetches .env.staging and gradle.properties from main.\n5.  Converts both files into easy-to-compare key-value pairs.\n6.  Compares ENV values against Gradle values.\n7.  Creates a new Git branch for changes.\n8.  Fetches files from the new branch.\n9.  Identifies which variables must be updated.\n10.  Applies ENV values to:\n    *   build.gradle\n    *   gradle.properties\n11.  Commits the changes.\n12.  Creates a pull request.\n13.  Sends a Slack notification with PR details.\n\nThis ensures Android configs are **always aligned with ENV files**.\n\n## Who’s It For\n\nThis workflow is ideal for:\n\n*   Android development teams\n*   DevOps & platform engineers\n*   CI/CD automation teams\n*   Teams managing multiple environments (staging / prod)\n*   Organizations avoiding manual config drift\n*   Anyone tired of copy-pasting ENV values\n    \n\n## Requirements to Use This Workflow\n\nTo run this workflow, you need:\n\n*   **n8n instance** (cloud or self-hosted)\n*   **GitHub repository** with:\n    *   .env.staging\n    *   app/build.gradle\n    *   gradle.properties\n*   **GitHub Personal Access Token**\n*   **Slack workspace** + API credentials\n*   Basic understanding of Android config files\n\n## How It Works\n\n1.  **GitHub Webhook Trigger**Listens for commits pushed to the repository.\n2.  **ENV Change Check**Workflow continues **only if .env.staging changed**.\n3.  **Fetch & Parse Files**Reads ENV and Gradle files and converts them into key-value format.\n4.  **Compare Config Values**Finds missing or mismatched variables.\n5.  **Create Safe Branch**Generates a timestamp-based branch from main.\n6.  **Apply Updates**Updates only the required values in:\n    *   build.gradle\n    *   gradle.properties\n7.  **Commit Changes**Saves updates to the new branch.\n8.  **Create Pull Request**Opens a PR for review.\n9.  **Notify Slack**Sends PR link and details to the team.\n    \n\n## Setup Steps\n\n1.  Import the provided **n8n workflow JSON**.\n2.  Configure **GitHub credentials** in all GitHub & HTTP nodes.\n3.  Set your **repository name** and owner.\n4.  Configure **Slack credentials** and select a channel.\n5.  Ensure .env.staging exists in your repo.\n6.  Activate the workflow.\n7.  Push a change to .env.staging — automation starts instantly\n    \n\n## How To Customize Nodes\n\n### Customize ENV File\n\n*   Replace .env.staging with .env.production or others.\n*   Update filename in GitHub fetch + check nodes.\n\n### Customize Android Files\n\n*   Extend logic to include:\n    *   local.properties\n    *   BuildConfig.kt\n    *   settings.gradle\n\n### Customize Branch Naming\n\n*   Modify the **Generate New Branch Name** node.\n*   Add environment names or commit IDs.\n\n### Customize Slack Message\n\nYou can add:\n\n*   Emojis\n*   PR author name\n*   Changed variable list\n*   Mentions (@team, @android)\n    \n\n## Add-Ons (Optional Enhancements)\n\nYou can extend this workflow to:\n\n*   Support multiple ENV files\n*   Add approval checks before PR creation\n*   Auto-merge after approval\n*   Validate ENV variable formats\n*   Send diff summary to Slack\n*   Block secrets from being committed\n*   Add Jira / Linear ticket creation\n*   Trigger Android CI build after PR creation\n    \n\n## Use Case Examples\n\n### 1\\. Environment Sync\n\nKeep Android configs aligned with staging ENV automatically.\n\n### 2\\. CI/CD Safety\n\nPrevent broken builds due to mismatched config values.\n\n### 3\\. Team Transparency\n\nEveryone sees config updates via Slack + PRs.\n\n### 4\\. DevOps Automation\n\nRemove repetitive manual config updates.\n\n### 5\\. Audit Friendly\n\nAll changes tracked through Git history & PRs.\n\n## Troubleshooting Guide\n\n| Issue                  | Possible Cause                    | Solution                                             |\n|------------------------|----------------------------------|------------------------------------------------------|\n| Workflow not triggered | Webhook not configured            | Re-register GitHub webhook                            |\n| No PR created          | `.env.staging` not changed        | Ensure the file is modified                           |\n| Wrong values updated   | Parsing logic issue               | Check `KEY=VALUE` format                              |\n| Slack message not sent | Invalid credentials               | Reconnect Slack API                                   |\n| Commit failed          | Missing permissions               | Check GitHub token scopes                             |\n\n\n## Need Help?\n\nIf you need help extending or customizing this workflow, adding production support, CI integrations, security checks or enterprise-scale automation, then our [n8n workflow development](https://www.weblineindia.com/n8n-automation/) team at **WeblineIndia** can help you build robust, production-ready workflows.","workflow":{"id":"16SvkzB4jgrePTnC","meta":{"instanceId":"14e4c77104722ab186539dfea5182e419aecc83d85963fe13f6de862c875ebfa","templateCredsSetupCompleted":true},"name":"Environment Config Diff & Propagate for Android Builds","tags":[],"nodes":[{"id":"71767832-90ad-4269-97ab-c23f32e2c317","name":"Combine Env & Gradle","type":"n8n-nodes-base.merge","position":[-736,-2112],"parameters":{},"typeVersion":3.2},{"id":"69c3ae90-b09c-4cc1-affd-d09078712e5a","name":"Decode gradle.properties","type":"n8n-nodes-base.code","position":[800,-1920],"parameters":{"jsCode":"const base64 = $json.content;\nconst decoded = Buffer.from(base64, 'base64').toString('utf8');\n\n// convert KEY=VALUE to object\nconst lines = decoded.split('\\n');\nconst env = {};\n\nfor (const line of lines) {\n  if (!line || line.startsWith('#')) continue;\n  const [key, ...rest] = line.split('=');\n  env[key] = rest.join('=');\n}\n\nreturn [{\n  raw: decoded,\n  parsed: env\n}];\n"},"typeVersion":2},{"id":"6e18e5ea-bcab-4590-a177-6340b7d091a5","name":"Receive GitHub Webhook","type":"n8n-nodes-base.webhook","position":[-1888,-2112],"webhookId":"3e337abb-97e8-4079-8b3a-3e71888b9d28","parameters":{"path":"env-config-diff","options":{},"httpMethod":"POST"},"typeVersion":2.1},{"id":"d939f1c6-ea57-4267-83df-f9169f618287","name":"Check if .env.staging Changed","type":"n8n-nodes-base.code","position":[-1664,-2112],"parameters":{"jsCode":"// Works for Postman AND real GitHub webhooks\nconst payload = $input.first().json.body ?? $input.first().json;\n\nconst commits = payload.commits || [];\nconst changedFiles = [];\n\nfor (const commit of commits) {\n  if (commit.added) changedFiles.push(...commit.added);\n  if (commit.modified) changedFiles.push(...commit.modified);\n  if (commit.removed) changedFiles.push(...commit.removed);\n}\n\nconst envFileChanged = changedFiles.includes('.env.staging');\n\nreturn [{\n  json: {\n    repository: payload.repository?.full_name,\n    branch: payload.ref,\n    envFileChanged,\n    changedFiles\n  }\n}];\n"},"typeVersion":2},{"id":"9c6cdf35-2024-43b5-b90f-73161dc05a59","name":"Proceed Only if ENV Changed","type":"n8n-nodes-base.if","position":[-1440,-2112],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"007202b7-7abf-4b2d-b940-c6382dc25f6d","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.envFileChanged }}","rightValue":""}]}},"typeVersion":2.2},{"id":"e3c6602c-e533-4cd4-841a-0c233433a8ed","name":"Fetch .env.staging from Repo","type":"n8n-nodes-base.github","position":[-1216,-2208],"webhookId":"4f6bb795-f99c-4a3a-b4db-304d173aa0fb","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":".env.staging","resource":"file","operation":"get","repository":{"__rl":true,"mode":"name","value":"=android-config-sync-n8nDemo"},"asBinaryProperty":false,"additionalParameters":{"reference":"main"}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"8668805d-adb4-4609-894a-429306cccc5b","name":"Parse .env.staging into Key-Value","type":"n8n-nodes-base.code","position":[-992,-2208],"parameters":{"jsCode":"// 1. Get Base64 content from GitHub node\nconst base64Content = $input.first().json.content;\n\n// 2. Decode Base64 to text\nconst decodedText = Buffer.from(base64Content, 'base64').toString('utf-8');\n\n// 3. Split lines and parse KEY=VALUE\nconst envLines = decodedText.split('\\n');\n\nconst envObject = {};\n\nfor (const line of envLines) {\n  const trimmed = line.trim();\n\n  // Ignore empty lines and comments\n  if (!trimmed || trimmed.startsWith('#')) continue;\n\n  const [key, ...valueParts] = trimmed.split('=');\n  envObject[key] = valueParts.join('=');\n}\n\nreturn [{\n  json: {\n    rawEnv: decodedText,\n    envVars: envObject\n  }\n}];\n"},"typeVersion":2},{"id":"cafeceb7-63c6-4257-8cca-7596ac14e352","name":"Fetch gradle.properties from Repo","type":"n8n-nodes-base.github","position":[-1216,-2016],"webhookId":"296b48bf-0054-4fee-b072-0975e9fe485e","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":"gradle.properties","resource":"file","operation":"get","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"asBinaryProperty":false,"additionalParameters":{"reference":"main"}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"b8df0df1-3cad-462b-ba86-c0db95a61ddf","name":"Parse gradle.properties into Key-Value","type":"n8n-nodes-base.code","position":[-992,-2016],"parameters":{"jsCode":"// 1. Get Base64 content\nconst base64Content = $input.first().json.content;\n\n// 2. Decode Base64\nconst decodedText = Buffer.from(base64Content, 'base64').toString('utf-8');\n\n// 3. Split lines\nconst lines = decodedText.split('\\n');\n\nconst gradleVars = {};\n\nfor (const line of lines) {\n  const trimmed = line.trim();\n\n  // Ignore comments and empty lines\n  if (!trimmed || trimmed.startsWith('#')) continue;\n\n  const [key, ...valueParts] = trimmed.split('=');\n  gradleVars[key] = valueParts.join('=');\n}\n\nreturn [{\n  json: {\n    rawGradle: decodedText,\n    gradleVars\n  }\n}];\n"},"typeVersion":2},{"id":"25f75f8a-68cd-4c77-85cf-1bbcf90e2e9d","name":"Compare ENV and Gradle Variables","type":"n8n-nodes-base.code","position":[-528,-2112],"parameters":{"jsCode":"const inputArray = $input.all().map(item => item.json);\n\nconst envVars = inputArray[0]?.envVars || {};\nconst gradleVars = inputArray[1]?.gradleVars || {};\n\nconst changes = [];\nconst needsCacheInvalidation = [];\n\nfor (const key of Object.keys(envVars)) {\n  if (!gradleVars.hasOwnProperty(key)) {\n    changes.push({\n      key,\n      envValue: envVars[key],\n      gradleValue: null,\n      reason: 'missing_in_gradle'\n    });\n  } else if (envVars[key] !== gradleVars[key]) {\n    changes.push({\n      key,\n      envValue: envVars[key],\n      gradleValue: gradleVars[key],\n      reason: 'value_changed'\n    });\n  }\n\n  if (['API_KEY', 'BUILD_VERSION', 'ENVIRONMENT'].includes(key)) {\n    needsCacheInvalidation.push(key);\n  }\n}\n\nreturn [{\n  json: {\n    changes,\n    hasChanges: changes.length > 0,\n    needsCacheInvalidation,\n    envVars,\n    gradleVars\n  }\n}];\n"},"typeVersion":2},{"id":"c6c4c5f5-e009-4dc6-a715-f0248939cbb9","name":"Generate New Branch Name","type":"n8n-nodes-base.code","position":[-320,-2112],"parameters":{"jsCode":"const data = $input.first().json;\nconst timestamp = new Date().toISOString().replace(/[:.]/g, '-');\nconst branchName = `config-sync/${timestamp}`;\n\nreturn [{\n  json: {\n    ...data,\n    branchName\n  }\n}];\n"},"typeVersion":2},{"id":"05481330-eb64-4fd4-a7bd-b3582c1e5477","name":"Get Latest SHA of main Branch","type":"n8n-nodes-base.httpRequest","position":[-112,-2112],"parameters":{"url":"{{Your_Github_URL_Here}}","options":{},"sendHeaders":true,"authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearar ghp_YOUR_GITHUB_TOKEN_HERE"},{"name":"Accept","value":"application/vnd.github+json"},{"name":"Content-Type","value":"application/json"}]},"nodeCredentialType":"githubApi"},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":4.3},{"id":"1abcdfca-a4c4-4c17-a9bd-cacd7924daff","name":"Prepare SHA for Branch Creation","type":"n8n-nodes-base.set","position":[96,-2112],"parameters":{"options":{},"assignments":{"assignments":[{"id":"8629de6b-d00b-4cea-b5aa-4b41145c5e17","name":"=commitSHA","type":"string","value":"={{$json[\"object\"][\"sha\"]}}"}]}},"typeVersion":3.4},{"id":"00d3a128-9f51-45a1-a4b0-d4d517cc2fdd","name":"Create New Git Branch","type":"n8n-nodes-base.httpRequest","position":[304,-2112],"parameters":{"url":"{{Your_Github_URL_Here}}","method":"POST","options":{},"jsonBody":"={\n  \"ref\": \"refs/heads/{{ $('Generate New Branch Name').item.json.branchName }}\",\n  \"sha\": \"{{$node[\"Prepare SHA for Branch Creation\"].json[\"commitSHA\"]}}\"\n}\n","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"githubApi"},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":4.3},{"id":"0e1bd81a-eadf-4199-9453-16c319ca108d","name":"Fetch .env.staging from New Branch","type":"n8n-nodes-base.github","position":[576,-2304],"webhookId":"3fe2b45f-db8b-4842-9b56-846b7b95ffe6","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":".env.staging","resource":"file","operation":"get","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"asBinaryProperty":false,"additionalParameters":{"reference":"={{ $json.ref }}"}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"6462df63-65a2-499f-8210-1c313b36a157","name":"Decode .env.staging","type":"n8n-nodes-base.code","position":[800,-2304],"parameters":{"jsCode":"const base64 = $json.content;\nconst decoded = Buffer.from(base64, 'base64').toString('utf8');\n\n// convert KEY=VALUE to object\nconst lines = decoded.split('\\n');\nconst env = {};\n\nfor (const line of lines) {\n  if (!line || line.startsWith('#')) continue;\n  const [key, ...rest] = line.split('=');\n  env[key] = rest.join('=');\n}\n\nreturn [{\n  raw: decoded,\n  parsed: env\n}];\n"},"typeVersion":2},{"id":"20a21eac-5e23-4bd1-bee3-a5f306959702","name":"Fetch build.gradle File","type":"n8n-nodes-base.github","position":[576,-2112],"webhookId":"a22e53ae-b161-411c-867a-9b6ee08a201f","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":"app/build.gradle","resource":"file","operation":"get","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"asBinaryProperty":false,"additionalParameters":{}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"f5ab4891-cb9a-461d-bcfc-3dd36953d02c","name":"Fetch gradle.properties File","type":"n8n-nodes-base.github","position":[576,-1920],"webhookId":"279431da-9421-4bf0-91c4-4760b0b7e0de","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":"gradle.properties","resource":"file","operation":"get","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"asBinaryProperty":false,"additionalParameters":{}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"f8d6ef7d-04ec-4a80-99fd-a273047d7574","name":"Decode build.gradle","type":"n8n-nodes-base.code","position":[800,-2112],"parameters":{"jsCode":"const base64 = $json.content;\nconst decoded = Buffer.from(base64, 'base64').toString('utf8');\n\n// convert KEY=VALUE to object\nconst lines = decoded.split('\\n');\nconst env = {};\n\nfor (const line of lines) {\n  if (!line || line.startsWith('#')) continue;\n  const [key, ...rest] = line.split('=');\n  env[key] = rest.join('=');\n}\n\nreturn [{\n  raw: decoded,\n  parsed: env\n}];\n"},"typeVersion":2},{"id":"a23eccd8-e2c2-4fb2-b7ec-6a8e444044a3","name":"Combine Decoded Files for Diff","type":"n8n-nodes-base.merge","position":[1008,-2128],"parameters":{"numberInputs":3},"typeVersion":3.2},{"id":"6e10be61-22a7-422c-99f6-c93d03f07225","name":"Identify Config Changes","type":"n8n-nodes-base.code","position":[1216,-2112],"parameters":{"jsCode":"const items = $input.all();\n\nif (items.length !== 3) {\n  throw new Error(`Expected 3 inputs, got ${items.length}`);\n}\n\n// Env file (source of truth)\nconst env = items[0].json.parsed;\n\n// build.gradle text (already decoded)\nconst buildGradleText = items[1].json.raw;\n\n// gradle.properties text (already decoded)\nconst gradlePropsText = items[2].json.raw;\n\nconst updates = {\n  buildGradle: {},\n  gradleProperties: {}\n};\n\nfor (const [key, value] of Object.entries(env)) {\n\n  // build.gradle → buildConfigField\n  if (buildGradleText.includes(`\"${key}\"`)) {\n    updates.buildGradle[key] = value;\n  }\n\n  // gradle.properties → KEY=value\n  if (gradlePropsText.includes(`${key}=`)) {\n    updates.gradleProperties[key] = value;\n  }\n}\n\nreturn [\n  {\n    json: {\n      updates,\n      hasChanges:\n        Object.keys(updates.buildGradle).length > 0 ||\n        Object.keys(updates.gradleProperties).length > 0\n    }\n  }\n];\n"},"typeVersion":2},{"id":"b1850639-ae21-44ad-ad94-67ca0ea20d7c","name":"Apply ENV Changes to build.gradle","type":"n8n-nodes-base.code","position":[1472,-2208],"parameters":{"jsCode":"const updates = $items(\"Identify Config Changes\")[0].json.updates.buildGradle;\nlet raw = $items(\"Decode build.gradle\")[0].json.raw;\n\nfor (const [key, value] of Object.entries(updates)) {\n  const regex = new RegExp(\n    `(buildConfigField\\\\s+\"String\",\\\\s+\"${key}\",\\\\s+\"\\\\\\\\\")(.*?)(\")`,\n    \"g\"\n  );\n  raw = raw.replace(regex, `$1${value}$3`);\n}\n\nreturn [{\n  json: {\n    path: \"app/build.gradle\",\n    content: Buffer.from(raw).toString(\"base64\"),\n    message: \"Sync env vars to build.gradle\"\n  }\n}];\n"},"typeVersion":2},{"id":"8e0710a8-f595-4904-88d2-5edbf5893087","name":"Apply ENV Changes to gradle.properties","type":"n8n-nodes-base.code","position":[1472,-2016],"parameters":{"jsCode":"const updates = $items(\"Identify Config Changes\")[0].json.updates.gradleProperties;\nlet raw = $items(\"Decode gradle.properties\")[0].json.raw;\n\nfor (const [key, value] of Object.entries(updates)) {\n  const regex = new RegExp(`^${key}=.*$`, \"gm\");\n  if (raw.match(regex)) {\n    raw = raw.replace(regex, `${key}=${value}`);\n  } else {\n    raw += `\\n${key}=${value}`;\n  }\n}\n\nreturn [{\n  json: {\n    path: \"gradle.properties\",\n    content: Buffer.from(raw).toString(\"base64\"),\n    message: \"Sync env vars to gradle.properties\"\n  }\n}];\n"},"typeVersion":2},{"id":"b4daf1e6-d646-4e5e-a941-e2680216638f","name":"Commit build.gradle Updates to Branch","type":"n8n-nodes-base.github","position":[1696,-2208],"webhookId":"3d4846ff-b5fd-4618-9570-75a030be0a67","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":"={{ $json.path }}","resource":"file","operation":"edit","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"fileContent":"={{ $json.content }}","commitMessage":"={{ $json.message }}","additionalParameters":{"branch":{"branch":"={{ $('Generate New Branch Name').first().json.branchName }}"}}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"fbc4f688-af39-4d8e-816d-407b28a52913","name":"Commit gradle.properties Updates to Branch","type":"n8n-nodes-base.github","position":[1696,-2016],"webhookId":"3d4846ff-b5fd-4618-9570-75a030be0a67","parameters":{"owner":{"__rl":true,"mode":"list","value":"tanvidg2025","cachedResultUrl":"https://github.com/tanvidg2025","cachedResultName":"tanvidg2025"},"filePath":"={{ $json.path }}","resource":"file","operation":"edit","repository":{"__rl":true,"mode":"list","value":"android-config-sync-n8nDemo","cachedResultUrl":"https://github.com/tanvidg2025/android-config-sync-n8nDemo","cachedResultName":"android-config-sync-n8nDemo"},"fileContent":"={{ $json.content }}","commitMessage":"={{ $json.message }}","additionalParameters":{"branch":{"branch":"={{ $('Generate New Branch Name').first().json.branchName }}"}}},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":1.1},{"id":"a2e326b5-1f1b-41c3-a4d7-c2bfda307158","name":"Prepare Pull Request Data","type":"n8n-nodes-base.set","position":[1952,-2112],"parameters":{"options":{},"assignments":{"assignments":[{"id":"14d22051-7cf7-4cc7-9c80-4a3a95e3ba3a","name":"branchName","type":"string","value":"={{ $('Generate New Branch Name').first().json.branchName }}"}]}},"typeVersion":3.4},{"id":"a60cba8b-7fe9-451c-aa5d-b5798093d24d","name":"Create Pull Request","type":"n8n-nodes-base.httpRequest","position":[2160,-2112],"parameters":{"url":"{{Your_Github_URL_Here}}","method":"POST","options":{},"jsonBody":"={\n  \"title\": \"Sync Android config files\",\n  \"body\": \"Auto-generated PR from n8n\",\n  \"head\": \"{{ $json.branchName }}\",\n  \"base\": \"main\"\n}\n","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Accept","value":"application/vnd.github+json"}]},"nodeCredentialType":"githubApi"},"credentials":{"githubApi":{"id":"credential-id","name":"GitHub account 8"}},"typeVersion":4.3},{"id":"ef65909b-64bd-4cde-ad28-f73d2d6fbdf6","name":"Notify Team on Slack","type":"n8n-nodes-base.slack","position":[2368,-2112],"webhookId":"40208474-ed15-4383-93dd-b5b5786861d1","parameters":{"text":":rocket: A new pull request has been created!\n*Title:* Sync Android config files\n*Branch:* {{ $json.branchName }}\n*PR Link:* {{ $json.pullRequest.html_url }}\n","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C09S57E2JQ2","cachedResultName":"n8n"},"otherOptions":{}},"credentials":{"slackApi":{"id":"credential-id","name":"Slack account 15"}},"typeVersion":2.3},{"id":"8b662d1a-5f2e-4b8d-b939-bda32ad98a1c","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1968,-2208],"parameters":{"color":7,"height":256,"content":"Listens for changes in the repository, like when someone updates files. This starts the workflow automatically."},"typeVersion":1},{"id":"62225cd0-4919-429a-b9b3-8240d9ddbfbd","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1712,-2272],"parameters":{"color":7,"width":416,"height":336,"content":"## Check if .env.staging Changed + Proceed Only if ENV Changed \nChecks whether the .env.staging file was modified in the recent commit. The workflow continues only if this file has changed."},"typeVersion":1},{"id":"3b93d060-e5dd-4bbf-ac31-f3ca1bc5589e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1280,-2336],"parameters":{"color":7,"width":496,"height":496,"content":"## Fetch & Parse Files \nFetches the .env.staging and gradle.properties files from the repository and converts them into a simple key-value format so we can easily compare and use the values."},"typeVersion":1},{"id":"27576e57-e18e-4293-8116-abaf3bda3949","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-768,-2240],"parameters":{"color":7,"width":1216,"height":352,"content":"## Combine & Prepare Branch\nCompares the values in .env.staging and gradle.properties to see what needs updating. Then, creates a new branch from the main branch to apply these updates safely."},"typeVersion":1},{"id":"af5d8308-0f67-4799-a08f-24be27d0f3bd","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[464,-2464],"parameters":{"color":7,"width":912,"height":720,"content":"## Fetch & Decode Files for Diff\nFetches the latest versions of config files from the new branch, decodes them into readable text and prepares a comparison to see exactly which values need to be updated."},"typeVersion":1},{"id":"6ac689dd-91c3-48f3-99c7-0410b0ff1552","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1392,-2336],"parameters":{"color":7,"width":480,"height":496,"content":"## Update Files\n\nUpdates the build.gradle and gradle.properties files with the new values from .env.staging and commits these changes to the new branch.\n"},"typeVersion":1},{"id":"c6c32328-88fd-4cfa-ab81-31e18a7434dc","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[1904,-2256],"parameters":{"color":7,"width":656,"height":352,"content":"## Create Pull Request & Notify\n\nPrepares and creates a pull request for the updated files and sends a message to the team on Slack to let them know a new PR is ready for review.\n"},"typeVersion":1},{"id":"8d8186d8-9195-41f9-9719-b00e6c8fafdc","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-2752,-3072],"parameters":{"width":416,"height":672,"content":"## How it works\n\nThis workflow starts automatically when a change is pushed to GitHub. It first checks whether the .env.staging file was modified and if not, the workflow stops immediately. When .env.staging has changed, the workflow reads the environment values and compares them with the existing values in build.gradle and gradle.properties. If differences are found, it creates a new branch from the main branch, applies only the required updates to the Android configuration files and commits those changes to the new branch. After committing, it creates a pull request so the changes can be reviewed safely before merging. Finally, a Slack notification is sent to inform the team that a configuration update pull request is ready.\n\n\n## Setup steps\n\n**1.** Import this workflow into n8n.\n\n**2.** Connect your GitHub credentials.\n\n**3.** Connect your Slack credentials and select a channel.\n\n**4.** Make sure .env.staging, build.gradle and gradle.properties exist in the repo.\n\n**5.** Activate the workflow.\n\n**6.** Push a change to .env.staging to test."},"typeVersion":1}],"active":false,"pinData":{"Receive GitHub Webhook":[{"json":{"body":{"ref":"refs/heads/main","after":"abc123fakecommitsha","commits":[{"id":"abc123","added":[],"removed":[],"modified":[".env.staging"]}],"repository":{"full_name":"test-user/android-config-repo"}},"query":{},"params":{},"headers":{"host":"192.168.101.63:5678","accept":"*/*","connection":"keep-alive","user-agent":"PostmanRuntime/7.49.1","content-type":"application/json","postman-token":"e10df11b-150e-4623-89b2-bdc88bea357f","content-length":"266","accept-encoding":"gzip, deflate, br"},"webhookUrl":"http://localhost:5678/webhook-test/env-config-diff","executionMode":"test"}}]},"settings":{"executionOrder":"v1"},"versionId":"c09ae9e6-8fe1-4fa1-9da4-c0608f1a0852","connections":{"Create Pull Request":{"main":[[{"node":"Notify Team on Slack","type":"main","index":0}]]},"Decode .env.staging":{"main":[[{"node":"Combine Decoded Files for Diff","type":"main","index":0}]]},"Decode build.gradle":{"main":[[{"node":"Combine Decoded Files for Diff","type":"main","index":1}]]},"Combine Env & Gradle":{"main":[[{"node":"Compare ENV and Gradle Variables","type":"main","index":0}]]},"Create New Git Branch":{"main":[[{"node":"Fetch .env.staging from New Branch","type":"main","index":0},{"node":"Fetch build.gradle File","type":"main","index":0},{"node":"Fetch gradle.properties File","type":"main","index":0}]]},"Receive GitHub Webhook":{"main":[[{"node":"Check if .env.staging Changed","type":"main","index":0}]]},"Fetch build.gradle File":{"main":[[{"node":"Decode build.gradle","type":"main","index":0}]]},"Identify Config Changes":{"main":[[{"node":"Apply ENV Changes to build.gradle","type":"main","index":0},{"node":"Apply ENV Changes to gradle.properties","type":"main","index":0}]]},"Decode gradle.properties":{"main":[[{"node":"Combine Decoded Files for Diff","type":"main","index":2}]]},"Generate New Branch Name":{"main":[[{"node":"Get Latest SHA of main Branch","type":"main","index":0}]]},"Prepare Pull Request Data":{"main":[[{"node":"Create Pull Request","type":"main","index":0}]]},"Proceed Only if ENV Changed":{"main":[[{"node":"Fetch .env.staging from Repo","type":"main","index":0},{"node":"Fetch gradle.properties from Repo","type":"main","index":0}]]},"Fetch .env.staging from Repo":{"main":[[{"node":"Parse .env.staging into Key-Value","type":"main","index":0}]]},"Fetch gradle.properties File":{"main":[[{"node":"Decode gradle.properties","type":"main","index":0}]]},"Check if .env.staging Changed":{"main":[[{"node":"Proceed Only if ENV Changed","type":"main","index":0}]]},"Get Latest SHA of main Branch":{"main":[[{"node":"Prepare SHA for Branch Creation","type":"main","index":0}]]},"Combine Decoded Files for Diff":{"main":[[{"node":"Identify Config Changes","type":"main","index":0}]]},"Prepare SHA for Branch Creation":{"main":[[{"node":"Create New Git Branch","type":"main","index":0}]]},"Compare ENV and Gradle Variables":{"main":[[{"node":"Generate New Branch Name","type":"main","index":0}]]},"Apply ENV Changes to build.gradle":{"main":[[{"node":"Commit build.gradle Updates to Branch","type":"main","index":0}]]},"Fetch gradle.properties from Repo":{"main":[[{"node":"Parse gradle.properties into Key-Value","type":"main","index":0}]]},"Parse .env.staging into Key-Value":{"main":[[{"node":"Combine Env & Gradle","type":"main","index":0}]]},"Fetch .env.staging from New Branch":{"main":[[{"node":"Decode .env.staging","type":"main","index":0}]]},"Commit build.gradle Updates to Branch":{"main":[[{"node":"Prepare Pull Request Data","type":"main","index":0}]]},"Apply ENV Changes to gradle.properties":{"main":[[{"node":"Commit gradle.properties Updates to Branch","type":"main","index":0}]]},"Parse gradle.properties into Key-Value":{"main":[[{"node":"Combine Env & Gradle","type":"main","index":1}]]},"Commit gradle.properties Updates to Branch":{"main":[[{"node":"Prepare Pull Request Data","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":36,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.set":{"count":2},"n8n-nodes-base.code":{"count":11},"n8n-nodes-base.merge":{"count":2},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.github":{"count":7},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":8},"n8n-nodes-base.httpRequest":{"count":3}}},"status":"published","readyToDemo":null,"user":{"name":"WeblineIndia","username":"weblineindia","bio":"A Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.","verified":true,"links":["https://www.weblineindia.com/hire-n8n-developers/"],"avatar":"https://gravatar.com/avatar/a229d43aefca4588581583c58bb37b4773aebbdf4c1fef86a08bb1d38eae91fa?r=pg&d=retro&size=200"},"nodes":[{"id":16,"icon":"file:github.svg","name":"n8n-nodes-base.github","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.github/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/github/"}]},"categories":["Development"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"GitHub"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yMC4wMTY1IDBDOC45NDc5MSAwIDAgOS4wMTM4OCAwIDIwLjE2NTNDMCAyOS4wNzkyIDUuNzMzMjQgMzYuNjI0NiAxMy42ODY4IDM5LjI5NTJDMTQuNjgxMiAzOS40OTYgMTUuMDQ1NCAzOC44NjEzIDE1LjA0NTQgMzguMzI3NEMxNS4wNDU0IDM3Ljg1OTkgMTUuMDEyNiAzNi4yNTc1IDE1LjAxMjYgMzQuNTg3OUM5LjQ0NDUgMzUuNzkgOC4yODQ5OCAzMi4xODQxIDguMjg0OTggMzIuMTg0MUM3LjM5MDE1IDI5Ljg0NyA2LjA2NDI5IDI5LjI0NjMgNi4wNjQyOSAyOS4yNDYzQzQuMjQxODUgMjguMDExIDYuMTk3MDQgMjguMDExIDYuMTk3MDQgMjguMDExQzguMjE4NjEgMjguMTQ0NiA5LjI3OTM4IDMwLjA4MSA5LjI3OTM4IDMwLjA4MUMxMS4wNjg2IDMzLjE1MjIgMTMuOTUxOCAzMi4yODQ0IDE1LjExMTggMzEuNzUwMkMxNS4yNzczIDMwLjQ0ODEgMTUuODA3OSAyOS41NDY3IDE2LjM3MTMgMjkuMDQ2QzExLjkzMDMgMjguNTc4NSA3LjI1NzgxIDI2Ljg0MjUgNy4yNTc4MSAxOS4wOTY3QzcuMjU3ODEgMTYuODkzMiA4LjA1MjY3IDE1LjA5MDUgOS4zMTIxNiAxMy42ODg0QzkuMTEzNDQgMTMuMTg3NyA4LjQxNzMyIDExLjExNzQgOS41MTEyOCA4LjM0NjQ0QzkuNTExMjggOC4zNDY0NCAxMS4yMDE0IDcuODEyMTcgMTUuMDEyMiAxMC40MTY0QzE2LjY0MzggOS45NzQ5NSAxOC4zMjYzIDkuNzUwNCAyMC4wMTY1IDkuNzQ4NTFDMjEuNzA2NyA5Ljc0ODUxIDIzLjQyOTUgOS45ODI0NiAyNS4wMjA1IDEwLjQxNjRDMjguODMxNyA3LjgxMjE3IDMwLjUyMTggOC4zNDY0NCAzMC41MjE4IDguMzQ2NDRDMzEuNjE1OCAxMS4xMTc0IDMwLjkxOTIgMTMuMTg3NyAzMC43MjA1IDEzLjY4ODRDMzIuMDEzMiAxNS4wOTA1IDMyLjc3NTMgMTYuODkzMiAzMi43NzUzIDE5LjA5NjdDMzIuNzc1MyAyNi44NDI1IDI4LjEwMjggMjguNTQ0OSAyMy42Mjg3IDI5LjA0NkMyNC4zNTggMjkuNjgwMiAyNC45ODczIDMwLjg4MiAyNC45ODczIDMyLjc4NTFDMjQuOTg3MyAzNS40ODkzIDI0Ljk1NDUgMzcuNjU5NiAyNC45NTQ1IDM4LjMyN0MyNC45NTQ1IDM4Ljg2MTMgMjUuMzE5MiAzOS40OTYgMjYuMzEzMiAzOS4yOTU2QzM0LjI2NjcgMzYuNjI0MiAzOS45OTk5IDI5LjA3OTIgMzkuOTk5OSAyMC4xNjUzQzQwLjAzMjcgOS4wMTM4OCAzMS4wNTIgMCAyMC4wMTY1IDBaIiBmaWxsPSIjMjQyOTJGIi8+Cjwvc3ZnPgo="},"displayName":"GitHub","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":16,"name":"DevOps"}],"image":[]}}