{ "id": "D0I76cew5KOnlem0", "meta": { "instanceId": "fb924c73af8f703905bc09c9ee8076f48c17b596ed05b18c0ff86915ef8a7c4a", "templateCredsSetupCompleted": true }, "name": "Workflow stats", "tags": [], "nodes": [ { "id": "b1a73981-db6a-4fd2-9cad-d02bfecc7d3d", "name": "When clicking \"Test workflow\"", "type": "n8n-nodes-base.manualTrigger", "position": [ 1060, 740 ], "parameters": {}, "typeVersion": 1 }, { "id": "cbe2d1a8-51e9-4f3d-8ca5-321f3edf9a92", "name": "nodes-section", "type": "n8n-nodes-base.code", "position": [ 1900, 800 ], "parameters": { "jsCode": "// Initialize an empty object to hold the mapping between nodes and workflows\nconst nodeToWorkflowsMap = {};\n\n// Iterate over each workflow in the input\n$input.all().forEach(item => {\n const { wf_stats } = item.json;\n const { nodes_unique, wf_name, wf_url, wf_id } = wf_stats;\n\n // For each unique node in the workflow, update the mapping\n nodes_unique.forEach(node => {\n if (!nodeToWorkflowsMap[node]) {\n // If the node has not been added to the map, initialize it with the current workflow\n nodeToWorkflowsMap[node] = [{ wf_name, wf_url, wf_id }];\n } else {\n // If the node is already in the map, append the current workflow to its list\n nodeToWorkflowsMap[node].push({ wf_name, wf_url, wf_id });\n }\n });\n});\n\n// Convert the map into an array format suitable for n8n's output\nconst result = Object.keys(nodeToWorkflowsMap).map(node => ({\n json: {\n node,\n count: nodeToWorkflowsMap[node].length,\n workflows: nodeToWorkflowsMap[node]\n }\n}));\n\nreturn result;" }, "typeVersion": 2 }, { "id": "49a10bf3-f2e6-4fe9-8390-2a266f1b52a9", "name": "workflows-section", "type": "n8n-nodes-base.set", "position": [ 1680, 640 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "fd4aa80c-cd88-4a97-b943-dfcf1ab222ee", "name": "wf_stats", "type": "object", "value": "={{ { nodes_unique :[...new Set($json.nodes_array)],\n nodes_count_total:$json.nodes_array.length,\n nodes_count_uniq :[...new Set($json.nodes_array)].length,\n wf_created :DateTime.fromISO($json.createdAt).toFormat('yyyy-MM-dd HH:mm:ss'),\n wf_updated :DateTime.fromISO($json.updatedAt).toFormat('yyyy-MM-dd HH:mm:ss'),\n wf_name :$json.name,\n wf_id :`wf-${$json.id}`,\n wf_url :`${$json.instance_url}/workflow/${$json.id}` || \"\",\n wf_active :$json.active,\n wf_trigcount :$json.triggerCount,\n wf_tags :$json.tags_array,\n wf_whooks :$json.webhook_paths_array\n\n} }}" } ] } }, "typeVersion": 3.3 }, { "id": "afbbc6a0-dcb8-48e7-b2d1-ef00c769d3b7", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 1240, -120 ], "parameters": { "width": 1490, "height": 1375, "content": "## Create the main JSON object with the workflow statistics\n* `globals` - general information (# of workflows, active workflows, total trigger count)\n* `wf_stats` - summary per workflow (number or nodes, unique nodes, list of nodes and tags)\n* `nodes-section` - summary per node (number of workflows that use a node and their URLs)\n* `tags-section` - summary per tag (number of workflows that use a node and their URLs)\n* `webhook-section` - lists all webhook endpoints of the instance and shows the workflow URLs\n\n### You can use this JSON in BI tools to create a custom dashboard\n\n## Learn JS tips & tricks\n### Instead of just using one Code node, the workflow contains several nodes with useful advanced tricks.\n\n### JMESPath\n* Make a simple array of strings out of a complex array: `$jmespath($json,'nodes[*].type')`\n* Extract values based on condition: `$jmespath($input.all(),'[?json.wf_stats.wf_active == `true`]')`\n\n### Map and arrow functions\n* Perform operation on each array element: `.map(item => (item.split('.').pop().toUpperCase() ))`\n* Calculate sum of values from an array: `.reduce((accumulator, currentValue) => accumulator + currentValue, 0)`\n\n### Create an array with only unique values\n* `[...new Set($json.nodes_array)]`\n\n### Date-time conversions with the Luxon library:\n* `DateTime.fromISO($json.createdAt).toFormat('yyyy-MM-dd HH:mm:ss')`\n\n### Template literals (Template strings) for creating strings in JS\n* `wf-${$json.id}`" }, "typeVersion": 1 }, { "id": "9dcb369b-fe22-45e1-906d-848a85b0c1e4", "name": "tags-section", "type": "n8n-nodes-base.code", "position": [ 1900, 960 ], "parameters": { "jsCode": "// Initialize an empty object to hold the mapping between tags and workflows\nconst tagToWorkflowsMap = {};\n\n// Iterate over each workflow in the input\n$input.all().forEach(item => {\n const { wf_stats } = item.json;\n // Destructure wf_url along with other properties\n const { wf_tags, wf_name, wf_id, wf_url } = wf_stats;\n\n // Check if the workflow has tags\n if (wf_tags && wf_tags.length > 0) {\n // For each tag in the workflow, update the mapping\n wf_tags.forEach(tag => {\n if (!tagToWorkflowsMap[tag]) {\n // If the tag has not been added to the map, initialize it with the current workflow including wf_url\n tagToWorkflowsMap[tag] = [{ wf_name, wf_id, wf_url }];\n } else {\n // If the tag is already in the map, append the current workflow to its list including wf_url\n tagToWorkflowsMap[tag].push({ wf_name, wf_id, wf_url });\n }\n });\n } else {\n // Handle workflows with no tags, categorizing them under a 'No Tags' category\n const noTagKey = 'No Tags'; // or any other placeholder you prefer\n if (!tagToWorkflowsMap[noTagKey]) {\n // Initialize with the current workflow including wf_url\n tagToWorkflowsMap[noTagKey] = [{ wf_name, wf_id, wf_url }];\n } else {\n // Append the current workflow to its list including wf_url\n tagToWorkflowsMap[noTagKey].push({ wf_name, wf_id, wf_url });\n }\n }\n});\n\n// Convert the map into an array format suitable for n8n's output\nconst result = Object.keys(tagToWorkflowsMap).map(tag => ({\n json: {\n tag,\n count: tagToWorkflowsMap[tag].length,\n workflows: tagToWorkflowsMap[tag] // This now contains objects with wf_name, wf_id, and wf_url\n }\n}));\n\nreturn result;" }, "typeVersion": 2 }, { "id": "7509c96c-0907-4cf1-94cf-f9dfbc0d3f9d", "name": "globals-section", "type": "n8n-nodes-base.set", "position": [ 1900, 520 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "9e1284bd-73c5-4d3d-bb5d-3437fca97780", "name": "globals", "type": "object", "value": "={{ { global_total : $input.all().length,\n global_active : $jmespath($input.all(),'[?json.wf_stats.wf_active == `true`]').length,\n global_trigger: $jmespath($input.all(),'[].json.wf_stats.wf_trigcount').reduce((accumulator, currentValue) => accumulator + currentValue, 0) } }}" } ] } }, "executeOnce": true, "typeVersion": 3.3 }, { "id": "2c0bc2dd-63d9-4b65-9e4e-2920892efaf7", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [ 1060, 540 ], "parameters": {}, "typeVersion": 1 }, { "id": "8bceb3e9-e1d9-4ca0-af91-5377d4300346", "name": "Convert to XML", "type": "n8n-nodes-base.xml", "position": [ 1480, 1600 ], "parameters": { "mode": "jsonToxml", "options": { "headless": true } }, "typeVersion": 1 }, { "id": "6151d4b8-f592-418d-b099-17c71b1de0e4", "name": "Create HTML", "type": "n8n-nodes-base.html", "position": [ 1680, 1600 ], "parameters": { "html": "\n\n\n{{ $json.data }}" }, "typeVersion": 1 }, { "id": "e5ebc5c1-0fcc-4f9d-b8eb-df3a367cc097", "name": "Move Binary Data", "type": "n8n-nodes-base.moveBinaryData", "position": [ 1880, 1600 ], "parameters": { "mode": "jsonToBinary", "options": { "mimeType": "text/xml", "keepSource": false, "useRawData": true }, "sourceKey": "html", "convertAllData": false }, "typeVersion": 1 }, { "id": "5fdb74f7-6b2a-4042-91a2-c2088e8ea712", "name": "Respond to Webhook", "type": "n8n-nodes-base.respondToWebhook", "position": [ 2080, 1600 ], "parameters": { "options": { "responseCode": 200, "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "text/xml" }, { "name": "Control-Allow-Origin", "value": "*" } ] } }, "respondWith": "binary" }, "typeVersion": 1 }, { "id": "ed113e7c-c49f-4854-8fbf-5f7bf3591ede", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 1000, 1840 ], "parameters": { "color": 7, "width": 909, "height": 426, "content": "# DO NOT RUN THIS\n## This webhook is needed to comply with the CORS policy of modern browsers.\n### It generates XML template and serves it using your n8n URL\n\nXSLT template is created with 2 Set nodes:\n1. `Template elements` node defines each section of the Dashboard\n2. `Final template` node puts everything together\n3. Bootstrap 5.3 styling is added. You can save the .css and .js files on your server. Right now a CDN version of the librarly is used." }, "typeVersion": 1 }, { "id": "b6674f77-7797-4090-a4f9-56a9ddc0d4e0", "name": "Respond to Webhook2", "type": "n8n-nodes-base.respondToWebhook", "position": [ 1700, 2120 ], "parameters": { "options": { "responseCode": 200, "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "text/xsl" } ] } }, "respondWith": "text", "responseBody": "={{ $json.xsl_template }}" }, "typeVersion": 1 }, { "id": "c8c906da-0b61-46b0-be96-11da3c203e3f", "name": "Final template", "type": "n8n-nodes-base.set", "position": [ 1500, 2120 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "2a42cfed-0451-41c2-9634-865cac2ea68d", "name": "xsl_template", "type": "string", "value": "=\n \n \n \n n8n Workflows Dashboard\n \n \n \n \n \n
\n
\n{{ $json.sidebar }}\n\n
\n\n\n{{ $json.overview }}\n\n{{ $json.workflows }}\n\n{{ $json.nodes }}\n\n{{ $json.tags }}\n\n{{ $json.webhooks }}\n\n{{ $json.about }}\n\n
\n
\n
\n \n \n
\n
" } ] } }, "typeVersion": 3.3 }, { "id": "173493c0-1f96-4416-a545-6d8c6034ac76", "name": "Template elements", "type": "n8n-nodes-base.set", "position": [ 1300, 2120 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "afbcca70-2977-46a3-89c3-27a96f791d13", "name": "sidebar", "type": "string", "value": "= \n" }, { "id": "d6dc34a7-3c79-44ef-957c-63aec4b2d75a", "name": "overview", "type": "string", "value": "=
\n

n8n Workflow Dashboard

\n
\n\n
\n

Overview

\n
\n
\n
\n
\n
Total Workflows
\n

📊

\n
\n
\n
\n
\n
\n
\n
Active Workflows
\n

\n
\n
\n
\n
\n
\n
\n
Triggers Count
\n

\n
\n
\n
\n
\n
" }, { "id": "19ed123c-404b-4a68-a298-8f24c285f71c", "name": "workflows", "type": "string", "value": "=
\n

Workflows

\n \n
\n
\n
\n
\n \n \n \n \n \n checked\n \n \n \n
\n
\n
\n \n \n \n \n \n \n
\n
\n \n Updated At: \n \n \n Created At: \n \n \n Nodes (Tot | Uniq | Trig): | | \n \n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n
\n \n
\n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
" }, { "id": "9869134d-ee39-49a2-a978-eb3adaac482d", "name": "nodes", "type": "string", "value": "=
\n

Nodes

\n
\n \n
\n \n

\n \n \n \n \n \n

\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n 🔗\n \n \n \n
\n
\n
\n
\n
\n
\n" }, { "id": "f09bc0d1-017e-44f5-bc39-6bdfeffe22ec", "name": "tags", "type": "string", "value": "=
\n

Tags

\n
\n \n \n \n \n \n \n \n\n
\n

\n \n \n \n \n

\n
\n \n \n \n \n \n \n
\n \n \n \n \n \n \n 🔗\n \n \n \n
\n
\n
\n
\n
\n
\n" }, { "id": "2e1f449c-a59b-4eb7-a3b7-48bedff01812", "name": "webhooks", "type": "string", "value": "=
\n

Webhooks

\n
\n \n
\n \n

\n \n \n \n \n \n

\n
\n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n 🔗\n \n \n \n
\n
\n
\n
\n
\n
\n" }, { "id": "2af68003-c9b9-4e60-8836-195da026ad2f", "name": "about", "type": "string", "value": "=
\n
\n

About This Dashboard & Related Templates

\n
\n\n \n
\n \"Eduard\"\n

Eduard

\n

More templates

\n

LinkedIn

\n
\n\n \n
\n
\n
\n \"How\n
\n
\n \n
Read the article to find out more!
\n

This dashboard was created using XML template language (XSLT) in n8n.

\n Read Article\n
\n
\n
\n\n \n
\n
\n
\n
📚 Auto-generate documentation for n8n workflows with GPT and Docsify
\n

Creates a dynamic Docsify site with GPT-powered descriptions and Mermaid diagrams.

\n \n

Features live editing, tag filtering, and automated documentation updates for your n8n instance.

\n View Template\n
\n
\n
\n\n \n
\n
\n
\n
🔍 Visualize Your n8n Workflows with Mermaid.js!
\n

Generates interactive workflow flowcharts using Mermaid.js and Bootstrap.

\n \n

Instantly visualize structures with custom shapes and direct links to workflows, perfect for documentation.

\n View Template\n
\n
\n
\n\n
\n
\n" } ] } }, "typeVersion": 3.3 }, { "id": "3555218e-8df2-4ae8-9482-2c8ec99798c0", "name": "Sort-workflows", "type": "n8n-nodes-base.sort", "position": [ 2080, 640 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "order": "descending", "fieldName": "wf_stats.wf_updated" }, { "fieldName": "wf_stats.wf_name" } ] } }, "typeVersion": 1 }, { "id": "2d893970-825e-4842-811f-7e7a24dd3bac", "name": "Sort-nodes", "type": "n8n-nodes-base.sort", "position": [ 2080, 800 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "order": "descending", "fieldName": "count" }, { "fieldName": "node" } ] } }, "typeVersion": 1 }, { "id": "c197f00e-d147-45af-b121-a70d28912a7f", "name": "Sort-tags", "type": "n8n-nodes-base.sort", "position": [ 2080, 960 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "order": "descending", "fieldName": "count" }, { "fieldName": "tag" } ] } }, "typeVersion": 1 }, { "id": "4f28a9f6-b67e-42d8-8843-480803932c27", "name": "Aggregate-workflows", "type": "n8n-nodes-base.aggregate", "position": [ 2260, 640 ], "parameters": { "options": {}, "fieldsToAggregate": { "fieldToAggregate": [ { "fieldToAggregate": "wf_stats" } ] } }, "typeVersion": 1 }, { "id": "f4521a5c-8cc3-4831-90e2-1a1fda06fdac", "name": "Aggregate-nodes", "type": "n8n-nodes-base.aggregate", "position": [ 2260, 800 ], "parameters": { "options": {}, "aggregate": "aggregateAllItemData", "destinationFieldName": "nodes-section" }, "typeVersion": 1 }, { "id": "ae5040f7-4ae3-41e7-9afc-ebb625d303e7", "name": "Aggregate-tags", "type": "n8n-nodes-base.aggregate", "position": [ 2260, 960 ], "parameters": { "options": {}, "aggregate": "aggregateAllItemData", "destinationFieldName": "tags-section" }, "typeVersion": 1 }, { "id": "69a22d56-3b4e-4d5d-b351-3c787f23e9c9", "name": "n8n-get-workflows", "type": "n8n-nodes-base.n8n", "position": [ 1260, 640 ], "parameters": { "filters": {}, "requestOptions": {} }, "credentials": { "n8nApi": { "id": "45", "name": "n8n account 4" } }, "typeVersion": 1 }, { "id": "35564537-0053-4cdb-a05d-153ad4825393", "name": "Prepare JSON object", "type": "n8n-nodes-base.executeWorkflow", "position": [ 1260, 1600 ], "parameters": { "options": {}, "workflowId": "={{ $workflow.id }}" }, "typeVersion": 1 }, { "id": "9fd045f1-7126-4611-b26d-c45139429c6b", "name": "get-nodes-via-jmespath", "type": "n8n-nodes-base.set", "position": [ 1460, 640 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "51f83719-066f-4231-a418-ba64a3b5b831", "name": "nodes_array", "type": "array", "value": "={{$jmespath($json,'nodes[*].type').map(item => (item.split('.').pop().toUpperCase() ))}}" }, { "id": "bbc40849-66a7-4583-8c2c-ac590be59e38", "name": "tags_array", "type": "array", "value": "={{$jmespath($json,'tags[*].name')}}" }, { "id": "08064cc3-f34e-4f05-9975-726378fe63ae", "name": "instance_url", "type": "string", "value": "={{$env[\"N8N_PROTOCOL\"]}}://{{$env[\"N8N_HOST\"]}}" }, { "id": "1fdb9640-b628-4e13-9e4c-fef19cae7611", "name": "webhook_paths_array", "type": "array", "value": "={{ $jmespath($json, `nodes[?type=='n8n-nodes-base.webhook'].parameters.path | [?@]`) }}" } ] }, "includeOtherFields": true }, "typeVersion": 3.3 }, { "id": "45723a66-03be-4be7-ae4a-978adb5b7e7b", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ 960, 1280 ], "parameters": { "color": 6, "width": 1301.92628220859, "height": 1000.0640426993867, "content": "## Additional section to create a standalone dashboard via XLM templates\n### This section is not required if you only need a JSON\n\n### *IMPORTANT!*\n### This webhook is not protected. Everyone who knows the URL endpoint can get access to the Dashboard. Please consider adding authentication.\n\n1. `Request HTML dashboard` node runs that main section of the workflow\n2. It converts the JSON into an XML structure\n3. A final HTML page is created with the link to an XML stylesheet (this stylesheet controls the look of the dashboard)\n4. The resulting page is returned via `Respond to Webhook` node" }, "typeVersion": 1 }, { "id": "b17fbec5-03e2-4836-8704-6b31cdf92a5b", "name": "Request HTML dashboard", "type": "n8n-nodes-base.webhook", "position": [ 1060, 1600 ], "webhookId": "fb550a01-12f2-4709-ba2d-f71197b68340", "parameters": { "path": "fb550a01-12f2-4709-ba2d-f71197b68340", "options": {}, "responseMode": "responseNode" }, "typeVersion": 2 }, { "id": "70fd1bbb-24e2-4fde-b054-6319120a7ac4", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ 960, 940 ], "parameters": { "color": 3, "width": 663.915516288839, "height": 251.8866653838499, "content": "## IMPORTANT NOTE FOR CLOUD USERS\n### Since the cloud version doesn't support environmental variables, please make the following changes:\n\n1. **get-nodes-via-jmespath** node. Update the `instance_url` variable: enter your n8n URL instead of `{{$env[\"N8N_PROTOCOL\"]}}://{{$env[\"N8N_HOST\"]}}`\n2. **Create HTML** node. Please provide the n8n instance URL instead of `{{ $env.WEBHOOK_URL }}`" }, "typeVersion": 1 }, { "id": "36288776-5f67-40fd-872f-0eeac0dd03b0", "name": "Request xsl template", "type": "n8n-nodes-base.webhook", "position": [ 1100, 2120 ], "webhookId": "73a91e4d-143d-4168-9efb-6c56f2258aec", "parameters": { "path": "73a91e4d-143d-4168-9efb-6c56f2258aec/dashboard.xsl", "options": {}, "responseMode": "responseNode" }, "typeVersion": 2 }, { "id": "cda6fce6-0b0a-4fdf-b50c-b5bd874e43a0", "name": "Final-json", "type": "n8n-nodes-base.merge", "position": [ 2560, 540 ], "parameters": { "mode": "combine", "options": {}, "combineBy": "combineByPosition", "numberInputs": 5 }, "typeVersion": 3.1 }, { "id": "1a7acbda-0eb4-4d1a-b458-02457ee82a9b", "name": "webhook-section", "type": "n8n-nodes-base.code", "position": [ 1900, 1140 ], "parameters": { "jsCode": "// Initialize an empty object to hold the mapping between webhook paths and workflows\nconst webhookMap = {};\n\n// Iterate over each workflow item passed from the previous node\n$input.all().forEach(item => {\n // --- Extract Data ---\n // Ensure wf_stats exists in the item's JSON payload\n if (!item.json || !item.json.wf_stats) {\n console.warn(\"Skipping item due to missing json or wf_stats:\", JSON.stringify(item));\n return; // Skip this item if wf_stats is missing\n }\n\n const { wf_stats } = item.json;\n // Destructure the necessary fields from wf_stats\n // Use default values for safety\n const { wf_whooks, wf_name = 'Unknown Workflow', wf_url = '', wf_id = 'unknown-' + Date.now() } = wf_stats;\n\n // --- Process Webhooks ---\n // Check if wf_whooks exists and is an array with items\n if (Array.isArray(wf_whooks) && wf_whooks.length > 0) {\n const workflowInfo = { wf_name, wf_url, wf_id }; // Prepare workflow details object\n\n // For each webhook path associated with this workflow\n wf_whooks.forEach(hookpath => {\n // Ensure hookpath is a non-empty string before processing\n if (typeof hookpath === 'string' && hookpath.trim() !== '') {\n const cleanHookpath = hookpath.trim(); // Use trimmed path\n\n // If this webhook path hasn't been seen before, initialize it in the map\n if (!webhookMap[cleanHookpath]) {\n webhookMap[cleanHookpath] = [workflowInfo];\n } else {\n // If the path exists, add this workflow's info to its list\n // (Avoid adding duplicates if the same workflow info is already there for this path)\n if (!webhookMap[cleanHookpath].some(wf => wf.wf_id === wf_id)) {\n webhookMap[cleanHookpath].push(workflowInfo);\n }\n }\n } else {\n // Optional: Log if a non-string or empty path was found in the array\n console.warn(`Invalid hookpath found in wf_whooks for workflow ${wf_id}:`, hookpath);\n }\n });\n }\n // Workflows without any webhooks (empty wf_whooks array) will be skipped naturally\n});\n\n// --- Format Output ---\n// Convert the map ( { path: [workflows] } ) into an array of items for n8n output\nconst result = Object.keys(webhookMap).map(hookpath => ({\n json: {\n hookpath: hookpath, // The webhook path\n count: webhookMap[hookpath].length, // How many workflows use this path\n workflows: webhookMap[hookpath] // The list of { wf_name, wf_url, wf_id } objects\n }\n}));\n\n// Return the final array\nreturn result;\n" }, "typeVersion": 2 }, { "id": "0cfcd940-f000-47ce-8e46-36dab4068acb", "name": "Sort-whooks", "type": "n8n-nodes-base.sort", "position": [ 2080, 1140 ], "parameters": { "options": {}, "sortFieldsUi": { "sortField": [ { "order": "descending", "fieldName": "count" }, { "fieldName": "hookpath" } ] } }, "typeVersion": 1 }, { "id": "099ecc9b-ca8d-4ccb-aa64-30a563f27aeb", "name": "Aggregate-whooks", "type": "n8n-nodes-base.aggregate", "position": [ 2260, 1140 ], "parameters": { "options": {}, "aggregate": "aggregateAllItemData", "destinationFieldName": "whooks-section" }, "typeVersion": 1 }, { "id": "a01a78e6-0957-4602-a558-430b17000452", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 600, 1580 ], "parameters": { "width": 620, "content": "## ​\n# USE THIS WEBHOOK -->" }, "typeVersion": 1 } ], "active": true, "pinData": {}, "settings": { "callerPolicy": "workflowsFromSameOwner", "executionOrder": "v1", "saveManualExecutions": true, "saveDataSuccessExecution": "all" }, "versionId": "3fc1a529-eb6e-4f8a-9d7f-cb8e21e782a1", "connections": { "Sort-tags": { "main": [ [ { "node": "Aggregate-tags", "type": "main", "index": 0 } ] ] }, "Sort-nodes": { "main": [ [ { "node": "Aggregate-nodes", "type": "main", "index": 0 } ] ] }, "Create HTML": { "main": [ [ { "node": "Move Binary Data", "type": "main", "index": 0 } ] ] }, "Sort-whooks": { "main": [ [ { "node": "Aggregate-whooks", "type": "main", "index": 0 } ] ] }, "tags-section": { "main": [ [ { "node": "Sort-tags", "type": "main", "index": 0 } ] ] }, "nodes-section": { "main": [ [ { "node": "Sort-nodes", "type": "main", "index": 0 } ] ] }, "Aggregate-tags": { "main": [ [ { "node": "Final-json", "type": "main", "index": 3 } ] ] }, "Convert to XML": { "main": [ [ { "node": "Create HTML", "type": "main", "index": 0 } ] ] }, "Final template": { "main": [ [ { "node": "Respond to Webhook2", "type": "main", "index": 0 } ] ] }, "Sort-workflows": { "main": [ [ { "node": "Aggregate-workflows", "type": "main", "index": 0 } ] ] }, "Aggregate-nodes": { "main": [ [ { "node": "Final-json", "type": "main", "index": 2 } ] ] }, "globals-section": { "main": [ [ { "node": "Final-json", "type": "main", "index": 0 } ] ] }, "webhook-section": { "main": [ [ { "node": "Sort-whooks", "type": "main", "index": 0 } ] ] }, "Aggregate-whooks": { "main": [ [ { "node": "Final-json", "type": "main", "index": 4 } ] ] }, "Move Binary Data": { "main": [ [ { "node": "Respond to Webhook", "type": "main", "index": 0 } ] ] }, "Template elements": { "main": [ [ { "node": "Final template", "type": "main", "index": 0 } ] ] }, "n8n-get-workflows": { "main": [ [ { "node": "get-nodes-via-jmespath", "type": "main", "index": 0 } ] ] }, "workflows-section": { "main": [ [ { "node": "nodes-section", "type": "main", "index": 0 }, { "node": "tags-section", "type": "main", "index": 0 }, { "node": "globals-section", "type": "main", "index": 0 }, { "node": "Sort-workflows", "type": "main", "index": 0 }, { "node": "webhook-section", "type": "main", "index": 0 } ] ] }, "Aggregate-workflows": { "main": [ [ { "node": "Final-json", "type": "main", "index": 1 } ] ] }, "Prepare JSON object": { "main": [ [ { "node": "Convert to XML", "type": "main", "index": 0 } ] ] }, "Request xsl template": { "main": [ [ { "node": "Template elements", "type": "main", "index": 0 } ] ] }, "Request HTML dashboard": { "main": [ [ { "node": "Prepare JSON object", "type": "main", "index": 0 } ] ] }, "get-nodes-via-jmespath": { "main": [ [ { "node": "workflows-section", "type": "main", "index": 0 } ] ] }, "Execute Workflow Trigger": { "main": [ [ { "node": "n8n-get-workflows", "type": "main", "index": 0 } ] ] }, "When clicking \"Test workflow\"": { "main": [ [ { "node": "n8n-get-workflows", "type": "main", "index": 0 } ] ] } } }