{"workflow":{"id":12802,"name":"Monitor Azure subscription resources with cost and usage tracking and reports","views":66,"recentViews":0,"totalViews":66,"createdAt":"2026-01-18T21:59:21.537Z","description":"# Monitor Azure subscription resources with cost and usage tracking\n\n## Template Name\nMonitor Azure subscription resources with cost and usage tracking\n\n## Description\n\nAutomatically connect to your Azure subscription to retrieve all resources and track costs. Generates formatted reports with total spending, top expensive resources, and cost breakdown by type.\n\n## Who's it for\n\nDevOps Engineers, Cloud Architects, Finance Teams, IT Managers, and organizations implementing FinOps practices.\n\n## How it works\n\n1. **Authentication**: OAuth2 Service Principal with Azure\n2. **Resource Discovery**: Queries Azure Resource Graph API\n3. **Cost Retrieval**: Fetches data from Cost Management API\n4. **Data Processing**: Merges resources with costs\n5. **Report Generation**: Creates text/HTML reports\n6. **Output**: Excel export, Power BI streaming, or API/Webhook response\n\n## Set up steps\n\n### Prerequisites\n\n- Azure Subscription with appropriate permissions\n- Azure Service Principal with Reader and Cost Management Reader roles\n\n### Setup\n\n**1. Create Azure Service Principal**\n\nAzure CLI:\n```bash\naz ad sp create-for-rbac --name \"n8n-cost-monitor\" --role \"Reader\" --scopes /subscriptions/{sub-id}\naz role assignment create --assignee {client-id} --role \"Cost Management Reader\" --scope /subscriptions/{sub-id}\n```\n\nOr use Azure Portal: Azure AD → App registrations → New registration → Assign roles\n\n**2. Configure n8n OAuth2 Credential**\n\n- Credentials → OAuth2 API\n- Grant Type: Client Credentials\n- Access Token URL: `https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token`\n- Scope: `https://management.azure.com/.default`\n\n**3. Update Workflow Configuration**\n\n- Open \"Set Configuration\" node\n- Update `subscriptionId` and `tenantId`\n- Set `timeRange` (see options below)\n- Assign OAuth2 credential to HTTP nodes\n\n**Time Range Options:**\n- `currentMonth` - Current billing month (default)\n- `lastMonth` - Previous full month\n- `last30Days` - Last 30 days\n- `last90Days` - Last 90 days (3 months)\n- `last6Months` - Last 6 months\n- `yearToDate` - From Jan 1 to today\n- `lastYear` - Full previous year (365 days)\n- `custom` - Manually set startDate and endDate\n\n**4. Enable Output Options (Optional)**\n\n- **Excel**: Enable \"Export to Excel\" node for .xlsx downloads\n- **Power BI**: Enable \"Prepare Power BI Data\" and \"Send to Power BI\" nodes with Push URL\n- **API/Webhook**: Enable \"Respond to Webhook\" node and change trigger to Webhook\n\n**5. Schedule (Optional)**\n\nReplace Manual Trigger with Schedule Trigger (daily: `0 9 * * *`)\n\n## Requirements\n\n### Azure Requirements\n- Active Azure subscription\n- Permissions to create Service Principal\n- Permissions to assign Reader and Cost Management Reader roles\n\n### n8n Requirements\n- n8n instance (cloud or self-hosted version 1.0+)\n- Ability to create OAuth2 credentials\n\n### Optional Requirements\n- Slack workspace (for Slack notifications)\n- Email service credentials (for email reports)\n- Database instance (for data storage)\n\n## How to customize the workflow\n\n### Enable Output Options\n\nThe workflow includes three disabled output nodes. To enable them:\n\n1. Click on the node (Excel Export, Power BI, or Webhook Response)\n2. Click the three dots menu → Enable\n3. Configure the node settings as needed\n\n### Excel Export Configuration\n\nThe Excel export node is pre-configured but disabled. To use it:\n\n```javascript\n// Already configured to export:\n- All resources with their costs\n- Formatted as Excel (.xlsx)\n- Filename includes current date\n- Headers included automatically\n```\n\nTo customize:\n- Change filename pattern in the node settings\n- Add/remove columns by modifying the data mapping\n- Export to CSV instead by changing the file extension\n\n### Power BI Integration\n\n**Step 1: Create Power BI Streaming Dataset**\n\n1. Go to Power BI workspace\n2. Create New → Streaming dataset → API\n3. Define schema:\n```json\n{\n  \"summary\": {\n    \"totalCost\": \"string\",\n    \"resourceCount\": \"number\",\n    \"period\": \"string\"\n  },\n  \"resources\": [\n    {\n      \"resourceName\": \"string\",\n      \"resourceType\": \"string\",\n      \"cost\": \"string\"\n    }\n  ],\n  \"timestamp\": \"datetime\",\n  \"reportType\": \"string\"\n}\n```\n4. Copy the Push URL\n\n**Step 2: Configure n8n Workflow**\n\n1. Enable \"Prepare Power BI Data\" node\n2. Enable \"Send to Power BI\" node\n3. Update the URL in \"Send to Power BI\" node with your Push URL\n4. Test the workflow\n\n**Step 3: Create Power BI Dashboard**\n\n- Create visualizations from the streaming dataset\n- Add cards for Total Cost, Resource Count\n- Add tables for Top Resources\n- Add charts for Cost by Type\n\n### API Response / Webhook Mode\n\nTo use the workflow as an API endpoint:\n\n**Step 1: Change Trigger**\n\n1. Delete \"Manual Trigger\" node\n2. Add \"Webhook\" trigger node\n3. Choose GET or POST method\n4. Copy the webhook URL\n\n**Step 2: Enable Response Node**\n\n- Azure subscription with Service Principal permissions\n- n8n 1.0+ (cloud or self-hosted)\n- OAuth2 credentials capability\nimport requests\nresponse = requests.get(\"https://your-n8n-instance.com/webhook/azure-cost-report\")\ndata = response.json()\nprint(f\"Total Cost: ${data['data']['totalCost']}\")\n```\n\n**Response Format:**\n\n```json\n{\n  \"status\": \"success\",\n  \"data\": {\n\n### Enable Output Options\n\nRight-click disabled nodes → Enable → Configure settings\n\n### Filter Resources\n\nModify query in \"Query Azure Resources\" node:\n\n```kusto\nResources\n| where resourceGroup contains 'production'\n| project name, type, location, resourceGroup, tags, id\n```\n\n### Change Time Range\n\nSet `timeRange` in \"Set Configuration\" node:\n\n```javascript\ntimeRange: \"last30Days\"     // Last 30 days\ntimeRange: \"last90Days\"     // Last quarter\ntimeRange: \"last6Months\"    // Last 6 months\ntimeRange: \"yearToDate\"     // YTD from Jan 1\ntimeRange: \"lastYear\"       // Previous 365 days\ntimeRange: \"custom\"         // Use custom dates\n```\n\nFor custom periods, set timeRange to \"custom\" and manually update:\n```javascript\nstartDate: \"2026-01-01\"\nendDate: \"2026-01-31\"\n```\n\n### Add Cost Alerts\n\n```javascript\n{{ parseFloat($json.summary.totalCost) &gt; 1000 }}\n```\n\n## Troubleshooting\n\n### Common Issues\n\n**\"Authentication failed\"**\n- Verify your Tenant ID is correct\n- Check that Client ID and Secret are valid\n- Ensure the Service Principal has the required roles\n\n**\"No resources returned\"**\n- Verify the Subscription ID is correct\n- Check that Service Principal has Reader role\n- Try running the query in Azure Resource Graph Explorer first\n\n**\"No cost data available\"**\n- Cost data may take 24-48 hours to appear\n- VeAdjust Cost Period\n\nIn \"Set Configuration\" node:\n\n```javascript\n// Last 7 days\nstartDate: {{ $now.minus({days: 7}).format('yyyy-MM-dd') }}\nendDate: {{ $now.format('yyyy-MM-dd') }}\n```\n\n### Add Cost Alerts\n\nAdd IF node after \"Format Report\":\n\n```javascript\n{{ parseFloat($json.summary.totalCost) &gt; 1000 }2. **Microsoft.Sql/servers/databases** - 3 resources - $345.67\n...\n\n---\n_Generated by n8n on 1/19/2026, 10:30:00 AM_\n```\n\n### HTML Report Format\n\nIncludes styled HTML with:\n- Professional color scheme (Azure blue #0078D4)\n- Responsive tables\n- Summary cards with highlighted metrics\n- Sortable columns\n- Even row highlighting for readability\n\n### Excel Export Columns\n\n| Column | Type | Description |\n|--------|------|-------------|\n| resourceName | String | Name of the Azure resource |\n| resourceType | String | Full resource type (e.g., Microsoft.Compute/virtualMachines) |\n| resourceGroup | String | Resource group name |\n| location | String | Azure region (e.g., eastus, westus2) |\n| sku | Object | SKU information (name, tier) |\n| tags | Object | All resource tags |\n| cost | Number | Total cost for the period |\n| costDetails | Array | Detailed daily cost breakdown |\n\n### Power BI Data Schema\n\nRecommended Power BI measures:\n\n```dax\nTotal Cost = SUM('CostData'[cost])\nAvg Cost Per Resource = DIVIDE([Total Cost], COUNT('CostData'[resourceName]))\nCost Variance = [Total Cost] - CALCULATE([Total Cost], DATEADD('CostData'[timestamp], -1, MONTH))\nTop 5 Expensive Resources = TOPN(5, 'CostData', 'CostData'[cost], DESC)\n```\n\n## Integration Examples\n\n### Python Integration\n\n```python\nimport requests\nimport pandas as pd\n\n# Call the n8n webhook\nurl = \"https://your-n8n-instance.com/webhook/azure-cost-report\"\nresponse = requests.get(url)\ndata = response.json()\n\n# Convert to DataFrame\nresources_df = pd.DataFrame(data['data']['summary']['allResources'])\n\n# Analyze costs\nprint(f\"Total Cost: ${data['data']['totalCost']}\")\nprint(f\"Most expensive resource: {resources_df.iloc[0]['resourceName']}\")\n\n# Export to local Excel\nresources_df.to_excel('azure_costs.xlsx', index=False)\n```\n\n### PowerShell Integration\n\n```powershell\n# Call the webhook\n$url = \"https://your-n8n-instance.com/webhook/azure-cost-report\"\n$response = Invoke-RestMethod -Uri $url -Method Get\n\n# Display summary\nWrite-Host \"Total Cost: $($response.data.totalCost)\" -ForegroundColor Green\nWrite-Host \"Resource Count: $($response.data.resourceCount)\"\n\n# Export to CSV\n$response.data.summary.allResources | \n    Export-Csv -Path \"azure-costs.csv\" -NoTypeInformation\n\n# Send alert if cost exceeds threshold\nif ([decimal]$response.data.totalCost -gt 1000) {\n    Send-MailMessage -To \"admin@company.com\" `\n        -Subject \"Azure Cost Alert\" `\n        -Body \"Current costs: $($response.data.totalCost)\" `\n        -SmtpServer \"smtp.company.com\"\n}\n```\n\n### JavaScript/Node.js Integration\n\n```javascript\nconst axios = require('axios');\n\n**\"Authentication failed\"**: Verify Tenant ID, Client ID, Secret, and Service Principal roles\n\n**\"No resources returned\"**: Check Subscription ID and Reader role assignment\n\n**\"No cost data\"**: Cost data takes 24-48 hours to appear. Verify Cost Management Reader role.\n\n**\"Rate limiting (429)\"**: Add Wait node between API calls or reduce query frequency\n\n## Resources\n\n- [Azure Resource Graph](https://learn.microsoft.com/azure/governance/resource-graph/)\n- [Cost Management API](https://learn.microsoft.com/rest/api/cost-management/)\n- [n8n Documentation](https://docs.n8n.io/---\n\n**Category**: Cloud Management, DevOps, FinOps  \n**Difficulty**: Intermediate  \n**Setup Time**: 10-15 minutes  \n**n8n Version**: 1.0+","workflow":{"name":"Monitor Azure subscription resources with cost and usage tracking","tags":[],"nodes":[{"id":"sticky-main-overview","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[240,240],"parameters":{"color":4,"width":480,"height":460,"content":"## How it works\n\nThis workflow connects to your Azure subscription via OAuth2 and queries two main APIs. It uses Azure Resource Graph to get all resources (VMs, databases, storage, etc.) and Cost Management API for spending data in your billing period.\n\nIt merges the data to find top-cost resources, calculates totals by type, and makes reports in text, HTML, and Excel with top 10 expensive items and breakdowns.\n\n## Setup steps\n\n1. **Create Service Principal**: In Azure AD, make an App Registration with 'Reader' and 'Cost Management Reader' roles. Note Client ID, Secret, Tenant ID.\n\n2. **Configure OAuth2 Credentials**: In n8n, set up OAuth2 with Client Credentials grant, URL 'https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token', scope 'https://management.azure.com/.default'.\n\n3. **Update Configuration**: In 'Set Configuration', put your subscription ID and tenant ID. Adjust dates as needed."},"typeVersion":1},{"id":"sticky-config","name":"Sticky Note - Config","type":"n8n-nodes-base.stickyNote","position":[800,240],"parameters":{"color":7,"width":340,"height":180,"content":"## Configuration\n\nSet your subscription ID, tenant ID, and billing period dates. The workflow defaults to the current month but can be customized for any date range."},"typeVersion":1},{"id":"sticky-data-collection","name":"Sticky Note - Data Collection","type":"n8n-nodes-base.stickyNote","position":[1240,240],"parameters":{"color":7,"width":340,"height":180,"content":"## Data Collection\n\nQueries Azure Resource Graph for all resources and Cost Management API for spending data. Both calls execute in parallel for faster results."},"typeVersion":1},{"id":"sticky-processing","name":"Sticky Note - Processing","type":"n8n-nodes-base.stickyNote","position":[1920,240],"parameters":{"color":7,"width":340,"height":180,"content":"## Processing & Reporting\n\nMerges resource data with cost information, calculates totals, identifies top expensive resources, and generates formatted text and HTML reports."},"typeVersion":1},{"id":"sticky-outputs","name":"Sticky Note - Outputs","type":"n8n-nodes-base.stickyNote","position":[2640,240],"parameters":{"color":7,"width":340,"height":180,"content":"## Output Options\n\nExport to Excel, send to Power BI dashboards, or return JSON via webhook. Enable the nodes you need (currently disabled)."},"typeVersion":1},{"id":"manual-trigger","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[820,680],"parameters":{},"typeVersion":1},{"id":"set-configuration","name":"Set Configuration","type":"n8n-nodes-base.set","position":[1040,680],"parameters":{"options":{},"assignments":{"assignments":[{"id":"subscription-id","name":"subscriptionId","type":"string","value":"=YOUR_SUBSCRIPTION_ID"},{"id":"tenant-id","name":"tenantId","type":"string","value":"=YOUR_TENANT_ID"},{"id":"billing-period","name":"billingPeriod","type":"string","value":"={{ $now.format('yyyyMM') }}"},{"id":"start-date","name":"startDate","type":"string","value":"={{ $now.startOf('month').format('yyyy-MM-dd') }}"},{"id":"end-date","name":"endDate","type":"string","value":"={{ $now.endOf('day').format('yyyy-MM-dd') }}"}]}},"typeVersion":3.3},{"id":"query-azure-resources","name":"Query Azure Resources","type":"n8n-nodes-base.httpRequest","position":[1480,680],"parameters":{"url":"=https://management.azure.com/subscriptions/{{ $json.subscriptionId }}/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01","options":{},"jsonBody":"={\n  \"query\": \"Resources | project name, type, location, resourceGroup, tags, sku, properties, id\",\n  \"subscriptions\": [\"{{ $json.subscriptionId }}\"]\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"oAuth2Api"},"credentials":{"oAuth2Api":{"id":"credential-id","name":"Azure OAuth2 API"}},"typeVersion":4.2},{"id":"get-cost-data","name":"Get Cost Data","type":"n8n-nodes-base.httpRequest","position":[1480,880],"parameters":{"url":"=https://management.azure.com/subscriptions/{{ $('Set Configuration').item.json.subscriptionId }}/providers/Microsoft.CostManagement/query?api-version=2023-11-01","options":{},"jsonBody":"={\n  \"type\": \"ActualCost\",\n  \"timeframe\": \"Custom\",\n  \"timePeriod\": {\n    \"from\": \"{{ $('Set Configuration').item.json.startDate }}\",\n    \"to\": \"{{ $('Set Configuration').item.json.endDate }}\"\n  },\n  \"dataset\": {\n    \"granularity\": \"Daily\",\n    \"aggregation\": {\n      \"totalCost\": {\n        \"name\": \"Cost\",\n        \"function\": \"Sum\"\n      },\n      \"totalCostUSD\": {\n        \"name\": \"CostUSD\",\n        \"function\": \"Sum\"\n      }\n    },\n    \"grouping\": [\n      {\n        \"type\": \"Dimension\",\n        \"name\": \"ResourceId\"\n      },\n      {\n        \"type\": \"Dimension\",\n        \"name\": \"ServiceName\"\n      },\n      {\n        \"type\": \"Dimension\",\n        \"name\": \"ResourceType\"\n      }\n    ]\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"oAuth2Api"},"credentials":{"oAuth2Api":{"id":"credential-id","name":"Azure OAuth2 API"}},"typeVersion":4.2},{"id":"merge-and-process-data","name":"Merge and Process Data","type":"n8n-nodes-base.code","position":[1920,780],"parameters":{"jsCode":"const resourcesData = $input.first().json.data;\nconst resources = resourcesData.rows.map(row => {\n  const columns = resourcesData.columns.map(col => col.name);\n  let resource = {};\n  columns.forEach((col, idx) => {\n    resource[col] = row[idx];\n  });\n  return resource;\n});\n\nconst costData = $input.last().json.properties;\nconst costs = costData.rows.map(row => {\n  const columns = costData.columns.map(col => col.name);\n  let cost = {};\n  columns.forEach((col, idx) => {\n    cost[col] = row[idx];\n  });\n  return cost;\n});\n\nconst merged = resources.map(resource => {\n  const resourceCosts = costs.filter(cost => \n    cost.ResourceId && cost.ResourceId.toLowerCase().includes(resource.name.toLowerCase())\n  );\n  \n  const totalCost = resourceCosts.reduce((sum, cost) => sum + (cost.Cost || 0), 0);\n  \n  return {\n    resourceName: resource.name,\n    resourceType: resource.type,\n    resourceGroup: resource.resourceGroup,\n    location: resource.location,\n    sku: resource.sku,\n    tags: resource.tags,\n    cost: totalCost.toFixed(2),\n    costDetails: resourceCosts\n  };\n});\n\nmerged.sort((a, b) => parseFloat(b.cost) - parseFloat(a.cost));\n\nconst totalCost = merged.reduce((sum, r) => sum + parseFloat(r.cost), 0);\nconst resourceCount = merged.length;\nconst topCostResources = merged.slice(0, 10);\n\nconst costByType = {};\nmerged.forEach(r => {\n  const type = r.resourceType;\n  if (!costByType[type]) {\n    costByType[type] = { count: 0, cost: 0 };\n  }\n  costByType[type].count++;\n  costByType[type].cost += parseFloat(r.cost);\n});\n\nconst summary = {\n  totalCost: totalCost.toFixed(2),\n  resourceCount: resourceCount,\n  period: `${$('Set Configuration').item.json.startDate} to ${$('Set Configuration').item.json.endDate}`,\n  topCostResources: topCostResources.map(r => ({\n    name: r.resourceName,\n    type: r.resourceType,\n    cost: r.cost\n  })),\n  costByType: Object.entries(costByType)\n    .map(([type, data]) => ({\n      type,\n      count: data.count,\n      cost: data.cost.toFixed(2)\n    }))\n    .sort((a, b) => parseFloat(b.cost) - parseFloat(a.cost))\n};\n\nreturn [{\n  json: {\n    summary,\n    allResources: merged\n  }\n}];"},"typeVersion":2},{"id":"format-report","name":"Format Report","type":"n8n-nodes-base.code","position":[2160,780],"parameters":{"jsCode":"const data = $input.first().json;\nconst summary = data.summary;\n\nlet report = `# Azure Resource & Cost Report\\n\\n`;\nreport += `**Period:** ${summary.period}\\n`;\nreport += `**Total Cost:** $${summary.totalCost}\\n`;\nreport += `**Total Resources:** ${summary.resourceCount}\\n\\n`;\nreport += `## Top 10 Most Expensive Resources\\n\\n`;\nsummary.topCostResources.forEach((r, idx) => {\n  report += `${idx + 1}. **${r.name}** (${r.type}) - $${r.cost}\\n`;\n});\nreport += `\\n## Cost by Resource Type\\n\\n`;\nsummary.costByType.slice(0, 10).forEach((t, idx) => {\n  report += `${idx + 1}. **${t.type}** - ${t.count} resources - $${t.cost}\\n`;\n});\nreport += `\\n---\\n_Generated by n8n on ${new Date().toLocaleString()}_`;\n\nlet htmlReport = `\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 20px; }\n    h1 { color: #0078D4; }\n    h2 { color: #333; margin-top: 30px; }\n    table { border-collapse: collapse; width: 100%; margin-top: 10px; }\n    th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n    th { background-color: #0078D4; color: white; }\n    tr:nth-child(even) { background-color: #f2f2f2; }\n    .summary { background-color: #e7f3ff; padding: 15px; border-radius: 5px; margin: 20px 0; }\n  </style>\n</head>\n<body>\n  <h1>Azure Resource & Cost Report</h1>\n  <div class=\"summary\">\n    <p><strong>Period:</strong> ${summary.period}</p>\n    <p><strong>Total Cost:</strong> $${summary.totalCost}</p>\n    <p><strong>Total Resources:</strong> ${summary.resourceCount}</p>\n  </div>\n  <h2>Top 10 Most Expensive Resources</h2>\n  <table>\n    <tr><th>#</th><th>Resource Name</th><th>Type</th><th>Cost</th></tr>\n`;\nsummary.topCostResources.forEach((r, idx) => {\n  htmlReport += `    <tr><td>${idx + 1}</td><td>${r.name}</td><td>${r.type}</td><td>$${r.cost}</td></tr>\\n`;\n});\nhtmlReport += `\n  </table>\n  <h2>Cost by Resource Type</h2>\n  <table>\n    <tr><th>#</th><th>Resource Type</th><th>Count</th><th>Total Cost</th></tr>\n`;\nsummary.costByType.slice(0, 10).forEach((t, idx) => {\n  htmlReport += `    <tr><td>${idx + 1}</td><td>${t.type}</td><td>${t.count}</td><td>$${t.cost}</td></tr>\\n`;\n});\nhtmlReport += `\n  </table>\n  <p style=\"margin-top: 30px; color: #666; font-size: 12px;\">Generated by n8n on ${new Date().toLocaleString()}</p>\n</body>\n</html>\n`;\n\nreturn [{\n  json: {\n    textReport: report,\n    htmlReport: htmlReport,\n    summary: summary,\n    allData: data\n  }\n}];"},"typeVersion":2},{"id":"check-if-data-exists","name":"Check If Data Exists","type":"n8n-nodes-base.if","position":[2400,780],"parameters":{"conditions":{"string":[{"value1":"={{ $json.summary.totalCost }}","operation":"isNotEmpty"}]}},"typeVersion":1},{"id":"output-report","name":"Output Report","type":"n8n-nodes-base.set","position":[2640,680],"parameters":{"options":{},"assignments":{"assignments":[{"id":"output","name":"report","type":"string","value":"={{ $json.textReport }}"},{"id":"html","name":"htmlReport","type":"string","value":"={{ $json.htmlReport }}"},{"id":"total-cost","name":"totalCost","type":"string","value":"={{ $json.summary.totalCost }}"},{"id":"resource-count","name":"resourceCount","type":"number","value":"={{ $json.summary.resourceCount }}"}]}},"typeVersion":3.3},{"id":"export-to-excel","name":"Export to Excel","type":"n8n-nodes-base.spreadsheetFile","disabled":true,"position":[2880,580],"parameters":{"json":"={{ $json.allData.allResources }}","mode":"jsonToSpreadsheet","options":{"fileName":"azure-cost-report-{{ $now.format('yyyy-MM-dd') }}.xlsx","headerRow":true},"operation":"toJson"},"typeVersion":1},{"id":"prepare-powerbi-data","name":"Prepare Power BI Data","type":"n8n-nodes-base.set","disabled":true,"position":[2880,720],"parameters":{"options":{},"assignments":{"assignments":[{"id":"summary","name":"summary","type":"object","value":"={{ $json.allData.summary }}"},{"id":"resources","name":"resources","type":"array","value":"={{ $json.allData.allResources }}"},{"id":"timestamp","name":"timestamp","type":"string","value":"={{ $now.toISO() }}"},{"id":"reportType","name":"reportType","type":"string","value":"azure-cost-analysis"}]}},"typeVersion":3.3},{"id":"send-to-powerbi","name":"Send to Power BI","type":"n8n-nodes-base.httpRequest","disabled":true,"position":[3120,720],"parameters":{"url":"https://api.powerbi.com/beta/YOUR_WORKSPACE/datasets/YOUR_DATASET/rows?key=YOUR_TOKEN_HERE","method":"POST","options":{},"jsonBody":"={{ $json }}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"respond-to-webhook","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","disabled":true,"position":[2880,860],"parameters":{"options":{"responseCode":200,"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"},{"name":"Access-Control-Allow-Origin","value":"*"}]}},"respondWith":"json","responseBody":"={{ { \"status\": \"success\", \"data\": { \"summary\": $json.summary, \"totalCost\": $json.totalCost, \"resourceCount\": $json.resourceCount, \"report\": $json.report }, \"timestamp\": $now.toISO() } }}"},"typeVersion":1},{"id":"no-data-found","name":"No Data Found","type":"n8n-nodes-base.set","position":[2640,880],"parameters":{"options":{},"assignments":{"assignments":[{"id":"error","name":"error","type":"string","value":"No cost data found for the specified period"}]}},"typeVersion":3.3}],"pinData":{},"settings":{"executionOrder":"v1"},"updatedAt":"2026-01-19T00:00:00.000Z","versionId":"3","staticData":null,"connections":{"Format Report":{"main":[[{"node":"Check If Data Exists","type":"main","index":0}]]},"Get Cost Data":{"main":[[{"node":"Merge and Process Data","type":"main","index":0}]]},"Output Report":{"main":[[{"node":"Export to Excel","type":"main","index":0},{"node":"Prepare Power BI Data","type":"main","index":0},{"node":"Respond to Webhook","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Set Configuration","type":"main","index":0}]]},"Set Configuration":{"main":[[{"node":"Query Azure Resources","type":"main","index":0},{"node":"Get Cost Data","type":"main","index":0}]]},"Check If Data Exists":{"main":[[{"node":"Output Report","type":"main","index":0}],[{"node":"No Data Found","type":"main","index":0}]]},"Prepare Power BI Data":{"main":[[{"node":"Send to Power BI","type":"main","index":0}]]},"Query Azure Resources":{"main":[[{"node":"Merge and Process Data","type":"main","index":0}]]},"Merge and Process Data":{"main":[[{"node":"Format Report","type":"main","index":0}]]}},"triggerCount":0},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":18,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.set":{"count":4},"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":3},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.spreadsheetFile":{"count":1},"n8n-nodes-base.respondToWebhook":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"kartik ramachandran","username":"kramatic85","bio":"Solution architect with 20 yrs of SDLC experience ","verified":false,"links":[""],"avatar":"https://gravatar.com/avatar/b0b70727b44047f91f87a86b89ae73f15de67179065cc18d9c7fe809a843f3b2?r=pg&d=retro&size=200"},"nodes":[{"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":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":41,"icon":"fa:table","name":"n8n-nodes-base.spreadsheetFile","codex":{"data":{"alias":["_Excel","Excel","CSV","Sheet","Spreadsheet","xls","xlsx","ods"],"resources":{"generic":[{"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"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.converttofile/"}]},"categories":["Data & Storage","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files"]}}},"group":"[\"transform\"]","defaults":{"name":"Spreadsheet File","color":"#2244FF"},"iconData":{"icon":"table","type":"icon"},"displayName":"Spreadsheet File","typeVersion":2,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":9,"name":"Core Nodes"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"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"}]},{"id":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":16,"name":"DevOps"}],"image":[]}}