{
  "id": "zlG1WZp43ovsOAoF",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI-Powered Executive Financial Monitoring & Alerting System",
  "tags": [],
  "nodes": [
    {
      "id": "255ad886-0c84-4d56-9745-4d32b5c5719e",
      "name": "Sticky Note \u2014 Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2144,
        4064
      ],
      "parameters": {
        "width": 692,
        "height": 476,
        "content": "## \ud83d\udcca CFO Intelligence Dashboard \u2014 Daily Briefing\n\n### How it works\nEvery weekday at 7 AM, this workflow pulls live financial data from five Google Sheets tabs (Cash Flow, Revenue, Payroll, Subscriptions, Expenses), calculates key KPIs, and passes the results to an AI agent. The AI writes a concise executive briefing, which is saved to Notion and sent to a Telegram channel. If revenue drops more than 10%, a separate critical alert fires immediately.\n\n### Setup steps\n1. **Google Sheets** \u2014 Connect your `googleSheetsOAuth2Api` credential and update the sheet ID in all five Fetch nodes to point to your own spreadsheet.\n2. **OpenAI** \u2014 Add your OpenAI API key under the `openAiApi` credential used by the GPT-4o-mini node.\n3. **Notion** \u2014 Connect your `notionApi` credential and update the Notion database ID in the Save node to match your CFO Report database.\n4. **Telegram** \u2014 Add your `telegramApi` credential and confirm the correct Chat ID in both Telegram nodes.\n5. **Test** \u2014 Manually trigger the workflow once to verify data is fetched, the AI report generates correctly, and the Telegram message arrives as expected."
      },
      "typeVersion": 1
    },
    {
      "id": "36ea10a1-1576-4fd0-9d91-c4cfb7028e90",
      "name": "Sticky Note \u2014 Trigger",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1360,
        4624
      ],
      "parameters": {
        "color": 7,
        "width": 280,
        "height": 372,
        "content": "## \u23f0 Schedule Trigger\nRuns Monday\u2013Friday at 7 AM using a cron expression. Kicks off all five data-fetch branches in parallel."
      },
      "typeVersion": 1
    },
    {
      "id": "72074ea2-efdf-4dfd-b9f6-9304f95769d8",
      "name": "Sticky Note \u2014 Data Fetching",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        4272
      ],
      "parameters": {
        "color": 7,
        "width": 556,
        "height": 1292,
        "content": "## \ud83d\udce5 Data Fetching\nPulls the latest rows from all five financial sheets simultaneously \u2014 CashFlow, Revenue, Payroll, Subscriptions, and Expenses \u2014 then merges them into a single dataset for analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "6effccf9-7c69-459e-b4c5-97527fee0d28",
      "name": "Sticky Note \u2014 KPI Analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        4544
      ],
      "parameters": {
        "color": 7,
        "width": 516,
        "height": 648,
        "content": "## \ud83e\uddee KPI Analysis\nAggregates totals, calculates percentage changes, and assigns status labels (GOOD / WARNING / ALERT) for revenue, payroll, marketing ROI, and cash runway. Output feeds directly into the AI node."
      },
      "typeVersion": 1
    },
    {
      "id": "0cf52ea3-8531-4afb-8f33-93163331bcfa",
      "name": "Sticky Note \u2014 AI Generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        4528
      ],
      "parameters": {
        "color": 7,
        "width": 636,
        "height": 716,
        "content": "## \ud83e\udd16 AI Report Generation\nThe Agent node uses GPT-4o-mini with a structured system prompt to write a Telegram-formatted executive briefing from the raw KPI data. Output is merged back with financial fields before routing to destinations."
      },
      "typeVersion": 1
    },
    {
      "id": "75180ea9-255a-4749-87f9-2bdbfceae9ca",
      "name": "Sticky Note \u2014 Delivery",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        768,
        4288
      ],
      "parameters": {
        "color": 7,
        "width": 668,
        "height": 1164,
        "content": "## \ud83d\udce4 Delivery & Logging\nSends the AI-written report to Telegram and saves a structured record to Notion. If revenue has dropped more than 10%, a second critical alert message is sent immediately to the same Telegram channel."
      },
      "typeVersion": 1
    },
    {
      "id": "41a4a381-85dd-439a-a1bf-5bd25703195c",
      "name": "Sticky Note \u2014 Security",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        5072
      ],
      "parameters": {
        "color": 3,
        "width": 300,
        "height": 308,
        "content": "## \ud83d\udd10 Credentials & Security\nUse OAuth2 for Google Sheets and Notion. Add OpenAI and Telegram credentials via n8n's credential manager \u2014 never paste keys directly into node fields. Replace all personal IDs with your own before sharing this workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "93224007-4e5a-404d-87d0-6eb4a878e2ba",
      "name": "Calculate KPIs & Status Labels",
      "type": "n8n-nodes-base.code",
      "position": [
        -48,
        4848
      ],
      "parameters": {
        "jsCode": "const allItems = $input.all();\n\nconst cashflowData = allItems.filter(i => i.json.sheet === 'CashFlow' || i.json.cash_in !== undefined);\nconst revenueData = allItems.filter(i => i.json.sheet === 'Revenue' || i.json.revenue_current !== undefined);\nconst payrollData = allItems.filter(i => i.json.sheet === 'Payroll' || i.json.payroll_current !== undefined);\nconst subscriptionData = allItems.filter(i => i.json.sheet === 'Subscriptions' || i.json.subscription_revenue !== undefined);\nconst expensesData = allItems.filter(i => i.json.sheet === 'Expenses' || i.json.expense_amount !== undefined);\n\nconst totalRevenueCurrent = revenueData.reduce((sum, i) => sum + (parseFloat(i.json.revenue_current) || 0), 0);\nconst totalRevenuePrevious = revenueData.reduce((sum, i) => sum + (parseFloat(i.json.revenue_previous) || 0), 0);\nconst revenueChange = totalRevenuePrevious > 0 ? (((totalRevenueCurrent - totalRevenuePrevious) / totalRevenuePrevious) * 100).toFixed(1) : 0;\n\nconst totalPayrollCurrent = payrollData.reduce((sum, i) => sum + (parseFloat(i.json.payroll_current) || 0), 0);\nconst totalPayrollPrevious = payrollData.reduce((sum, i) => sum + (parseFloat(i.json.payroll_previous) || 0), 0);\nconst payrollChange = totalPayrollPrevious > 0 ? (((totalPayrollCurrent - totalPayrollPrevious) / totalPayrollPrevious) * 100).toFixed(1) : 0;\n\nconst totalMarketingSpend = expensesData.reduce((sum, i) => sum + (parseFloat(i.json.marketing_spend) || 0), 0);\nconst totalMarketingRevenue = revenueData.reduce((sum, i) => sum + (parseFloat(i.json.marketing_attributed_revenue) || 0), 0);\nconst marketingROI = totalMarketingSpend > 0 ? ((totalMarketingRevenue / totalMarketingSpend) * 100).toFixed(1) : 0;\nconst marketingROIPrevious = 85;\nconst marketingROIChange = (marketingROI - marketingROIPrevious).toFixed(1);\n\nconst currentCash = cashflowData.reduce((sum, i) => sum + (parseFloat(i.json.cash_balance) || 0), 0);\nconst monthlyBurnRate = expensesData.reduce((sum, i) => sum + (parseFloat(i.json.monthly_burn) || 0), 0);\nconst cashRunway = monthlyBurnRate > 0 ? (currentCash / monthlyBurnRate).toFixed(1) : 'N/A';\n\nconst totalSubscriptions = subscriptionData.reduce((sum, i) => sum + (parseFloat(i.json.subscription_revenue) || 0), 0);\nconst totalExpenses = expensesData.reduce((sum, i) => sum + (parseFloat(i.json.expense_amount) || 0), 0);\n\nconst today = new Date().toISOString().split('T')[0];\n\nconst revenueStatus = revenueChange < -10 ? '\ud83d\udd34 ALERT' : revenueChange < 0 ? '\ud83d\udfe1 WARNING' : '\ud83d\udfe2 GOOD';\nconst payrollStatus = payrollChange > 10 ? '\ud83d\udd34 ALERT' : payrollChange > 5 ? '\ud83d\udfe1 WARNING' : '\ud83d\udfe2 GOOD';\nconst cashRunwayStatus = parseFloat(cashRunway) < 3 ? '\ud83d\udd34 CRITICAL' : parseFloat(cashRunway) < 6 ? '\ud83d\udfe1 WARNING' : '\ud83d\udfe2 HEALTHY';\nconst marketingStatus = marketingROIChange > 0 ? '\ud83d\udfe2 IMPROVING' : '\ud83d\udfe1 DECLINING';\n\nreturn [{\n  json: {\n    date: today,\n    revenue_current: totalRevenueCurrent,\n    revenue_previous: totalRevenuePrevious,\n    revenue_change_pct: parseFloat(revenueChange),\n    payroll_current: totalPayrollCurrent,\n    payroll_change_pct: parseFloat(payrollChange),\n    marketing_roi: parseFloat(marketingROI),\n    marketing_roi_change: parseFloat(marketingROIChange),\n    cash_balance: currentCash,\n    monthly_burn_rate: monthlyBurnRate > 0 ? monthlyBurnRate / allItems.filter(i => i.json.monthly_burn).length : 0,\n    cash_runway_months: parseFloat(cashRunway),\n    subscriptions_mrr: totalSubscriptions,\n    total_expenses: totalExpenses,\n    revenue_status: revenueStatus,\n    payroll_status: payrollStatus,\n    cash_status: cashRunwayStatus,\n    marketing_status: marketingStatus\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "7ce123fe-a6b9-4ba7-91db-19f30a37dc9c",
      "name": "Merge AI Report + Financial Data",
      "type": "n8n-nodes-base.code",
      "position": [
        640,
        4848
      ],
      "parameters": {
        "jsCode": "const aiOutput = $('Generate AI Outreach Message1').item.json.output || '';\nconst financialData = $('Calculate KPIs & Status Labels').item.json;\n\nreturn [{\n  json: {\n    ...financialData,\n    telegram_report: aiOutput\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "aaca23c6-472e-460c-8ff4-f77f4b0f46cb",
      "name": "Weekday 7 AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1264,
        4800
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 7 * * 1-5"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a859b98e-26af-42f6-af87-e7bf69c5e578",
      "name": "Fetch Cash Flow Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -800,
        4496
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1633478050,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=1633478050",
          "cachedResultName": "CashFlow"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "CFO Dashboard Spreadsheet"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "0e5b9cfe-d746-48d7-a5e4-90405b10d3a2",
      "name": "Fetch Revenue Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -800,
        4720
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1706846147,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=1706846147",
          "cachedResultName": "Revenue"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "CFO Dashboard Spreadsheet"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "afb56320-8bf9-4429-b078-20e1b3f6674b",
      "name": "Fetch Payroll Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -800,
        4912
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 195536092,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=195536092",
          "cachedResultName": "Payroll"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "CFO Dashboard Spreadsheet"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "5f235cb5-0a53-4ade-8211-087911ed8fc5",
      "name": "Fetch Subscriptions Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -800,
        5088
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1836920758,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=1836920758",
          "cachedResultName": "Subscriptions"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "CFO Dashboard Spreadsheet"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "d8cd861b-67ca-4a02-9050-63ae2362e549",
      "name": "Fetch Expenses Data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -800,
        5296
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 2069863123,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=2069863123",
          "cachedResultName": "Expenses"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "CFO Dashboard Spreadsheet"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "e68f2b4c-8428-4c4b-b23d-74ce4fcff869",
      "name": "Merge All Sheet Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        -336,
        4800
      ],
      "parameters": {
        "numberInputs": 5
      },
      "typeVersion": 3.2
    },
    {
      "id": "ba7f2284-83e9-4736-9a06-870401cc47f3",
      "name": "Save CFO Report to Notion",
      "type": "n8n-nodes-base.notion",
      "position": [
        960,
        4544
      ],
      "parameters": {
        "title": "=CFO Report \u2014 {{ $json.date }}",
        "blockUi": {
          "blockValues": [
            {
              "textContent": "={{ $json.telegram_report }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_NOTION_DATABASE_ID",
          "cachedResultUrl": "https://app.notion.com/p/YOUR_NOTION_DATABASE_ID",
          "cachedResultName": "CFO Report"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "date|title",
              "title": "={{ $json.date }}"
            },
            {
              "key": "marketing status|rich_text",
              "textContent": "={{ $json.marketing_status }}"
            },
            {
              "key": "report|rich_text",
              "textContent": "={{ $json.telegram_report }}"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "bab31bff-d680-4920-8d87-7558f0e48aab",
      "name": "Send Daily Briefing to Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        960,
        5152
      ],
      "parameters": {
        "text": "={{ $json.telegram_report }}",
        "chatId": "YOUR_TELEGRAM_CHAT_ID",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "0c78fcaa-45c1-4af1-9b62-6b2bae004d63",
      "name": "Check for Critical Revenue Drop",
      "type": "n8n-nodes-base.if",
      "position": [
        944,
        4848
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "cond-revenue-alert",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $json.revenue_change_pct }}",
              "rightValue": -10
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "caf9ba49-1721-424b-b5e0-ab83b69e3ffa",
      "name": "Send Critical Revenue Alert",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1312,
        4832
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *CRITICAL CFO ALERT \u2014 {{ $json.date }}*\n\n\u26a0\ufe0f Revenue has dropped {{ $json.revenue_change_pct }}% \u2014 immediate attention required!\n\n\ud83d\udcb0 Cash Runway: {{ $json.cash_runway_months }} months\n\ud83d\udd25 Monthly Burn: ${{ $json.monthly_burn_rate }}\n\nCheck the full report in Notion now.",
        "chatId": "YOUR_TELEGRAM_CHAT_ID",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "197f6694-ea66-4900-a2a6-76f913d6f718",
      "name": "Generate AI Outreach Message1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "onError": "continueRegularOutput",
      "position": [
        192,
        4848
      ],
      "parameters": {
        "text": "=You are an expert CFO assistant. Write a concise daily financial briefing for the executive team based on the data below. Format it for Telegram using *bold* for section labels. Use emojis for quick scanning. Be direct, highlight what changed and what action (if any) is needed. Keep it under 350 words.\n\n\ud83d\udcc5 Report Date: {{ $json.date }}\n\n\ud83d\udcb0 REVENUE\n- Current: ${{ $json.revenue_current }}\n- Previous: ${{ $json.revenue_previous }}\n- Change: {{ $json.revenue_change_pct }}%\n- Status: {{ $json.revenue_status }}\n\n\ud83d\udc65 PAYROLL\n- Current: ${{ $json.payroll_current }}\n- Change: {{ $json.payroll_change_pct }}%\n- Status: {{ $json.payroll_status }}\n\n\ud83d\udce3 MARKETING ROI\n- ROI: {{ $json.marketing_roi }}%\n- Change vs baseline: {{ $json.marketing_roi_change }}%\n- Status: {{ $json.marketing_status }}\n\n\ud83c\udfe6 CASH POSITION\n- Balance: ${{ $json.cash_balance }}\n- Monthly Burn: ${{ $json.monthly_burn_rate }}\n- Runway: {{ $json.cash_runway_months }} months\n- Status: {{ $json.cash_status }}\n\n\ud83d\udce6 SUBSCRIPTIONS MRR: ${{ $json.subscriptions_mrr }}\n\ud83d\udcb8 TOTAL EXPENSES: ${{ $json.total_expenses }}\n\nEnd with a 1\u20132 line executive summary highlighting the single most important insight today.",
        "options": {
          "systemMessage": "You are a senior CFO assistant. Your job is to turn raw financial KPI data into a sharp, scannable executive briefing for Telegram. Rules: use Telegram Markdown (*bold* for labels), include emojis for each section, keep total length under 350 words, be direct and action-oriented \u2014 if a metric is at WARNING or ALERT status call out the specific recommended action, otherwise just confirm it is healthy. Never add filler sentences."
        },
        "promptType": "define"
      },
      "retryOnFail": false,
      "typeVersion": 3
    },
    {
      "id": "171d6d4f-aff0-467a-a0d1-a94200024c78",
      "name": "OpenAI GPT-4o-mini",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        192,
        5072
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "437e604c-ca4a-44b9-8cb5-0475bc549c90",
      "name": "On Workflow Error",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        -1600,
        5440
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "51995a33-1568-4315-9cad-98b08fc04732",
      "name": "Slack: Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        -1344,
        5440
      ],
      "parameters": {
        "text": "=Error occured ",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AN1UGL0RM",
          "cachedResultName": "all-n8n-automations"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "cec7a946-37f9-44e8-86a6-3d73a218a431",
      "name": "Section: Error Handler",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        5296
      ],
      "parameters": {
        "color": 7,
        "width": 492,
        "height": 328,
        "content": "## \u26a0\ufe0f Error Handler\nCatches any failure across the entire workflow and immediately sends a Slack alert to the ops channel. Wire this to every sub-workflow or critical node to ensure no silent failures."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "d0494410-c2e7-4a16-b763-125965434f4e",
  "connections": {
    "On Workflow Error": {
      "main": [
        [
          {
            "node": "Slack: Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Payroll Data": {
      "main": [
        [
          {
            "node": "Merge All Sheet Data",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Fetch Revenue Data": {
      "main": [
        [
          {
            "node": "Merge All Sheet Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "OpenAI GPT-4o-mini": {
      "ai_languageModel": [
        [
          {
            "node": "Generate AI Outreach Message1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Expenses Data": {
      "main": [
        [
          {
            "node": "Merge All Sheet Data",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "Fetch Cash Flow Data": {
      "main": [
        [
          {
            "node": "Merge All Sheet Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All Sheet Data": {
      "main": [
        [
          {
            "node": "Calculate KPIs & Status Labels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekday 7 AM Trigger": {
      "main": [
        [
          {
            "node": "Fetch Cash Flow Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Revenue Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Payroll Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Subscriptions Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Expenses Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Subscriptions Data": {
      "main": [
        [
          {
            "node": "Merge All Sheet Data",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Generate AI Outreach Message1": {
      "main": [
        [
          {
            "node": "Merge AI Report + Financial Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate KPIs & Status Labels": {
      "main": [
        [
          {
            "node": "Generate AI Outreach Message1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Critical Revenue Drop": {
      "main": [
        [
          {
            "node": "Send Critical Revenue Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge AI Report + Financial Data": {
      "main": [
        [
          {
            "node": "Save CFO Report to Notion",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Daily Briefing to Telegram",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check for Critical Revenue Drop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}