AutomationFlowsAI & RAG › Send Daily Executive Financial Briefings with Google Sheets, Gpt-4o-mini,…

Send Daily Executive Financial Briefings with Google Sheets, Gpt-4o-mini,…

Original n8n title: Send Daily Executive Financial Briefings with Google Sheets, Gpt-4o-mini, Notion and Telegram

ByRahul Joshi @rahul08 on n8n.io

This workflow runs every weekday at 7 AM to pull financial data from Google Sheets, calculate KPIs, generate an executive briefing with OpenAI (GPT-4o-mini), save the report to Notion, and send it to Telegram, with a Slack alert on any workflow error. Runs on a weekday schedule…

Cron / scheduled trigger★★★★☆ complexityAI-powered25 nodesGoogle SheetsNotionTelegramAgentOpenAI ChatError TriggerSlack
AI & RAG Trigger: Cron / scheduled Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16459 — we link there as the canonical source.

This workflow follows the Agent → Error Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "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
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow runs every weekday at 7 AM to pull financial data from Google Sheets, calculate KPIs, generate an executive briefing with OpenAI (GPT-4o-mini), save the report to Notion, and send it to Telegram, with a Slack alert on any workflow error. Runs on a weekday schedule…

Source: https://n8n.io/workflows/16459/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Decodo is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScrip

OpenAI Chat, Agent, Slack +5
AI & RAG

This workflow is designed for social media managers, content creators, digital marketers, and entrepreneurs who want to automate the entire lifecycle of creating and publishing short-form video conten

Tool Think, Output Parser Structured, Google Sheets +6
AI & RAG

Workflow Created By: Abdullah Dilshad 📧 iamabdullahdishad@gmail.com

HTTP Request, Agent, OpenAI Chat +4
AI & RAG

This workflow automates short-interval market signal evaluation for intraday trading using live technical indicators and deterministic decision logic. It is designed for traders, analysts, and automat

HTTP Request, Agent, OpenAI Chat +5
AI & RAG

This workflow is a real-time AI-powered cricket commentary bot that continuously monitors live match data and converts it into short, expert-style insights. It fetches live cricket scores every few se

N8N Nodes Serpapi, Agent, OpenAI Chat +4