Workflow: Workflow Importer
Integrations: code, executeCommand, extractFromFile, filter, form, formTrigger, httpRequest, if, merge, n8n, noOp, readWriteFile, removeDuplicates, renameKeys, set, sort, splitOut, stickyNote

{"id": "87FUCRVFV07sNlbM", "meta": {"instanceId": "505c2bdb4483cbbca32871c0acd4b60c83809f177e47e2864f71c1c1760a9b2a", "templateCredsSetupCompleted": true}, "name": "Workflow Importer", "tags": [], "nodes": [{"id": "eb3d4912-09c3-4c17-8e2b-94dd15e145f4", "name": "Extract from File", "type": "n8n-nodes-base.extractFromFile", "position": [2960, 440], "parameters": {"options": {}, "operation": "fromJson", "destinationKey": "workflowData", "binaryPropertyName": "Workflow_File"}, "typeVersion": 1}, {"id": "56b7a01f-47a0-4884-9200-5f5f695ab355", "name": "Export Credentials", "type": "n8n-nodes-base.executeCommand", "position": [3180, 620], "parameters": {"command": "n8n export:credentials --all --pretty --decrypted --output=/tmp/cred"}, "typeVersion": 1}, {"id": "85de1146-4d61-45bf-b225-956d3d16e84b", "name": "Get Credentials Data", "type": "n8n-nodes-base.readWriteFile", "position": [3400, 620], "parameters": {"options": {}, "fileSelector": "/tmp/cred"}, "typeVersion": 1}, {"id": "187f1f50-472f-41ac-96e8-9c2f17fa3c00", "name": "Binary to JSON", "type": "n8n-nodes-base.extractFromFile", "position": [3620, 620], "parameters": {"options": {}, "operation": "fromJson"}, "typeVersion": 1}, {"id": "85d79317-786a-49eb-ade4-f9d0949c5bf4", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [4060, 500], "parameters": {"mode": "combine", "options": {"includeUnpaired": true}, "combineBy": "combineByPosition"}, "typeVersion": 3}, {"id": "6976901c-a052-47fa-a754-217fd5d0f58e", "name": "Collect Credentials to Replace", "type": "n8n-nodes-base.merge", "position": [3040, 1120], "parameters": {}, "typeVersion": 3}, {"id": "c5b7ab56-c833-4405-913a-1a484094a6ff", "name": "Settings", "type": "n8n-nodes-base.set", "position": [980, 620], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "8a5d50fc-95dc-40b3-a3f2-293521bab29a", "name": "remoteInstances", "type": "array", "value": "="}]}}, "typeVersion": 3.4}, {"id": "a9287c9a-ddf4-4023-b997-bb7b12e2d0ee", "name": "Prepare Request Data", "type": "n8n-nodes-base.code", "position": [1640, 620], "parameters": {"jsCode": "output = {};\n\nfor (const instance of $('Settings').first().json.remoteInstances) {\n  if (instance.name == $('Choose Instance').first().json.Source) {\n    output.instance = instance;\n  }\n}\n\nreturn output;"}, "typeVersion": 2}, {"id": "85ccc4bf-a465-49bf-ac17-9933f1b9d46d", "name": "Get Workflows", "type": "n8n-nodes-base.httpRequest", "onError": "continueErrorOutput", "position": [1860, 620], "parameters": {"url": "={{ $json.instance.baseUrl }}/workflows", "options": {}, "sendBody": true, "sendHeaders": true, "bodyParameters": {"parameters": [{"name": "limit", "value": "250"}]}, "headerParameters": {"parameters": [{"name": "X-N8N-API-KEY", "value": "={{ $json.instance.apiKey }}"}]}}, "typeVersion": 4.2}, {"id": "2d86c12d-f308-4cdc-96a4-ab4cbecd39ad", "name": "No Operation", "type": "n8n-nodes-base.noOp", "position": [3180, 440], "parameters": {}, "typeVersion": 1}, {"id": "8ef0f34d-2468-450e-8a3c-e3d9ad9e371b", "name": "Determine Workflow Source", "type": "n8n-nodes-base.if", "position": [760, 500], "parameters": {"options": {}, "conditions": {"options": {"version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "f1d93a30-01c9-4141-85b2-8ceb762b9e86", "operator": {"name": "filter.operator.equals", "type": "string", "operation": "equals"}, "leftValue": "={{ $json.Source }}", "rightValue": "File Upload"}]}}, "typeVersion": 2.2}, {"id": "3ff270a7-5837-40b5-85b4-da3b28ae6147", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [920, 520], "parameters": {"width": 216.47293010628914, "height": 255.86856541619233, "content": "## Setup instances\nEach instnce requires a name, apiKey and baseURL"}, "typeVersion": 1}, {"id": "4d0d4684-5ffc-4e12-8d05-55245339fd96", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [380, 680], "parameters": {"color": 5, "width": 535.6419634856759, "height": 223.19907940161124, "content": "## Instances config example\n```\n[\n  {\n    \"name\": \"n8n-test\",\n    \"apiKey\": \"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n    \"baseUrl\": \"https://n8n-test.example.com/api/v1\"\n  },\n  {\n    ...\n  }\n]\n```"}, "typeVersion": 1}, {"id": "e76e291e-511b-4612-836f-ae6f7af1d3de", "name": "Sticky Note7", "type": "n8n-nodes-base.stickyNote", "position": [480, 400], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "A form which collects the source option.\n*Consider securing the form using Basic Auth.*"}, "typeVersion": 1}, {"id": "38ecbde8-9081-4509-9fa3-c5b2d568ebad", "name": "Sticky Note8", "type": "n8n-nodes-base.stickyNote", "position": [700, 400], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Switch between the available options"}, "typeVersion": 1}, {"id": "efa893aa-fce5-45ff-a234-6e73235a33ea", "name": "Error1", "type": "n8n-nodes-base.form", "position": [3700, 1220], "webhookId": "5c7933f0-f09a-4bc6-9e68-cf73e8fb5813", "parameters": {"options": {}, "operation": "completion", "completionTitle": "\u26a0\ufe0f Import failed", "completionMessage": "=Please check the workflow settings"}, "typeVersion": 1}, {"id": "e5edd30e-6396-407a-bd3b-a5e0f66c7e3a", "name": "Error", "type": "n8n-nodes-base.form", "position": [2080, 700], "webhookId": "5c7933f0-f09a-4bc6-9e68-cf73e8fb5813", "parameters": {"options": {}, "operation": "completion", "completionTitle": "\u26a0\ufe0f Failed retrieving workflows", "completionMessage": "=Please check the workflow settings"}, "typeVersion": 1}, {"id": "c410045e-4adf-4304-910a-7cd5868892d3", "name": "Split Out Workflows", "type": "n8n-nodes-base.splitOut", "position": [2080, 540], "parameters": {"options": {}, "fieldToSplitOut": "data"}, "typeVersion": 1}, {"id": "5fafa399-0c6b-4db0-9b01-319a02368eee", "name": "Get Workflow Names", "type": "n8n-nodes-base.code", "position": [2520, 540], "parameters": {"jsCode": "dropDownValues = [];\n\nfor (const workflow of $input.all()) {\n  dropDownValues.push({\"option\": workflow.json.name});\n}\n\nreturn { \"options\": JSON.stringify(dropDownValues) };"}, "typeVersion": 2}, {"id": "b7408a47-97ff-45da-b8e7-bb2380f61155", "name": "Sort by updatedAt DESC", "type": "n8n-nodes-base.sort", "position": [2300, 540], "parameters": {"options": {}, "sortFieldsUi": {"sortField": [{"order": "descending", "fieldName": "updatedAt"}]}}, "typeVersion": 1}, {"id": "74741a71-79b8-4479-9dac-826db7984620", "name": "No Operation1", "type": "n8n-nodes-base.noOp", "position": [4280, 680], "parameters": {}, "typeVersion": 1}, {"id": "89657c6f-a703-4145-b690-7234583bbe7a", "name": "Sticky Note9", "type": "n8n-nodes-base.stickyNote", "position": [1500, 1240], "parameters": {"color": 7, "width": 216.47293010628914, "height": 294.9905826938254, "content": "## Map Credentials\nBeing mapped by name since one workflow can have multiple credentials of the same type."}, "typeVersion": 1}, {"id": "a2d21bb5-5118-4ea2-920b-1c05570da610", "name": "Rename Keys", "type": "n8n-nodes-base.renameKeys", "position": [3840, 620], "parameters": {"keys": {"key": [{"newKey": "allCredentials", "currentKey": "data"}]}, "additionalOptions": {}}, "typeVersion": 1}, {"id": "d756edc6-cf0d-4a35-b29c-99e5ec41c4db", "name": "Create Workflow", "type": "n8n-nodes-base.n8n", "onError": "continueErrorOutput", "position": [3480, 1120], "parameters": {"operation": "create", "requestOptions": {}, "workflowObject": "={{ $json.toJsonString() }}"}, "credentials": {"n8nApi": {"id": "taiQiy4KxXUI20Af", "name": "n8n account"}}, "typeVersion": 1}, {"id": "4d75a5b1-5227-41a4-87cc-67a5a8074f37", "name": "Upload File", "type": "n8n-nodes-base.form", "position": [1420, 440], "webhookId": "b9850dfc-ecf9-45c8-ae68-39327c6a0143", "parameters": {"options": {"formTitle": "Upload File", "formDescription": "Choose an n8n workflow file"}, "formFields": {"values": [{"fieldType": "file", "fieldLabel": "Workflow File", "requiredField": true, "acceptFileTypes": ".json"}]}}, "typeVersion": 1}, {"id": "5e5e3ece-00b3-4790-89e0-35d3c8d03b7d", "name": "Choose Workflow", "type": "n8n-nodes-base.form", "position": [2740, 540], "webhookId": "100af69b-5203-48d3-8e90-1e846d0752d4", "parameters": {"options": {"formTitle": "Choose Workflow", "formDescription": "Choose the remote workflow which should be imported"}, "defineForm": "json", "jsonOutput": "=[\n   {\n      \"fieldLabel\": \"Workflow\",\n      \"fieldType\": \"dropdown\",\n      \"requiredField\": true,\n      \"fieldOptions\": {\n        \"values\": {{ $json.options }}\n      }\n   }\n]"}, "typeVersion": 1}, {"id": "7fcc236c-dd97-4a1e-bf3d-d85aba520938", "name": "Success", "type": "n8n-nodes-base.form", "position": [3700, 1020], "webhookId": "5c7933f0-f09a-4bc6-9e68-cf73e8fb5813", "parameters": {"options": {}, "operation": "completion", "completionTitle": "\u2705 Import completed", "completionMessage": "=The workflow has been created successfully. {{ $if($('Get Missing Credentials').all().length > 0, \"Please head over to your credentials and update all new entries with a trailing \u26a0\ufe0f symbol.\", \"\") }} "}, "typeVersion": 1}, {"id": "27736a52-af15-47f8-8186-d486b2968256", "name": "Choose Instance", "type": "n8n-nodes-base.form", "position": [1420, 620], "webhookId": "2a40fe8d-7b6b-4695-845c-2d278f5bf93e", "parameters": {"options": {"formTitle": "Select Source Instance", "formDescription": "Choose the n8n instance where to retrieve workflows from"}, "defineForm": "json", "jsonOutput": "=[\n   {\n      \"fieldLabel\": \"Source\",\n      \"fieldType\": \"dropdown\",\n      \"requiredField\": true,\n      \"fieldOptions\": {\n        \"values\": {{ $json.options }}\n      }\n   }\n]"}, "typeVersion": 1}, {"id": "9b83c34d-0b0b-47bc-b4a7-27eed0e796fb", "name": "On form submission", "type": "n8n-nodes-base.formTrigger", "position": [540, 500], "webhookId": "2c9b2fa1-3235-4b73-a6e0-73392dcb9ed0", "parameters": {"options": {"buttonLabel": "Continue", "appendAttribution": false}, "formTitle": "Workflow Import", "formFields": {"values": [{"fieldType": "dropdown", "fieldLabel": "Source", "fieldOptions": {"values": [{"option": "File Upload"}, {"option": "Remote Instance"}]}, "requiredField": true}]}, "formDescription": "This tool allows importing an n8n workflow from a file or another n8n instance\n\nKeep in mind that your destination n8n instance (this environment) should always run on an equal or newer version then compared to the source."}, "typeVersion": 2.2}, {"id": "f6d45cd9-a091-4c8b-8ef0-6815a1adb0f1", "name": "Generate Instance Options", "type": "n8n-nodes-base.code", "position": [1200, 620], "parameters": {"jsCode": "dropDownValues = [];\n\nfor (const instance of $input.first().json.remoteInstances) {\n  dropDownValues.push({\"option\": instance.name});\n}\n\nreturn { \"options\": JSON.stringify(dropDownValues) };"}, "typeVersion": 2}, {"id": "73717c97-4579-4e49-ac33-4aada3bcaf55", "name": "Sticky Note10", "type": "n8n-nodes-base.stickyNote", "position": [1140, 520], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Prepare a list of options for the next form"}, "typeVersion": 1}, {"id": "0537d195-3885-4903-8a41-56915f7b64de", "name": "Sticky Note11", "type": "n8n-nodes-base.stickyNote", "position": [1360, 360], "parameters": {"color": 7, "width": 216.47293010628914, "height": 416.4415465717213, "content": "Request more input from the user"}, "typeVersion": 1}, {"id": "43ee5820-e236-49f9-b89b-e4c5d4dd4188", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [1580, 520], "parameters": {"color": 7, "width": 435.59135570107514, "height": 255.86856541619233, "content": "Map Settings to selected instance and retrieve all workflows from it"}, "typeVersion": 1}, {"id": "53a42c23-af05-4e21-a936-14d2419b4530", "name": "Sticky Note12", "type": "n8n-nodes-base.stickyNote", "position": [2020, 440], "parameters": {"color": 7, "width": 656.1389569291234, "height": 255.86856541619233, "content": "Prepare a list of options for the next form"}, "typeVersion": 1}, {"id": "fd103846-04a6-4fb0-aba4-6230a85a7555", "name": "Sticky Note13", "type": "n8n-nodes-base.stickyNote", "position": [2680, 440], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Let the user choose a workflow from a list"}, "typeVersion": 1}, {"id": "e58bdf1e-fcda-4b68-9798-24de0c7c6bd9", "name": "Sticky Note14", "type": "n8n-nodes-base.stickyNote", "position": [3120, 560], "parameters": {"color": 7, "width": 875.9451799951569, "height": 216.1478580797073, "content": "Retrieve all credentials from this instance and convert the data to the final JSON format"}, "typeVersion": 1}, {"id": "08855416-ca33-4344-b96b-4564d9841dfd", "name": "Get Selected Workflow", "type": "n8n-nodes-base.code", "position": [2960, 620], "parameters": {"jsCode": "for (const workflow of $('Get Workflows').first().json.data) {\n  if (workflow.name == $input.first().json.Workflow) {\n    \n    return { \"workflowData\": workflow };\n  }\n}\n\nreturn false;"}, "typeVersion": 2}, {"id": "9a09a6b5-2b8d-461e-b63f-91100c3e7974", "name": "Sticky Note15", "type": "n8n-nodes-base.stickyNote", "position": [2900, 360], "parameters": {"color": 7, "width": 216.47293010628914, "height": 416.4415465717213, "content": "Convert the retrieved workflow into the final JSON format"}, "typeVersion": 1}, {"id": "269c32c3-224b-42df-bd27-7718374cb343", "name": "Sticky Note16", "type": "n8n-nodes-base.stickyNote", "position": [4000, 420], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Combine the workflow and credential data to one item"}, "typeVersion": 1}, {"id": "c9bbc713-3ac7-42d7-85c3-0c8aa22201d4", "name": "Split Out Nodes", "type": "n8n-nodes-base.splitOut", "position": [1060, 1020], "parameters": {"options": {}, "fieldToSplitOut": "workflowData.nodes"}, "typeVersion": 1}, {"id": "e4c37af5-64de-4d40-9ff1-3a622ea40b86", "name": "Filter Out Nodes Having Credentials", "type": "n8n-nodes-base.filter", "position": [1280, 1020], "parameters": {"options": {}, "conditions": {"options": {"version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "b14ec02c-c52c-4907-8f55-ebb168a8b10e", "operator": {"type": "object", "operation": "exists", "singleValue": true}, "leftValue": "={{ $json.credentials }}", "rightValue": ""}]}}, "typeVersion": 2.2}, {"id": "bdb20dfd-1b47-4b50-a938-19f7790d180b", "name": "Extract Credentials", "type": "n8n-nodes-base.set", "position": [1500, 1020], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "b37508a3-188e-4e6e-b251-b6a34ac193be", "name": "type", "type": "string", "value": "={{ $json.credentials.keys()[0] }}"}, {"id": "fc308784-91ec-4b6b-8bca-2c01472574a7", "name": "name", "type": "string", "value": "={{ $json.credentials[$json.credentials.keys()[0]].name }}"}, {"id": "a3142dc0-021d-4191-815b-d5cf6d9fe6a8", "name": "id", "type": "string", "value": "={{ $json.credentials[$json.credentials.keys()[0]].id }}"}]}}, "typeVersion": 3.4}, {"id": "554e0ee3-e722-4dcf-b82b-ea1ea59a037e", "name": "Remove Duplicate Credentials by Name", "type": "n8n-nodes-base.removeDuplicates", "position": [1720, 1020], "parameters": {"compare": "selectedFields", "options": {}, "fieldsToCompare": "name"}, "typeVersion": 2}, {"id": "0da2c486-ea7a-465b-b3cd-88e09e63c06b", "name": "Map Credentials", "type": "n8n-nodes-base.form", "position": [2160, 1020], "webhookId": "5aca5fbe-cbff-4824-8586-cd59967dd154", "parameters": {"options": {"formTitle": "Map Credentials", "buttonLabel": "Import Workflow", "formDescription": "Each option is labeled with the name of the original credential. Select the according credential for each item.\n\nYou can also choose to create a new credential. It will then create an empty credential, using the name of the original one, which you can configure afterwards."}, "defineForm": "json", "jsonOutput": "={{ $json.options }}"}, "typeVersion": 1}, {"id": "8b92114e-6aa6-4404-a7f1-6224a45acdae", "name": "Get Selected Credentials", "type": "n8n-nodes-base.code", "position": [2380, 1220], "parameters": {"jsCode": "function capitalizeFirstLetter(val) {\n    return String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n\nlet missingCredentials = [];\nfor (const credential of $('Remove Duplicate Credentials by Name').all()) {\n  let type = credential.json.type;\n  let oldName = credential.json.name;\n  let name = $('Map Credentials').first().json[credential.json.name];\n  if (name != \"[create new]\") {\n    for (const credentialData of $('Merge').first().json.allCredentials) {\n      if (credentialData.name == name) {\n        id = credentialData.id;\n        continue;\n      }\n    }\n    missingCredentials.push({\n      \"oldName\": oldName,\n      \"name\": name,\n      \"type\": type,\n      \"id\": id\n    });\n  }\n}\n\nreturn missingCredentials;"}, "typeVersion": 2}, {"id": "bafcb91c-f441-40de-a1fd-7435206d991e", "name": "Add Old Names", "type": "n8n-nodes-base.set", "position": [2820, 1020], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "19847be5-420a-4dd7-8a45-fed1a1cbc0b8", "name": "oldName", "type": "string", "value": "={{ $json.name.replace(\" \u26a0\ufe0f\", \"\") }}"}]}, "includeOtherFields": true}, "typeVersion": 3.4}, {"id": "8da7f198-5e85-4d88-907e-1e35a55bdb96", "name": "Replace Credentials in Workflow", "type": "n8n-nodes-base.code", "position": [3260, 1120], "parameters": {"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nlet workflowData = $('Merge').first().json.workflowData;\nfor (const credential of $input.all()) {  \n  for (const nodes of workflowData.nodes) {\n    if (nodes.credentials \n        && nodes.credentials[credential.json.type] !== undefined \n        && nodes.credentials[credential.json.type].name == credential.json.oldName) {\n      nodes.credentials[credential.json.type].id = credential.json.id;\n      nodes.credentials[credential.json.type].name = credential.json.name;\n    }\n  }\n}\n\nreturn workflowData;\n\n"}, "typeVersion": 2}, {"id": "f370d4fb-229e-4604-a1b1-c7c0cab8a32d", "name": "Sticky Note17", "type": "n8n-nodes-base.stickyNote", "position": [1000, 920], "parameters": {"color": 7, "width": 875.6296366281999, "height": 257.0479807900252, "content": "Extract a list of all credentials from the workflow. The reference will be the old/existing name of the credential, since one workflow can contain multiple credentials of the same type."}, "typeVersion": 1}, {"id": "31c0d4b7-4682-4db1-a453-0f1d69c58665", "name": "Sticky Note18", "type": "n8n-nodes-base.stickyNote", "position": [2100, 920], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Let the user map every credential or create new ones"}, "typeVersion": 1}, {"id": "d3c5edb1-74dc-4168-a987-84cdd54714cd", "name": "Generate Credential Options", "type": "n8n-nodes-base.code", "position": [1940, 1020], "parameters": {"jsCode": "function capitalizeFirstLetter(val) {\n    return String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n\nformOptions = [];\nfor (const item of $input.all()) {\n  dropDownValues = [];\n  for (const credential of $('Merge').first().json.allCredentials) {\n    if (credential.type == item.json.type) {\n      dropDownValues.push({\"option\": credential.name});\n    }\n  }\n  dropDownValues.push({\"option\": \"[create new]\"});\n  formOptions.push({\n      \"fieldLabel\": item.json.name,\n      \"fieldType\": \"dropdown\",\n      \"requiredField\": true,\n      \"fieldOptions\": {\n        \"values\": dropDownValues\n      }\n  });\n}\n\nreturn { \"options\": JSON.stringify(formOptions) };"}, "typeVersion": 2}, {"id": "255ff6ab-d360-49dd-b63f-9f0d99278ae4", "name": "Sticky Note19", "type": "n8n-nodes-base.stickyNote", "position": [1880, 920], "parameters": {"color": 7, "width": 216.47293010628914, "height": 255.86856541619233, "content": "Prepare a list of options for the next form"}, "typeVersion": 1}, {"id": "ae074b5a-d76a-4529-ba59-0d201dbd4e9e", "name": "Sticky Note20", "type": "n8n-nodes-base.stickyNote", "position": [2320, 920], "parameters": {"color": 7, "width": 216.47293010628914, "height": 456.12289999575364, "content": "Split mapped credentials into two streams, depending on wether they exist or not"}, "typeVersion": 1}, {"id": "1b6d26af-9d6b-4865-bd81-8a5de49bc741", "name": "Sticky Note21", "type": "n8n-nodes-base.stickyNote", "position": [2540, 919.7999999999997], "parameters": {"color": 7, "width": 435.95830414662703, "height": 276.068565416192, "content": "Create empty credentials if the option \"[create credential]\" was selected. and add the name of the originally assigned credential for future reference"}, "typeVersion": 1}, {"id": "5ba8987a-7558-4fb8-94ef-ac2b81df5536", "name": "Create Empty Credentials", "type": "n8n-nodes-base.n8n", "position": [2600, 1020], "parameters": {"data": "={{ $json.data.toJsonString() }}", "name": "={{ $json.name }}", "resource": "credential", "requestOptions": {}, "credentialTypeName": "={{ $json.type }}"}, "credentials": {"n8nApi": {"id": "taiQiy4KxXUI20Af", "name": "n8n account"}}, "typeVersion": 1}, {"id": "7efa8f88-f5a0-47c8-8d12-2cb8c9b0e0c7", "name": "Get Missing Credentials", "type": "n8n-nodes-base.code", "position": [2380, 1020], "parameters": {"jsCode": "function capitalizeFirstLetter(val) {\n    return String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n\nlet missingCredentials = [];\nfor (const credential of $('Remove Duplicate Credentials by Name').all()) {\n  let type = credential.json.type;\n  let name = $('Map Credentials').first().json[credential.json.name];\n  if (name == \"[create new]\") {\n    data = {};\n    if (type.includes(\"OAuth\")) {\n      data = { \"clientId\": \"\", \"clientSecret\": \"\" };\n    }\n    missingCredentials.push({\n      \"name\": credential.json.name + \" \u26a0\ufe0f\",\n      \"type\": type,\n      \"data\": data\n    });\n  }\n}\n\nreturn missingCredentials;"}, "typeVersion": 2}, {"id": "2394952f-c6db-4c6e-8f62-080c952734c9", "name": "Sticky Note22", "type": "n8n-nodes-base.stickyNote", "position": [2980, 1020], "parameters": {"color": 7, "width": 435.95830414662703, "height": 276.068565416192, "content": "Gather all new credential data and update the workflow accordingly. The oldName is being used as a reference during the search. "}, "typeVersion": 1}, {"id": "4ee2a621-29c9-4d23-b222-0b31ff1cc903", "name": "Sticky Note23", "type": "n8n-nodes-base.stickyNote", "position": [3420, 1020], "parameters": {"color": 7, "width": 216.47293010628914, "height": 275.841854198618, "content": "Create the updated workflow on this instance"}, "typeVersion": 1}, {"id": "e041c560-e847-472e-888e-0b6b3edb8998", "name": "Sticky Note24", "type": "n8n-nodes-base.stickyNote", "position": [3640, 920], "parameters": {"color": 7, "width": 216.47293010628914, "height": 456.12289999575364, "content": "Provide feedback to the user wether the process was successful or not"}, "typeVersion": 1}], "active": false, "pinData": {}, "settings": {"executionOrder": "v1"}, "versionId": "5ee2c284-b417-4ab6-b0bf-effa25225dbf", "connections": {"Merge": {"main": [[{"node": "No Operation1", "type": "main", "index": 0}]]}, "Settings": {"main": [[{"node": "Generate Instance Options", "type": "main", "index": 0}]]}, "Rename Keys": {"main": [[{"node": "Merge", "type": "main", "index": 1}]]}, "Upload File": {"main": [[{"node": "Extract from File", "type": "main", "index": 0}]]}, "No Operation": {"main": [[{"node": "Merge", "type": "main", "index": 0}]]}, "Add Old Names": {"main": [[{"node": "Collect Credentials to Replace", "type": "main", "index": 0}]]}, "Get Workflows": {"main": [[{"node": "Split Out Workflows", "type": "main", "index": 0}], [{"node": "Error", "type": "main", "index": 0}]]}, "No Operation1": {"main": [[{"node": "Split Out Nodes", "type": "main", "index": 0}]]}, "Binary to JSON": {"main": [[{"node": "Rename Keys", "type": "main", "index": 0}]]}, "Choose Instance": {"main": [[{"node": "Prepare Request Data", "type": "main", "index": 0}]]}, "Choose Workflow": {"main": [[{"node": "Get Selected Workflow", "type": "main", "index": 0}]]}, "Create Workflow": {"main": [[{"node": "Success", "type": "main", "index": 0}], [{"node": "Error1", "type": "main", "index": 0}]]}, "Map Credentials": {"main": [[{"node": "Get Missing Credentials", "type": "main", "index": 0}, {"node": "Get Selected Credentials", "type": "main", "index": 0}]]}, "Split Out Nodes": {"main": [[{"node": "Filter Out Nodes Having Credentials", "type": "main", "index": 0}]]}, "Extract from File": {"main": [[{"node": "Export Credentials", "type": "main", "index": 0}, {"node": "No Operation", "type": "main", "index": 0}]]}, "Export Credentials": {"main": [[{"node": "Get Credentials Data", "type": "main", "index": 0}]]}, "Get Workflow Names": {"main": [[{"node": "Choose Workflow", "type": "main", "index": 0}]]}, "On form submission": {"main": [[{"node": "Determine Workflow Source", "type": "main", "index": 0}]]}, "Extract Credentials": {"main": [[{"node": "Remove Duplicate Credentials by Name", "type": "main", "index": 0}]]}, "Split Out Workflows": {"main": [[{"node": "Sort by updatedAt DESC", "type": "main", "index": 0}]]}, "Get Credentials Data": {"main": [[{"node": "Binary to JSON", "type": "main", "index": 0}]]}, "Prepare Request Data": {"main": [[{"node": "Get Workflows", "type": "main", "index": 0}]]}, "Get Selected Workflow": {"main": [[{"node": "Export Credentials", "type": "main", "index": 0}, {"node": "No Operation", "type": "main", "index": 0}]]}, "Sort by updatedAt DESC": {"main": [[{"node": "Get Workflow Names", "type": "main", "index": 0}]]}, "Get Missing Credentials": {"main": [[{"node": "Create Empty Credentials", "type": "main", "index": 0}]]}, "Create Empty Credentials": {"main": [[{"node": "Add Old Names", "type": "main", "index": 0}]]}, "Get Selected Credentials": {"main": [[{"node": "Collect Credentials to Replace", "type": "main", "index": 1}]]}, "Determine Workflow Source": {"main": [[{"node": "Upload File", "type": "main", "index": 0}], [{"node": "Settings", "type": "main", "index": 0}]]}, "Generate Instance Options": {"main": [[{"node": "Choose Instance", "type": "main", "index": 0}]]}, "Generate Credential Options": {"main": [[{"node": "Map Credentials", "type": "main", "index": 0}]]}, "Collect Credentials to Replace": {"main": [[{"node": "Replace Credentials in Workflow", "type": "main", "index": 0}]]}, "Replace Credentials in Workflow": {"main": [[{"node": "Create Workflow", "type": "main", "index": 0}]]}, "Filter Out Nodes Having Credentials": {"main": [[{"node": "Extract Credentials", "type": "main", "index": 0}]]}, "Remove Duplicate Credentials by Name": {"main": [[{"node": "Generate Credential Options", "type": "main", "index": 0}]]}}}