{"workflow":{"id":13368,"name":"Monitor agency profitability with Facebook Ads, Shopify, Stripe, Clockify, Google Sheets, Slack and Gemini","views":325,"recentViews":1,"totalViews":325,"createdAt":"2026-02-13T11:53:54.014Z","description":"## Overview\nStop guessing your agency's actual margins. This workflow acts as a centralized financial brain for digital marketing agencies. It aggregates real-time data from your time-tracking, ad platforms, and payment processors to calculate precise profitability metrics (Gross Profit, Net Margin, ROAS, and Efficiency).\n\nIt doesn't just crunch numbers; it uses Google Gemini to act as a virtual CFO, analyzing the data and sending an executive summary to Slack with actionable insights, while simultaneously archiving the data to Google Sheets for historical trending.\n\n## Key Features\nMulti-Source Aggregation: Pulls data from Facebook Ads, Google Ads, Shopify, Stripe, and Clockify.\n\nSmart Cost Allocation: Automatically calculates overhead (default 30%) and software costs against your gross revenue.\n\nAI Analysis: Uses Google Gemini to review the calculated metrics and draft a \"Human-readable\" executive summary for Slack.\n\nDual Output: Sends instant alerts to Slack and logs granular data to Google Sheets.\n\n## How to Setup\n### 1. Configure Credentials\nEnsure you have authenticated credentials for:\n\nClockify\n\nStripe & Shopify\n\nFacebook Marketing API & Google Ads\n\nGoogle Sheets & Google Gemini (PaLM)\n\nSlack\n\n### 2. Prepare Google Sheet\nCreate a new Google Sheet with the following headers in Row 1:\ntimestamp, date, totalRevenue, totalAdSpend, facebookAdSpend, googleAdSpend, totalTimeCost, grossProfit, profitMargin, roas.\n\n### 3. Adjust Logic Configuration\nOpen the \"Code in JavaScript\" node. At the very top, you will see a CONFIG object. Edit these values to match your agency's model:\n\n\n```\nconst CONFIG = {\n  platformFeeRate: 0.029,      // Stripe/Shopify fees\n  monthlySoftwareCosts: 500,   // Fixed monthly SaaS costs\n  overheadRate: 0.30,          // Overhead % (rent, admin, etc)\n  minProfitMargin: 20          // Target margin %\n};\n```\n\n### 4. Remove Mock Data\nThe template includes \"Set\" nodes with mock data for testing purposes. Simply bypass these nodes and connect the API nodes directly to the \"Merge\" node when you are ready to go live.","workflow":{"meta":{"instanceId":"fe849132d8c0d46a6070ebd60698d892cd65ebc032ada4e7af186e0f756c61a0","templateCredsSetupCompleted":true},"nodes":[{"id":"5d1c5562-7ac5-4fbe-9a66-992a3d5dd9ff","name":"Get a time entry","type":"n8n-nodes-base.clockify","onError":"continueRegularOutput","position":[-1696,352],"parameters":{"resource":"timeEntry","operation":"get","additionalFields":{}},"credentials":{"clockifyApi":{"id":"credential-id","name":"Clockify account"}},"typeVersion":1},{"id":"a5bce0db-f455-44fd-a62e-2a15707434ba","name":"Get a balance","type":"n8n-nodes-base.stripe","onError":"continueRegularOutput","position":[-1696,544],"parameters":{},"retryOnFail":false,"typeVersion":1},{"id":"f94b67f4-0cd3-4e8f-93e2-b26b4634101a","name":"Get many orders","type":"n8n-nodes-base.shopify","onError":"continueRegularOutput","position":[-1696,160],"parameters":{"options":{},"operation":"getAll"},"typeVersion":1},{"id":"a0ec860f-29b9-49ab-8539-c1c0dc114aeb","name":"Facebook Graph API","type":"n8n-nodes-base.facebookGraphApi","position":[-1696,-224],"parameters":{"edge":"insights","node":"={{$json.account_id}}","options":{"queryParameters":{"parameter":[{"name":"fields","value":"spend"},{"name":"time_range","value":"{\"since\":\"2025-02-01\",\"until\":\"2025-02-10\"}"},{"name":"level","value":"account"}]}},"graphApiVersion":"v23.0"},"credentials":{"facebookGraphApi":{"id":"credential-id","name":"Facebook Graph account Sandbox"}},"typeVersion":1},{"id":"7e63e486-99fd-4e4b-a146-f5e2e5014c40","name":"Get a campaign","type":"n8n-nodes-base.googleAds","onError":"continueRegularOutput","position":[-1696,-32],"parameters":{"operation":"get","campaignId":"12345678","requestOptions":{},"clientCustomerId":"3650538801","managerCustomerId":"12345678"},"credentials":{"googleAdsOAuth2Api":{"id":"credential-id","name":"Google Ads account"}},"typeVersion":1},{"id":"7598c5dc-a583-421a-9b41-7f7e5914f90a","name":"Append row in sheet1","type":"n8n-nodes-base.googleSheets","position":[-800,160],"parameters":{"columns":{"value":{},"schema":[{"id":"timestamp","type":"string","display":true,"removed":false,"required":false,"displayName":"timestamp","defaultMatch":false,"canBeUsedToMatch":true},{"id":"date","type":"string","display":true,"removed":false,"required":false,"displayName":"date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"totalRevenue","type":"string","display":true,"removed":false,"required":false,"displayName":"totalRevenue","defaultMatch":false,"canBeUsedToMatch":true},{"id":"totalAdSpend","type":"string","display":true,"removed":false,"required":false,"displayName":"totalAdSpend","defaultMatch":false,"canBeUsedToMatch":true},{"id":"facebookAdSpend","type":"string","display":true,"removed":false,"required":false,"displayName":"facebookAdSpend","defaultMatch":false,"canBeUsedToMatch":true},{"id":"googleAdSpend","type":"string","display":true,"removed":false,"required":false,"displayName":"googleAdSpend","defaultMatch":false,"canBeUsedToMatch":true},{"id":"totalTimeCost","type":"string","display":true,"removed":false,"required":false,"displayName":"totalTimeCost","defaultMatch":false,"canBeUsedToMatch":true},{"id":"platformFees","type":"string","display":true,"removed":false,"required":false,"displayName":"platformFees","defaultMatch":false,"canBeUsedToMatch":true},{"id":"softwareCosts","type":"string","display":true,"removed":false,"required":false,"displayName":"softwareCosts","defaultMatch":false,"canBeUsedToMatch":true},{"id":"overheadAllocation","type":"string","display":true,"removed":false,"required":false,"displayName":"overheadAllocation","defaultMatch":false,"canBeUsedToMatch":true},{"id":"totalCosts","type":"string","display":true,"removed":false,"required":false,"displayName":"totalCosts","defaultMatch":false,"canBeUsedToMatch":true},{"id":"grossProfit","type":"string","display":true,"removed":false,"required":false,"displayName":"grossProfit","defaultMatch":false,"canBeUsedToMatch":true},{"id":"profitMargin","type":"string","display":true,"removed":false,"required":false,"displayName":"profitMargin","defaultMatch":false,"canBeUsedToMatch":true},{"id":"cac","type":"string","display":true,"removed":false,"required":false,"displayName":"cac","defaultMatch":false,"canBeUsedToMatch":true},{"id":"roas","type":"string","display":true,"removed":false,"required":false,"displayName":"roas","defaultMatch":false,"canBeUsedToMatch":true},{"id":"conversions","type":"string","display":true,"removed":false,"required":false,"displayName":"conversions","defaultMatch":false,"canBeUsedToMatch":true},{"id":"billableHours","type":"string","display":true,"removed":false,"required":false,"displayName":"billableHours","defaultMatch":false,"canBeUsedToMatch":true},{"id":"isProfitable","type":"string","display":true,"removed":false,"required":false,"displayName":"isProfitable","defaultMatch":false,"canBeUsedToMatch":true},{"id":"meetsMinROAS","type":"string","display":true,"removed":false,"required":false,"displayName":"meetsMinROAS","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"autoMapInputData","matchingColumns":["id"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1E5YoG_4GvHIF03UWpT6aO9dkVipikAjRx153Q66SKVk/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1E5YoG_4GvHIF03UWpT6aO9dkVipikAjRx153Q66SKVk","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1E5YoG_4GvHIF03UWpT6aO9dkVipikAjRx153Q66SKVk/edit?usp=drivesdk","cachedResultName":"Autonomous Client Profit Guardian"}},"credentials":{"googleSheetsOAuth2Api":{"id":"credential-id","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"8cf5f9e5-0eb9-4b88-8b77-8d8521f71e88","name":"Schedule Trigger1","type":"n8n-nodes-base.scheduleTrigger","position":[-1920,160],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 8 * * 1"}]}},"typeVersion":1.3},{"id":"1d4dec25-431c-4aa0-b47d-dffbf7222cc0","name":"Merge1","type":"n8n-nodes-base.merge","position":[-1248,112],"parameters":{"numberInputs":5},"typeVersion":3.2},{"id":"180d1013-e364-4fd9-92a6-d384d3522d6b","name":"Facebook ads1","type":"n8n-nodes-base.set","position":[-1472,-224],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"data\": [\n    {\n      \"account_id\": \"887041830908202\",\n      \"account_name\": \"Test Ad Account\",\n\n      \"campaign_id\": \"120210000001\",\n      \"campaign_name\": \"Lead Gen Campaign\",\n\n      \"adset_id\": \"120210000002\",\n      \"adset_name\": \"Broad Targeting\",\n\n      \"ad_id\": \"120210000003\",\n      \"ad_name\": \"Creative A\",\n\n      \"date_start\": \"2025-02-01\",\n      \"date_stop\": \"2025-02-01\",\n\n      \"impressions\": \"12543\",\n      \"reach\": \"10321\",\n      \"frequency\": \"1.21\",\n\n      \"clicks\": \"312\",\n      \"unique_clicks\": \"280\",\n      \"ctr\": \"2.49\",\n      \"unique_ctr\": \"2.71\",\n\n      \"cpc\": \"0.38\",\n      \"cpm\": \"9.52\",\n\n      \"spend\": \"118.72\",\n\n      \"actions\": [\n        { \"action_type\": \"link_click\", \"value\": \"312\" },\n        { \"action_type\": \"lead\", \"value\": \"42\" },\n        { \"action_type\": \"purchase\", \"value\": \"9\" }\n      ],\n\n      \"cost_per_action_type\": [\n        { \"action_type\": \"lead\", \"value\": \"2.83\" },\n        { \"action_type\": \"purchase\", \"value\": \"13.19\" }\n      ],\n\n      \"conversions\": [\n        { \"action_type\": \"purchase\", \"value\": \"9\" }\n      ],\n\n      \"purchase_roas\": [\n        { \"action_type\": \"purchase\", \"value\": \"3.75\" }\n      ],\n\n      \"video_play_actions\": [\n        { \"action_type\": \"video_view\", \"value\": \"4210\" }\n      ]\n    },\n\n    {\n      \"account_id\": \"887041830908202\",\n      \"account_name\": \"Test Ad Account\",\n\n      \"campaign_id\": \"120210000001\",\n      \"campaign_name\": \"Lead Gen Campaign\",\n\n      \"adset_id\": \"120210000002\",\n      \"adset_name\": \"Broad Targeting\",\n\n      \"ad_id\": \"120210000004\",\n      \"ad_name\": \"Creative B\",\n\n      \"date_start\": \"2025-02-01\",\n      \"date_stop\": \"2025-02-01\",\n\n      \"impressions\": \"8421\",\n      \"reach\": \"7004\",\n      \"frequency\": \"1.20\",\n\n      \"clicks\": \"181\",\n      \"ctr\": \"2.14\",\n\n      \"cpc\": \"0.42\",\n      \"cpm\": \"8.98\",\n\n      \"spend\": \"76.22\",\n\n      \"actions\": [\n        { \"action_type\": \"link_click\", \"value\": \"181\" },\n        { \"action_type\": \"lead\", \"value\": \"21\" }\n      ],\n\n      \"cost_per_action_type\": [\n        { \"action_type\": \"lead\", \"value\": \"3.62\" }\n      ]\n    }\n  ],\n\n  \"paging\": {\n    \"cursors\": {\n      \"before\": \"QVFIUl9abc123\",\n      \"after\": \"QVFIUl9xyz789\"\n    },\n    \"next\": \"https://graph.facebook.com/v24.0/act_887041830908202/insights?after=QVFIUl9xyz789\"\n  }\n}\n"},"typeVersion":3.4},{"id":"3e1e5a60-9438-49b6-a126-932ff3929ff6","name":"Google ads1","type":"n8n-nodes-base.set","position":[-1472,-32],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n    \"results\": [\n      {\n        \"customer\": { \"id\": \"1234567890\" },\n        \"campaign\": { \"id\": \"111\", \"name\": \"Search Brand Campaign\" },\n        \"metrics\": {\n          \"costMicros\": 24500000,\n          \"clicks\": 320,\n          \"impressions\": 15400\n        },\n        \"segments\": { \"date\": \"2026-02-09\" }\n      },\n      {\n        \"customer\": { \"id\": \"1234567890\" },\n        \"campaign\": { \"id\": \"222\", \"name\": \"PMax Campaign\" },\n        \"metrics\": {\n          \"costMicros\": 78600000,\n          \"clicks\": 910,\n          \"impressions\": 45200\n        },\n        \"segments\": { \"date\": \"2026-02-09\" }\n      }\n    ]\n  }"},"typeVersion":3.4},{"id":"dd114afb-6f16-4829-a54e-5ded05a7717c","name":"Shopify1","type":"n8n-nodes-base.set","position":[-1472,160],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"orders\": [\n    {\n      \"id\": 1001,\n      \"order_number\": 501,\n      \"created_at\": \"2026-02-10T10:20:30Z\",\n      \"currency\": \"USD\",\n      \"financial_status\": \"paid\",\n      \"subtotal_price\": \"200.00\",\n      \"total_tax\": \"20.00\",\n      \"total_discounts\": \"10.00\",\n      \"total_price\": \"210.00\",\n      \"total_refunds\": \"0.00\",\n      \"customer\": {\n        \"id\": 9001,\n        \"email\": \"user@example.com\"\n      }\n    },\n    {\n      \"id\": 1002,\n      \"order_number\": 502,\n      \"created_at\": \"2026-02-10T11:05:00Z\",\n      \"currency\": \"USD\",\n      \"financial_status\": \"paid\",\n      \"subtotal_price\": \"350.00\",\n      \"total_tax\": \"35.00\",\n      \"total_discounts\": \"25.00\",\n      \"total_price\": \"360.00\",\n      \"total_refunds\": \"20.00\",\n      \"customer\": {\n        \"id\": 9002,\n        \"email\": \"user@example.com\"\n      }\n    },\n    {\n      \"id\": 1003,\n      \"order_number\": 503,\n      \"created_at\": \"2026-02-10T12:40:12Z\",\n      \"currency\": \"USD\",\n      \"financial_status\": \"paid\",\n      \"subtotal_price\": \"150.00\",\n      \"total_tax\": \"15.00\",\n      \"total_discounts\": \"0.00\",\n      \"total_price\": \"165.00\",\n      \"total_refunds\": \"0.00\",\n      \"customer\": {\n        \"id\": 9003,\n        \"email\": \"user@example.com\"\n      }\n    }\n  ]\n}\n"},"typeVersion":3.4},{"id":"b550b321-f37a-4b2e-8cfc-e3d0d5428cde","name":"Stripe1","type":"n8n-nodes-base.set","position":[-1472,352],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"object\": \"revenue_recognition_transaction\",\n  \"id\": \"revt_123456789\",\n  \"amount\": 10000,\n  \"currency\": \"usd\",\n  \"created\": 1609459200,\n  \"performance_obligations\": [\n    {\n      \"id\": \"po_123456\",\n      \"period\": {\n        \"start\": 1609459200,\n        \"end\": 1612137600\n      },\n      \"amount\": 10000,\n      \"recognized_amount\": 3226,\n      \"deferred_amount\": 6774\n    }\n  ],\n  \"source\": {\n    \"object\": \"invoice\",\n    \"id\": \"in_123456789\"\n  },\n  \"revenue_schedule\": [\n    {\n      \"period\": \"2021-01\",\n      \"amount\": 3226\n    },\n    {\n      \"period\": \"2021-02\",\n      \"amount\": 6774\n    }\n  ],\n  \"metadata\": {\n    \"product_name\": \"Premium Subscription\"\n  }\n}"},"typeVersion":3.4},{"id":"ae4c8ef4-c72a-4dc1-a558-6d6d7658451b","name":"Clockify1","type":"n8n-nodes-base.set","position":[-1472,544],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"json\": [\n  {\n    \"id\": \"te_1001\",\n    \"description\": \"Meta Ads optimization\",\n    \"projectId\": \"proj_client_001\",\n    \"projectName\": \"Client A - Ads\",\n    \"clientId\": \"client_001\",\n    \"clientName\": \"Client A\",\n    \"userId\": \"user_01\",\n    \"userName\": \"Media Buyer\",\n    \"billable\": true,\n    \"timeInterval\": {\n      \"start\": \"2026-02-01T09:00:00Z\",\n      \"end\": \"2026-02-01T11:30:00Z\",\n      \"duration\": \"PT2H30M\"\n    },\n    \"hours\": 2.5,\n    \"hourlyRate\": 35,\n    \"costAmount\": 87.5,\n    \"revenueAttributed\": 900\n  },\n  {\n    \"id\": \"te_1002\",\n    \"description\": \"Landing page edits\",\n    \"projectId\": \"proj_client_001\",\n    \"projectName\": \"Client A - Ads\",\n    \"clientId\": \"client_001\",\n    \"clientName\": \"Client A\",\n    \"userId\": \"user_02\",\n    \"userName\": \"Designer\",\n    \"billable\": true,\n    \"timeInterval\": {\n      \"start\": \"2026-02-01T12:00:00Z\",\n      \"end\": \"2026-02-01T14:00:00Z\",\n      \"duration\": \"PT2H\"\n    },\n    \"hours\": 2,\n    \"hourlyRate\": 25,\n    \"costAmount\": 50,\n    \"revenueAttributed\": 0\n  },\n  {\n    \"id\": \"te_1003\",\n    \"description\": \"Google Ads setup\",\n    \"projectId\": \"proj_client_002\",\n    \"projectName\": \"Client B - Search\",\n    \"clientId\": \"client_002\",\n    \"clientName\": \"Client B\",\n    \"userId\": \"user_01\",\n    \"userName\": \"Media Buyer\",\n    \"billable\": true,\n    \"timeInterval\": {\n      \"start\": \"2026-02-02T08:00:00Z\",\n      \"end\": \"2026-02-02T11:00:00Z\",\n      \"duration\": \"PT3H\"\n    },\n    \"hours\": 3,\n    \"hourlyRate\": 35,\n    \"costAmount\": 105,\n    \"revenueAttributed\": 1500\n  },\n  {\n    \"id\": \"te_1004\",\n    \"description\": \"Reporting and calls\",\n    \"projectId\": \"proj_client_002\",\n    \"projectName\": \"Client B - Search\",\n    \"clientId\": \"client_002\",\n    \"clientName\": \"Client B\",\n    \"userId\": \"user_03\",\n    \"userName\": \"Account Manager\",\n    \"billable\": false,\n    \"timeInterval\": {\n      \"start\": \"2026-02-02T12:00:00Z\",\n      \"end\": \"2026-02-02T13:30:00Z\",\n      \"duration\": \"PT1H30M\"\n    },\n    \"hours\": 1.5,\n    \"hourlyRate\": 30,\n    \"costAmount\": 45,\n    \"revenueAttributed\": 0\n  }\n]\n\n \n}\n"},"typeVersion":3.4},{"id":"0526e83e-25e6-4ab3-9b10-880ce38103f2","name":"Send a message","type":"n8n-nodes-base.slack","position":[-224,160],"webhookId":"520dea32-fe01-4c1a-8082-6cbafb798028","parameters":{"text":"=:bar_chart: *Client Profitability Report* | {{ new Date().toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) }}\n\n{{ $('Code in JavaScript').item.json.summary_text }}\n\n---\n\n{{ $('AI Profit Analyzer1').item.json.output }}","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C0ABU5WAKLH","cachedResultName":"estateline-ai"},"otherOptions":{"includeLinkToWorkflow":false}},"credentials":{"slackApi":{"id":"credential-id","name":"Slack account"}},"typeVersion":2.4},{"id":"15161336-b9b9-4391-a454-a6cb0bc64f4e","name":"AI Profit Analyzer1","type":"@n8n/n8n-nodes-langchain.agent","position":[-576,160],"parameters":{"text":"=Analyze this agency profitability data and provide actionable insights:\n\n**CLIENT BREAKDOWN:**\n{{ JSON.stringify($('Code in JavaScript').item.json.clientDetails, null, 2) }}\n\n{{ $json.breakdown }}\n\n**AGENCY METRICS:**\n{{ JSON.stringify($('Code in JavaScript').item.json.summary, null, 2) }}\n{{ JSON.stringify($('Code in JavaScript').item.json.breakdown, null, 2) }}\n\n**DATA QUALITY:**\n{{ JSON.stringify($('Code in JavaScript').item.json.dataValidation, null, 2) }}\n\nProvide your analysis in this EXACT format for Slack readability:\n\n*📊 EXECUTIVE SUMMARY*\n[2-3 sentences on overall financial health and key findings]\n\n*🚨 CRITICAL ACTIONS*\n• [Action item with specific numbers and client names]\n• [Action item with specific numbers and client names]\n\n*⚠️ WARNINGS*\n• [Warning with specific details]\n• [Warning with specific details]\n\n*✅ HEALTHY CLIENTS*\n• [Client name]: [Brief status with margin %]\n• [Client name]: [Brief status with margin %]\n\n*🔍 DATA ISSUES*\n• [Specific data quality concern]\n• [Specific data quality concern]\n\nIMPORTANT:\n- Use bullet points (•) not dashes or numbers\n- Include specific percentages and dollar amounts\n- Keep each bullet to one line when possible\n- Flag clients by name with their risk emoji (🔴/⚠️/🟢)\n- Be direct and actionable","options":{"systemMessage":"You are a financial analyst AI for a digital marketing agency. Analyze client profitability data and provide clear, actionable insights formatted for Slack.\n\nKEY RULES:\n1. Use the pre-calculated riskLevel (🔴 CRITICAL, ⚠️ WARNING, 🟢 HEALTHY) from the data\n2. Focus on profitMargin and timeRatio as primary health indicators\n3. Call out specific clients by name with their numbers\n4. Format for Slack: use bullet points (•), bold headers (*text*), and emojis\n5. Be concise - executives need quick insights\n6. Always include dollar amounts and percentages\n7. Explain WHY a client is flagged, not just that they are\n8. Data validation issues should be clearly separated\n\nYour output will be posted directly to Slack, so formatting matters."},"promptType":"define"},"typeVersion":3.1},{"id":"df0f315f-73ea-4627-9110-dc5bc93da6ab","name":"Code in JavaScript","type":"n8n-nodes-base.code","position":[-1024,160],"parameters":{"jsCode":"// ====================================================================\n// AGENCY PROFITABILITY CALCULATOR\n// Analyzes client profitability with proper cost allocation\n// ====================================================================\n\n// Configuration\nconst CONFIG = {\n  platformFeeRate: 0.029,      // 2.9% payment processor fee\n  monthlySoftwareCosts: 500,   // Monthly SaaS costs\n  overheadRate: 0.30,          // 30% overhead on time costs\n  minProfitMargin: 20,         // Minimum acceptable profit margin %\n  maxTimeRatio: 40             // Maximum acceptable time/revenue ratio %\n};\n\nconst allInputs = $input.all();\n\n// Initialize metrics\nconst metrics = {\n  totalAdSpend: 0,\n  facebookAdSpend: 0,\n  googleAdSpend: 0,\n  totalRevenue: 0,\n  totalConversions: 0,\n  facebookConversions: 0,\n  totalTimeCost: 0,\n  totalBillableHours: 0\n};\n\n// Track data sources for validation\nconst dataSources = {\n  facebook: false,\n  google: false,\n  shopify: false,\n  timeTracking: false\n};\n\n// Client-level tracking\nconst clients = {};\n\nconst errors = [];\nconst warnings = [];\n\n// Process each input\nfor (const item of allInputs) {\n  const json = item.json;\n  \n  // Facebook Ads\n  if (json.data && Array.isArray(json.data)) {\n    dataSources.facebook = true;\n    json.data.forEach(ad => {\n      const spend = parseFloat(ad.spend) || 0;\n      const accountName = ad.account_name || 'Unknown Client';\n      \n      // Initialize client if needed\n      if (!clients[accountName]) {\n        clients[accountName] = {\n          name: accountName,\n          adSpend: 0,\n          revenue: 0,\n          timeCost: 0,\n          billableHours: 0,\n          conversions: 0,\n          platforms: { facebook: 0, google: 0 }\n        };\n      }\n      \n      clients[accountName].adSpend += spend;\n      clients[accountName].platforms.facebook += spend;\n      metrics.totalAdSpend += spend;\n      metrics.facebookAdSpend += spend;\n      \n      // Count conversions\n      if (ad.conversions) {\n        ad.conversions.forEach(conv => {\n          if (conv.action_type === 'purchase') {\n            const convValue = parseFloat(conv.value) || 0;\n            metrics.totalConversions += convValue;\n            metrics.facebookConversions += convValue;\n            clients[accountName].conversions += convValue;\n          }\n        });\n      }\n      \n      // Calculate revenue from ROAS\n      if (ad.purchase_roas) {\n        ad.purchase_roas.forEach(roas => {\n          if (roas.action_type === 'purchase') {\n            const revenue = spend * (parseFloat(roas.value) || 0);\n            metrics.totalRevenue += revenue;\n            clients[accountName].revenue += revenue;\n          }\n        });\n      }\n    });\n  }\n  \n  // Google Ads\n  if (json.results && Array.isArray(json.results)) {\n    dataSources.google = true;\n    json.results.forEach(campaign => {\n      if (campaign.metrics) {\n        const spend = (campaign.metrics.costMicros || 0) / 1000000;\n        const campaignName = campaign.campaign?.name || 'Unknown Campaign';\n        \n        // Try to map to client (simplified - you may need better mapping logic)\n        const clientName = 'Google Ads Client';\n        \n        if (!clients[clientName]) {\n          clients[clientName] = {\n            name: clientName,\n            adSpend: 0,\n            revenue: 0,\n            timeCost: 0,\n            billableHours: 0,\n            conversions: 0,\n            platforms: { facebook: 0, google: 0 }\n          };\n        }\n        \n        clients[clientName].adSpend += spend;\n        clients[clientName].platforms.google += spend;\n        metrics.totalAdSpend += spend;\n        metrics.googleAdSpend += spend;\n        \n        if (campaign.metrics.conversions) {\n          const convValue = parseFloat(campaign.metrics.conversions) || 0;\n          metrics.totalConversions += convValue;\n          clients[clientName].conversions += convValue;\n        }\n        \n        if (campaign.metrics.conversionValue) {\n          const revenue = (campaign.metrics.conversionValue || 0) / 1000000;\n          metrics.totalRevenue += revenue;\n          clients[clientName].revenue += revenue;\n        } else {\n          warnings.push('Google Ads conversion value missing - CAC may be inaccurate');\n        }\n      }\n    });\n  }\n  \n  // Shopify Orders (use as primary revenue source)\n  const facebookRevenue = metrics.totalRevenue;\n  if (json.orders && Array.isArray(json.orders)) {\n    dataSources.shopify = true;\n    let shopifyRevenue = 0;\n    json.orders.forEach(order => {\n      const totalPrice = parseFloat(order.total_price) || 0;\n      const refunds = parseFloat(order.total_refunds) || 0;\n      shopifyRevenue += (totalPrice - refunds);\n    });\n    \n    // Check for revenue discrepancy\n    if (facebookRevenue > 0 && shopifyRevenue > 0) {\n      const diff = Math.abs(shopifyRevenue - facebookRevenue);\n      const diffPercent = (diff / Math.max(shopifyRevenue, facebookRevenue)) * 100;\n      if (diffPercent > 10) {\n        warnings.push(`Revenue mismatch: Shopify ($${shopifyRevenue.toFixed(2)}) vs Facebook ($${facebookRevenue.toFixed(2)}) - ${diffPercent.toFixed(1)}% difference`);\n      }\n    }\n    \n    // Use Shopify revenue if higher (more accurate)\n    if (shopifyRevenue > metrics.totalRevenue) {\n      metrics.totalRevenue = shopifyRevenue;\n    }\n  }\n  \n  // Time Tracking\n  if (json.json && Array.isArray(json.json)) {\n    dataSources.timeTracking = true;\n    json.json.forEach(entry => {\n      const costAmount = parseFloat(entry.costAmount) || 0;\n      const hours = parseFloat(entry.hours) || 0;\n      const clientName = entry.clientName || 'Unknown Client';\n      const revenueAttributed = parseFloat(entry.revenueAttributed) || 0;\n      \n      // Initialize client if needed\n      if (!clients[clientName]) {\n        clients[clientName] = {\n          name: clientName,\n          adSpend: 0,\n          revenue: 0,\n          timeCost: 0,\n          billableHours: 0,\n          conversions: 0,\n          platforms: { facebook: 0, google: 0 }\n        };\n      }\n      \n      clients[clientName].timeCost += costAmount;\n      clients[clientName].revenue += revenueAttributed;\n      \n      metrics.totalTimeCost += costAmount;\n      metrics.totalRevenue += revenueAttributed;\n      \n      if (entry.billable) {\n        metrics.totalBillableHours += hours;\n        clients[clientName].billableHours += hours;\n      }\n    });\n  }\n}\n\n// Validate data completeness\nif (!dataSources.facebook && !dataSources.google) {\n  errors.push('No ad platform data found');\n}\nif (!dataSources.shopify && metrics.totalRevenue === 0) {\n  errors.push('No revenue data found');\n}\nif (!dataSources.timeTracking) {\n  warnings.push('No time tracking data - labor costs may be incomplete');\n}\n\n// Calculate costs\nconst platformFees = metrics.totalRevenue * CONFIG.platformFeeRate;\nconst overheadAllocation = metrics.totalTimeCost * CONFIG.overheadRate;\nconst totalCosts = metrics.totalAdSpend + metrics.totalTimeCost + platformFees + \n                   CONFIG.monthlySoftwareCosts + overheadAllocation;\n\n// Calculate key metrics\nconst cac = metrics.totalConversions > 0 ? metrics.totalAdSpend / metrics.totalConversions : 0;\nconst roas = metrics.totalAdSpend > 0 ? metrics.totalRevenue / metrics.totalAdSpend : 0;\nconst grossProfit = metrics.totalRevenue - totalCosts;\nconst profitMargin = metrics.totalRevenue > 0 ? (grossProfit / metrics.totalRevenue) * 100 : 0;\nconst timeRatio = metrics.totalRevenue > 0 ? (metrics.totalTimeCost / metrics.totalRevenue) * 100 : 0;\n\n// Determine risk level\nlet riskLevel = '🟢 HEALTHY';\nlet riskReasons = [];\n\nif (profitMargin < 0) {\n  riskLevel = '🔴 CRITICAL';\n  riskReasons.push('negative profit margin');\n} else if (profitMargin < CONFIG.minProfitMargin) {\n  riskLevel = '⚠️ WARNING';\n  riskReasons.push(`low profit margin (${profitMargin.toFixed(1)}%)`);\n}\n\nif (timeRatio > CONFIG.maxTimeRatio) {\n  if (riskLevel === '🟢 HEALTHY') riskLevel = '⚠️ WARNING';\n  riskReasons.push(`high time ratio (${timeRatio.toFixed(1)}%)`);\n}\n\nif (roas < 2.0 && metrics.totalAdSpend > 0) {\n  if (riskLevel === '🟢 HEALTHY') riskLevel = '⚠️ WARNING';\n  riskReasons.push(`low ROAS (${roas.toFixed(2)}x)`);\n}\n\n// Calculate client-level metrics\nconst clientDetails = [];\nconst numClients = Object.keys(clients).length;\nconst softwarePerClient = numClients > 0 ? CONFIG.monthlySoftwareCosts / numClients : 0;\n\nObject.values(clients).forEach(client => {\n  const clientPlatformFees = client.revenue * CONFIG.platformFeeRate;\n  const clientOverhead = client.timeCost * CONFIG.overheadRate;\n  const clientTotalCosts = client.adSpend + client.timeCost + clientPlatformFees + \n                           softwarePerClient + clientOverhead;\n  \n  const clientProfit = client.revenue - clientTotalCosts;\n  const clientMargin = client.revenue > 0 ? (clientProfit / client.revenue) * 100 : 0;\n  const clientTimeRatio = client.revenue > 0 ? (client.timeCost / client.revenue) * 100 : 0;\n  const clientROAS = client.adSpend > 0 ? client.revenue / client.adSpend : 0;\n  \n  // Determine client risk level\n  let clientRisk = '🟢 HEALTHY';\n  let clientRiskReasons = [];\n  \n  if (clientMargin < 0) {\n    clientRisk = '🔴 CRITICAL';\n    clientRiskReasons.push('negative margin');\n  } else if (clientMargin < CONFIG.minProfitMargin) {\n    clientRisk = '⚠️ WARNING';\n    clientRiskReasons.push('low margin');\n  }\n  \n  if (clientTimeRatio > CONFIG.maxTimeRatio) {\n    if (clientRisk === '🟢 HEALTHY') clientRisk = '⚠️ WARNING';\n    clientRiskReasons.push('high time cost');\n  }\n  \n  if (clientROAS < 2.0 && client.adSpend > 0) {\n    if (clientRisk === '🟢 HEALTHY') clientRisk = '⚠️ WARNING';\n    clientRiskReasons.push('low ROAS');\n  }\n  \n  clientDetails.push({\n    name: client.name,\n    revenue: parseFloat(client.revenue.toFixed(2)),\n    costs: {\n      adSpend: parseFloat(client.adSpend.toFixed(2)),\n      timeCost: parseFloat(client.timeCost.toFixed(2)),\n      platformFees: parseFloat(clientPlatformFees.toFixed(2)),\n      software: parseFloat(softwarePerClient.toFixed(2)),\n      overhead: parseFloat(clientOverhead.toFixed(2)),\n      total: parseFloat(clientTotalCosts.toFixed(2))\n    },\n    profit: parseFloat(clientProfit.toFixed(2)),\n    profitMargin: parseFloat(clientMargin.toFixed(2)),\n    timeRatio: parseFloat(clientTimeRatio.toFixed(2)),\n    roas: parseFloat(clientROAS.toFixed(2)),\n    billableHours: parseFloat(client.billableHours.toFixed(2)),\n    conversions: client.conversions,\n    platforms: client.platforms,\n    riskLevel: clientRisk,\n    riskReasons: clientRiskReasons.join(', ')\n  });\n});\n\n// Sort clients by profit margin (worst first for attention)\nclientDetails.sort((a, b) => a.profitMargin - b.profitMargin);\n\n// Create summary text for Slack header\nconst summaryEmoji = profitMargin >= CONFIG.minProfitMargin ? '✅' : profitMargin >= 0 ? '⚠️' : '🔴';\nconst summary_text = `${summaryEmoji} *Revenue:* $${metrics.totalRevenue.toFixed(0)} | *Profit:* $${grossProfit.toFixed(0)} (${profitMargin.toFixed(1)}%) | *ROAS:* ${roas.toFixed(2)}x | ${riskLevel}`;\n\n// Return comprehensive data\nreturn [{\n  json: {\n    // Summary for Slack\n    summary_text: summary_text,\n    \n    // Client breakdown for AI analysis\n    clientDetails: clientDetails,\n    \n    // Detailed metrics for AI analysis\n    summary: {\n      totalRevenue: parseFloat(metrics.totalRevenue.toFixed(2)),\n      grossProfit: parseFloat(grossProfit.toFixed(2)),\n      profitMargin: parseFloat(profitMargin.toFixed(2)),\n      riskLevel: riskLevel,\n      riskReasons: riskReasons.join(', '),\n      roas: parseFloat(roas.toFixed(2)),\n      cac: parseFloat(cac.toFixed(2)),\n      timeRatio: parseFloat(timeRatio.toFixed(2))\n    },\n    \n    breakdown: {\n      costs: {\n        adSpend: parseFloat(metrics.totalAdSpend.toFixed(2)),\n        timeCost: parseFloat(metrics.totalTimeCost.toFixed(2)),\n        platformFees: parseFloat(platformFees.toFixed(2)),\n        software: CONFIG.monthlySoftwareCosts,\n        overhead: parseFloat(overheadAllocation.toFixed(2)),\n        total: parseFloat(totalCosts.toFixed(2))\n      },\n      adPlatforms: {\n        facebook: parseFloat(metrics.facebookAdSpend.toFixed(2)),\n        google: parseFloat(metrics.googleAdSpend.toFixed(2))\n      },\n      efficiency: {\n        billableHours: parseFloat(metrics.totalBillableHours.toFixed(2)),\n        conversions: metrics.totalConversions,\n        avgRevenuePerHour: metrics.totalBillableHours > 0 ? \n          parseFloat((metrics.totalRevenue / metrics.totalBillableHours).toFixed(2)) : 0\n      }\n    },\n    \n    dataValidation: {\n      errors: errors,\n      warnings: warnings,\n      sourcesFound: dataSources\n    }\n  }\n}];"},"typeVersion":2},{"id":"129bfe9a-e1d5-4368-bbca-b4a05e852f82","name":"Google Gemini Chat Model1","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-512,384],"parameters":{"options":{}},"credentials":{"googlePalmApi":{"id":"credential-id","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"f6d394ee-0ff1-47e7-956a-ff4c7c8e9cbc","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1728,-496],"parameters":{"color":7,"width":368,"height":224,"content":"## Data ingestion\n\nFetch ad spend from Facebook and Google, revenue from Shopify and Stripe, and time tracking data from Clockify.\n\nDisable mock Set nodes and connect real API nodes directly to the Merge node before going live.\n"},"typeVersion":1},{"id":"017299a1-1224-4e6e-b92c-607fb2b50d06","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1104,-96],"parameters":{"color":7,"width":256,"height":224,"content":"## Processing logic\n\nMerge all sources and calculate revenue, costs, ROAS, CAC, profit margin, and time ratio per client.\n\nUpdate the CONFIG object in the code node to match your real overhead rate, software costs, and minimum margin thresholds.\n"},"typeVersion":1},{"id":"7cd6b962-db8a-46a6-82f0-29260048e247","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-624,-96],"parameters":{"color":7,"width":320,"height":224,"content":"## AI analysis\n\nSend structured financial data to the AI agent to generate a concise executive summary.\n\nAdjust the system message if your definition of healthy performance changes.\n"},"typeVersion":1},{"id":"925733b9-c85d-4179-9551-5acb1e386987","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-640,544],"parameters":{"color":7,"width":368,"height":176,"content":"## Storage and notifications\n\nAppend weekly metrics to Google Sheets for historical tracking.\n\nPost a formatted profitability summary to Slack. Ensure the Slack bot is invited to the selected channel.\n"},"typeVersion":1},{"id":"7c3325d6-9219-41a3-a5a0-828373e78e52","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[0,80],"parameters":{"color":7,"width":416,"height":208,"content":"## Go live checklist\n\n- Remove all mock Set nodes  \n- Confirm client naming consistency across platforms  \n- Validate Google Sheets column mapping  \n- Review configuration values  \n- Run a manual test before enabling schedule\n"},"typeVersion":1},{"id":"b7bb0126-5898-4e03-84b1-8e2f8509d5c5","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-2512,-624],"parameters":{"width":528,"height":720,"content":"# Agency profitability monitor\n\nCalculate client profitability by combining ad spend, revenue, and time tracking data, then store results and send an executive summary to Slack.\n\nThis workflow runs weekly and pulls data from Facebook Ads, Google Ads, Shopify, Stripe, and Clockify. It merges all inputs, calculates revenue, ad spend, labor cost, platform fees, overhead, profit margin, ROAS, CAC, and time to revenue ratio per client.\n\nIt flags unprofitable or inefficient clients based on configurable thresholds inside the code node. Results are appended to Google Sheets for historical tracking, and a structured summary is generated by an AI agent and posted to Slack.\n\n## How it works\n\n1. Fetch ad, revenue, and time tracking data.\n2. Merge all sources into one dataset.\n3. Calculate profitability and risk level per client.\n4. Store metrics in Google Sheets.\n5. Send formatted insights to Slack.\n\n## Setup steps\n\n1. Connect credentials for all API nodes.\n2. Remove mock Set nodes before going live.\n3. Update configuration values in the code node.\n4. Verify Google Sheets column headers.\n5. Test run before enabling the schedule.\n"},"typeVersion":1}],"pinData":{},"connections":{"Merge1":{"main":[[{"node":"Code in JavaScript","type":"main","index":0}]]},"Stripe1":{"main":[[{"node":"Merge1","type":"main","index":3}]]},"Shopify1":{"main":[[{"node":"Merge1","type":"main","index":2}]]},"Clockify1":{"main":[[{"node":"Merge1","type":"main","index":4}]]},"Google ads1":{"main":[[{"node":"Merge1","type":"main","index":1}]]},"Facebook ads1":{"main":[[{"node":"Merge1","type":"main","index":0}]]},"Get a balance":{"main":[[{"node":"Clockify1","type":"main","index":0}]]},"Get a campaign":{"main":[[{"node":"Google ads1","type":"main","index":0}]]},"Get many orders":{"main":[[{"node":"Shopify1","type":"main","index":0}]]},"Get a time entry":{"main":[[{"node":"Stripe1","type":"main","index":0}]]},"Schedule Trigger1":{"main":[[{"node":"Facebook Graph API","type":"main","index":0},{"node":"Get a campaign","type":"main","index":0},{"node":"Get many orders","type":"main","index":0},{"node":"Get a time entry","type":"main","index":0},{"node":"Get a balance","type":"main","index":0}]]},"Code in JavaScript":{"main":[[{"node":"Append row in sheet1","type":"main","index":0}]]},"Facebook Graph API":{"main":[[{"node":"Facebook ads1","type":"main","index":0}]]},"AI Profit Analyzer1":{"main":[[{"node":"Send a message","type":"main","index":0}]]},"Append row in sheet1":{"main":[[{"node":"AI Profit Analyzer1","type":"main","index":0}]]},"Google Gemini Chat Model1":{"ai_languageModel":[[{"node":"AI Profit Analyzer1","type":"ai_languageModel","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":23,"nodeTypes":{"n8n-nodes-base.set":{"count":5},"n8n-nodes-base.code":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.stripe":{"count":1},"n8n-nodes-base.shopify":{"count":1},"n8n-nodes-base.clockify":{"count":1},"n8n-nodes-base.googleAds":{"count":1},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.googleSheets":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"n8n-nodes-base.facebookGraphApi":{"count":1},"@n8n/n8n-nodes-langchain.lmChatGoogleGemini":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Shashwat Singh","username":"shashwatsingh","bio":"Automation Engineer focused on building practical, client-facing workflow systems for SMB automation agencies.\nExperienced in translating business processes into scoped, maintainable n8n workflows with API integrations, webhook\nhandling, CRM synchronization, and AI-assisted task automation. Comfortable working directly from discovery to\ndeployment, with clean documentation and handoff-ready systems.","verified":true,"links":["https://www.linkedin.com/in/shashwat-singh-aiautomation/"],"avatar":"https://gravatar.com/avatar/47af931bf45fa73d95dc3dda5c33555cc27834031a371383778a8b78bc9e90f6?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"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-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/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"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/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"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/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/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-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/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":312,"icon":"file:shopify.svg","name":"n8n-nodes-base.shopify","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.shopify/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/shopify/"}]},"categories":["Sales"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Shopify"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNTggNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzk1YmY0NyIgZD0iTTQ5LjI1NSAxMi40ODRhLjYzLjYzIDAgMCAwLS41NjQtLjUyN2MtLjIyNS0uMDM3LTUuMTctLjM3Ni01LjE3LS4zNzZsLTMuNzctMy43N2MtLjM0LS4zNzYtMS4wOTItLjI2Ni0xLjM3Ni0uMTg4LS4wMzcgMC0uNzUyLjIyNS0xLjkyMi42MDUtMS4xMzctMy4zLTMuMTUtNi4zMDYtNi42OTYtNi4zMDZoLS4zMDNDMjguNDM4LjYwNSAyNy4xOTQgMCAyNi4xNDQgMGMtOC4yNTYuMDM3LTEyLjIgMTAuMzMzLTEzLjQzNCAxNS41OTRsLTUuNzcgMS43N2MtMS43Ny41NjQtMS44MzUuNjA1LTIuMDczIDIuMjkzTDAgNTcuMTc1IDM2LjQ2OCA2NGwxOS43NjMtNC4yNmMwLS4wMzctNi45NC00Ni44OTctNi45NzYtNDcuMjU1ek0zNC40MzEgOC44NmMtLjkxNy4zMDMtMS45NjMuNjA1LTMuMS45NDV2LS42OGExNSAxNSAwIDAgMC0uNzUyLTQuOTk5YzEuODQ4LjI4NCAzLjEgMi4zNTcgMy44NDMgNC43MzN6bS02LjA2OC00LjI5OGMuNjAzIDEuNzc4Ljg4MyAzLjY1LjgyNiA1LjUyN3YuMzRsLTYuMzc1IDEuOTYzYzEuMjQ4LTQuNjYgMy41NS02Ljk2MiA1LjU1LTcuODN6bS0yLjQ1LTIuMjkzYTEuOTQgMS45NCAwIDAgMSAxLjA1NS4zMzljLTIuNjYgMS4yMzgtNS40NzIgNC4zNjYtNi42NzggMTAuNjI3bC01LjA0NSAxLjU0NkMxNi42NjggMTAuMDMgMTkuOTg4IDIuMjYgMjUuOTEgMi4yNnoiLz48cGF0aCBmaWxsPSIjNWU4ZTNlIiBkPSJNNDguNjkxIDExLjk1N2MtLjIyNS0uMDM3LTUuMTctLjM3Ni01LjE3LS4zNzZsLTMuNzctMy43N2EuNzUuNzUgMCAwIDAtLjUyNy0uMjI1TDM2LjQ3MiA2NGwxOS43NjMtNC4yNi02Ljk4LTQ3LjIxOGEuNjguNjggMCAwIDAtLjU2NC0uNTY0eiIvPjxwYXRoIGQ9Im0yOS43NTggMjIuOS0yLjQ1NCA3LjI0MmExMS40IDExLjQgMCAwIDAtNC43NTItMS4xMzNjLTMuODQ4IDAtNC4wMzYgMi40MTItNC4wMzYgMy4wMTggMCAzLjI5OCA4LjYzNiA0LjU2NCA4LjYzNiAxMi4zMzMgMCA2LjEtMy44ODUgMTAuMDMtOS4xIDEwLjAzLTYuMjYgMC05LjQ2Ny0zLjg4NS05LjQ2Ny0zLjg4NWwxLjY2NS01LjU1czMuMjggMi44MyA2LjA3MyAyLjgzYTIuNDcgMi40NyAwIDAgMCAyLjU2NC0yLjQ5YzAtNC4zNC03LjEtNC41MjctNy4xLTExLjYxOCAwLTUuOTYyIDQuMjk4LTExLjc3IDEyLjkzNC0xMS43NyAzLjM5NC4wNSA1LjAxOCAxIDUuMDE4IDF6Ii8+PC9nPjwvc3ltYm9sPjwvc3ZnPg=="},"displayName":"Shopify","typeVersion":1,"nodeCategories":[{"id":2,"name":"Sales"}]},{"id":314,"icon":"file:facebook.svg","name":"n8n-nodes-base.facebookGraphApi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.facebookgraphapi/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/facebookgraph/"}]},"categories":["Development"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"transform\"]","defaults":{"name":"Facebook Graph API"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCA2MCI+PHBhdGggZmlsbD0iIzE4NzdmMiIgZD0iTTU5LjUgMzBDNTkuNSAxMy43MSA0Ni4yOS41IDMwIC41Uy41IDEzLjcxLjUgMzBjMCAxNC43MiAxMC43OSAyNi45MyAyNC44OSAyOS4xNFYzOC41M0gxNy45VjMwaDcuNDl2LTYuNWMwLTcuMzkgNC40LTExLjQ4IDExLjE0LTExLjQ4IDMuMjMgMCA2LjYuNTggNi42LjU4djcuMjZoLTMuNzJjLTMuNjYgMC00LjgxIDIuMjctNC44MSA0LjYxVjMwaDguMThsLTEuMzEgOC41M0gzNC42djIwLjYxQzQ4LjcxIDU2LjkzIDU5LjUgNDQuNzIgNTkuNSAzMCIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik00MS40OCAzOC41MyA0Mi43OSAzMGgtOC4xOHYtNS41M2MwLTIuMzMgMS4xNC00LjYxIDQuODEtNC42MWgzLjcyVjEyLjZzLTMuMzgtLjU4LTYuNi0uNThjLTYuNzQgMC0xMS4xNCA0LjA4LTExLjE0IDExLjQ4VjMwaC03LjV2OC41M2g3LjQ5djIwLjYxYzEuNS4yNCAzLjA0LjM2IDQuNjEuMzZzMy4xMS0uMTIgNC42MS0uMzZWMzguNTN6Ii8+PC9zdmc+"},"displayName":"Facebook Graph API","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"}]},{"id":371,"icon":"file:clockify.svg","name":"n8n-nodes-base.clockify","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clockify/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/clockify/"}]},"categories":["Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"transform\"]","defaults":{"name":"Clockify"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNS44MDA1IDEzLjc0ODRMMzQuOTg0NCA0LjU1ODcyTDM3LjYxMzMgNy4xODczMUwyOC40MjkzIDE2LjM3NzJMMjUuODAwNSAxMy43NDg0Wk0yMi4wNzkxIDIzLjEzOThDMjAuMjgxOCAyMy4xMzk4IDE4LjgyNTcgMjEuNjc3MyAxOC44MjU3IDE5Ljg3MTRDMTguODI1NyAxOC4wNjczIDIwLjI4MTggMTYuNjAyOSAyMi4wNzkxIDE2LjYwMjlDMjMuODc2NSAxNi42MDI5IDI1LjMzMjYgMTguMDY3MyAyNS4zMzI2IDE5Ljg3MTRDMjUuMzMyNiAyMS42NzczIDIzLjg3NjUgMjMuMTM5OCAyMi4wNzkxIDIzLjEzOThaTTM3LjY1NjIgMzIuNjMyTDM1LjAyNzQgMzUuMjYyNUwyNS44NDMzIDI2LjA3MjVMMjguNDcyMiAyMy40NDJMMzcuNjU2MiAzMi42MzJaIiBmaWxsPSIjMjIyMjIyIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjIuMTczOSAzNC4wMDU4QzI0LjAyNTIgMzQuMDA1OCAyNS43ODg5IDMzLjYzNjQgMjcuNDA1NSAzMi45Nzk3TDMxLjg5MTEgMzcuNDcwM0MyOS4wMTQ0IDM5LjA3NjQgMjUuNzAzMSA0MCAyMi4xNzM5IDQwQzExLjEzNjYgNDAgMi4xODc1IDMxLjA0NTIgMi4xODc1IDIwLjAwMDlDMi4xODc1IDguOTU0ODQgMTEuMTM2NyAwIDIyLjE3MzkgMEMyNS42Njc4IDAgMjguOTQ5MiAwLjkwMTA5NCAzMS44MDUzIDIuNDc3NUwyNy4zOTQyIDYuODkzMjhDMjUuNzc5NyA2LjI0MDMxIDI0LjAyMTYgNS44NzA5NCAyMi4xNzM5IDUuODcwOTRDMTQuNDQ0MiA1Ljg3MDk0IDguMTc3ODEgMTIuMTY5MiA4LjE3NzgxIDE5LjkzOTRDOC4xNzc4MSAyNy43MDc1IDE0LjQ0NDEgMzQuMDA1OCAyMi4xNzM5IDM0LjAwNThaIiBmaWxsPSIjMDNBOUY0Ii8+Cjwvc3ZnPgo="},"displayName":"Clockify","typeVersion":1,"nodeCategories":[{"id":4,"name":"Productivity"}]},{"id":499,"icon":"file:stripe.svg","name":"n8n-nodes-base.stripe","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.stripe/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/stripe/"}]},"categories":["Finance & Accounting","Sales"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"transform\"]","defaults":{"name":"Stripe"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjU0IC04MCAzNjAgMzYwIj48cGF0aCBkPSJNNDE0IDExMy40YzAtMjUuNi0xMi40LTQ1LjgtMzYuMS00NS44LTIzLjggMC0zOC4yIDIwLjItMzguMiA0NS42IDAgMzAuMSAxNyA0NS4zIDQxLjQgNDUuMyAxMS45IDAgMjAuOS0yLjcgMjcuNy02LjV2LTIwYy02LjggMy40LTE0LjYgNS41LTI0LjUgNS41LTkuNyAwLTE4LjMtMy40LTE5LjQtMTUuMmg0OC45YzAtMS4zLjItNi41LjItOC45bS00OS40LTkuNWMwLTExLjMgNi45LTE2IDEzLjItMTYgNi4xIDAgMTIuNiA0LjcgMTIuNiAxNnptLTYzLjUtMzYuM2MtOS44IDAtMTYuMSA0LjYtMTkuNiA3LjhsLTEuMy02LjJoLTIydjExNi42bDI1LTUuMy4xLTI4LjNjMy42IDIuNiA4LjkgNi4zIDE3LjcgNi4zIDE3LjkgMCAzNC4yLTE0LjQgMzQuMi00Ni4xLS4xLTI5LTE2LjYtNDQuOC0zNC4xLTQ0LjhtLTYgNjguOWMtNS45IDAtOS40LTIuMS0xMS44LTQuN2wtLjEtMzcuMWMyLjYtMi45IDYuMi00LjkgMTEuOS00LjkgOS4xIDAgMTUuNCAxMC4yIDE1LjQgMjMuMyAwIDEzLjQtNi4yIDIzLjQtMTUuNCAyMy40bS03MS4zLTc0LjggMjUuMS01LjRWMzZsLTI1LjEgNS4zem0wIDcuNmgyNS4xdjg3LjVoLTI1LjF6bS0yNi45IDcuNC0xLjYtNy40aC0yMS42djg3LjVoMjVWOTcuNWM1LjktNy43IDE1LjktNi4zIDE5LTUuMnYtMjNjLTMuMi0xLjItMTQuOS0zLjQtMjAuOCA3LjRtLTUwLTI5LjEtMjQuNCA1LjItLjEgODAuMWMwIDE0LjggMTEuMSAyNS43IDI1LjkgMjUuNyA4LjIgMCAxNC4yLTEuNSAxNy41LTMuM1YxMzVjLTMuMiAxLjMtMTkgNS45LTE5LTguOVY5MC42aDE5VjY5LjNoLTE5ek03OS4zIDk0LjdjMC0zLjkgMy4yLTUuNCA4LjUtNS40IDcuNiAwIDE3LjIgMi4zIDI0LjggNi40VjcyLjJjLTguMy0zLjMtMTYuNS00LjYtMjQuOC00LjZDNjcuNSA2Ny42IDU0IDc4LjIgNTQgOTUuOWMwIDI3LjYgMzggMjMuMiAzOCAzNS4xIDAgNC42LTQgNi4xLTkuNiA2LjEtOC4zIDAtMTguOS0zLjQtMjcuMy04djIzLjhjOS4zIDQgMTguNyA1LjcgMjcuMyA1LjcgMjAuOCAwIDM1LjEtMTAuMyAzNS4xLTI4LjItLjEtMjkuOC0zOC4yLTI0LjUtMzguMi0zNS43IiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojNjM1YmZmIi8+PC9zdmc+"},"displayName":"Stripe","typeVersion":1,"nodeCategories":[{"id":2,"name":"Sales"},{"id":8,"name":"Finance & Accounting"}]},{"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":818,"icon":"file:googleAds.svg","name":"n8n-nodes-base.googleAds","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googleads/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Analytics"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"transform\"]","defaults":{"name":"Google Ads"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMjMwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTUuODg4IDE2Ni40MDUgOTAuODggMjAuOWMxMC43OTYgNi4zNTYgNjUuMjM2IDM2LjQ4NCA3NC4wMjggNDIuMjE0TDc5LjkxNiAyMDguNjI3Yy05LjI5NSAxMi4yOC04NS44MDQtMjMuNTg3LTc0LjAyOC00Mi4yM3oiLz48cGF0aCBmaWxsPSIjNDI4NUY0IiBkPSJNMjUwLjA4NCAxNjYuNDAyIDE2NS4wOTIgMjAuOTA2QzE1My4yMSAxLjEzMiAxMjcuNjItNi4wNTQgMTA2LjYwMSA1LjYyNVM3OS4xODIgNDIuNDYyIDkxLjA2NCA2My4xMTlsODQuOTkyIDE0NS41MTRjMTEuODgyIDE5Ljc2NSAzNy40NzMgMjYuOTUgNTguNDkyIDE1LjI3MiAyMC4xLTExLjY4IDI3LjQxOC0zNy43MyAxNS41MzYtNTcuNDg2eiIvPjxlbGxpcHNlIGN4PSI0Mi42NjQiIGN5PSIxODcuOTI0IiBmaWxsPSIjMzRBODUzIiByeD0iNDIuNjY0IiByeT0iNDEuNjA0Ii8+PC9zdmc+"},"displayName":"Google Ads","typeVersion":1,"nodeCategories":[{"id":10,"name":"Analytics"}]},{"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":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1262,"icon":"file:google.svg","name":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatgooglegemini/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"Google Gemini Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNDggNDgiPjxkZWZzPjxwYXRoIGlkPSJhIiBkPSJNNDQuNSAyMEgyNHY4LjVoMTEuOEMzNC43IDMzLjkgMzAuMSAzNyAyNCAzN2MtNy4yIDAtMTMtNS44LTEzLTEzczUuOC0xMyAxMy0xM2MzLjEgMCA1LjkgMS4xIDguMSAyLjlsNi40LTYuNEMzNC42IDQuMSAyOS42IDIgMjQgMiAxMS44IDIgMiAxMS44IDIgMjRzOS44IDIyIDIyIDIyYzExIDAgMjEtOCAyMS0yMiAwLTEuMy0uMi0yLjctLjUtNCIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9ImIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PC9jbGlwUGF0aD48cGF0aCBmaWxsPSIjRkJCQzA1IiBkPSJNMCAzN1YxMWwxNyAxM3oiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im0wIDExIDE3IDEzIDctNi4xTDQ4IDE0VjBIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiMzNEE4NTMiIGQ9Im0wIDM3IDMwLTIzIDcuOSAxTDQ4IDB2NDhIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik00OCA0OCAxNyAyNGwtNC0zIDM1LTEweiIgY2xpcC1wYXRoPSJ1cmwoI2IpIi8+PC9zdmc+"},"displayName":"Google Gemini Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":39,"name":"CRM"},{"id":49,"name":"AI Summarization"}],"image":[]}}