AutomationFlowsAI & RAG › Generate Executive Decision Briefings From Apis with Openai and Google Sheets

Generate Executive Decision Briefings From Apis with Openai and Google Sheets

ByOneclick AI Squad @oneclick-ai on n8n.io

This workflow runs daily or via an on-demand webhook to pull financial metrics, operational KPIs, and market quotes via HTTP APIs, then uses OpenAI to detect anomalies and generate an executive briefing that is POSTed to a dashboard endpoint and logged to Google Sheets. Runs on…

Cron / scheduled trigger★★★★☆ complexityAI-powered26 nodesHTTP RequestAgentOpenAI Chat
AI & RAG Trigger: Cron / scheduled Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:
Generate Executive Decision Briefings From Apis with Openai and Google Sheets — n8n workflow card showing HTTP Request, Agent, OpenAI Chat integration

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

This workflow follows the Agent → HTTP Request 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": "V09FW4Rn4Nicl5de",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Generate executive decision intelligence briefings from financial, operational, and market data",
  "tags": [
    {
      "id": "erahGTmOjub3F9NW",
      "name": "executive",
      "createdAt": "2026-07-13T10:12:14.239Z",
      "updatedAt": "2026-07-13T10:12:14.239Z"
    },
    {
      "id": "0tT5YMQqW2WJ8ti8",
      "name": "decision-intelligence",
      "createdAt": "2026-07-13T10:12:14.240Z",
      "updatedAt": "2026-07-13T10:12:14.240Z"
    },
    {
      "id": "tGMNDdNM4nxYa1TH",
      "name": "ai-analytics",
      "createdAt": "2026-07-13T10:12:14.181Z",
      "updatedAt": "2026-07-13T10:12:14.181Z"
    }
  ],
  "nodes": [
    {
      "id": "1326a517-a989-4f32-9d98-c81a17b1179f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        -192
      ],
      "parameters": {
        "width": 1020,
        "height": 1100,
        "content": "## Generate executive decision intelligence briefings from financial, operational, and market data\n\nAn advanced decision-intelligence pipeline for leadership teams: it fuses financial metrics, operational KPIs, and market data into one snapshot, runs a two-stage AI analysis (anomaly detection, then briefing synthesis), and delivers a structured executive briefing to a dashboard and Google Sheets \u2014 on a schedule or on demand.\n\n### Who's it for\n- Executives who want a daily or on-demand pulse check instead of five separate dashboards\n- Finance/ops leads who need anomalies surfaced automatically, not discovered a week late\n- Teams building an internal \"single pane of glass\" for company health\n\n### How it works\n1. Triggers on a schedule (default daily) or via on-demand webhook\n2. Fetches financial, operational, and market data in parallel \u2014 each fault-tolerant, so one down source never blocks the run\n3. Normalizes and merges all three into a single snapshot, with safe fallbacks for any missing source\n4. AI stage one scans for anomalies and pattern shifts, scoring each by severity\n5. AI stage two synthesizes the findings into a briefing: summary, highlights, risks, opportunities, actions, and a health score\n6. The briefing is posted to your dashboard and logged to Google Sheets; webhook runs also return it directly\n\n### Setup\n1. Import the workflow\n2. Point the finance and operational HTTP nodes at your internal APIs (or Google Sheets / BI tool)\n3. Add your market data provider's API key\n4. Add OpenAI credentials to both OpenAI Chat Model nodes\n5. Replace YOUR_DASHBOARD_ENDPOINT_URL and YOUR_SHEET_ID\n6. Set your preferred schedule and activate\n\n### Requirements\n- Internal API access (or Sheets) for financials and KPIs\n- A market data API key\n- OpenAI API key (gpt-4.1 or above)\n- A dashboard endpoint that accepts a POSTed JSON briefing\n- Google Sheets OAuth2 credentials (optional, for history)\n\n### Customize\n- Add more sources (churn, tickets, headcount) as parallel branches into the merge step\n- Tune anomaly severity thresholds in the merge code or the detection prompt\n- Swap the dashboard POST for Slack or email delivery\n\n### Google Sheets Column Layout\n\n**ExecutiveBriefings tab** (row 1 headers):\nRequest ID | Date | Timestamp | Overall Health Score | Anomalies Detected | Top Risk | Top Opportunity | Status"
      },
      "typeVersion": 1
    },
    {
      "id": "bea4865c-753a-4872-a0f6-6db65f9460b4",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        -160
      ],
      "parameters": {
        "color": 4,
        "width": 788,
        "height": 900,
        "content": "## 1. Trigger & Data Intake\n\nTwo ways to kick off a briefing:\n- Schedule Trigger runs automatically (default: every morning) for a routine pulse check\n- Webhook accepts an on-demand POST request, useful for a \"Generate briefing now\" button on your dashboard or a Slack command\n\nEach trigger tags the run with its source, then both paths converge on a common Set node that prepares the reporting window (report date, lookback period, requestId, timestamp) so everything downstream is identical regardless of how the run started.\n\nFrom there, three HTTP Request nodes fetch financial metrics, operational KPIs, and market data in parallel \u2014 each with continueOnFail on, so a single slow or down data source never blocks the whole briefing."
      },
      "typeVersion": 1
    },
    {
      "id": "059343a5-1ca5-4f17-9f38-ecc91f39d247",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2368,
        -176
      ],
      "parameters": {
        "color": 6,
        "width": 944,
        "height": 1020,
        "content": "## 2. Normalize & Detect Anomalies\n\nThe Code node merges all three data sources into a single company snapshot, filling in safe fallback values (null / \"unavailable\") wherever a source failed, so the AI always receives a consistent shape.\n\nThe first AI stage scans that snapshot for:\n- Metrics that moved sharply outside their normal range\n- Trends that contradict each other across financial, operational, and market data\n- Anything worth flagging before it becomes a bigger problem\n\nEach anomaly is scored by severity (low / medium / high / critical) so the next stage knows what to prioritize in the briefing."
      },
      "typeVersion": 1
    },
    {
      "id": "e1e535df-dde1-4c4c-b61e-c1dc7b9030bb",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3376,
        -48
      ],
      "parameters": {
        "color": 4,
        "width": 768,
        "height": 880,
        "content": "## 3. Executive Briefing Generation\n\nThe second AI stage takes the anomaly findings plus the raw metrics snapshot and writes the actual briefing an executive would read:\n\n- A short executive summary\n- Key metric highlights (financial, operational, market)\n- Top risks, in priority order\n- Top opportunities\n- Concrete recommended actions\n- An overall company health score\n\nIt's written to be skimmed in under two minutes \u2014 plain language, no jargon, no filler."
      },
      "typeVersion": 1
    },
    {
      "id": "1e06bc83-6c82-4619-96c5-0eccab417339",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4208,
        -112
      ],
      "parameters": {
        "color": 6,
        "width": 1100,
        "height": 940,
        "content": "## 4. Format, Deliver & Log\n\nThe final Code node parses both AI responses and merges them with the request metadata into one clean JSON payload, ready to hand off anywhere.\n\nA short Wait buffer paces delivery, then three things happen in parallel:\n- The briefing is POSTed to your dashboard endpoint\n- A summary row is appended to the Google Sheets tracker (continueOnFail on, so a Sheets outage never blocks delivery)\n- An IF node checks whether this run came from the webhook; if so, the full briefing is also returned as the webhook response so an on-demand caller gets it immediately"
      },
      "typeVersion": 1
    },
    {
      "id": "e8ffa3d3-4041-4ae9-9cc1-5202559c761e",
      "name": "Schedule Trigger - Daily Briefing Refresh",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1728,
        256
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 7 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9f0d1b1f-4ef9-40f3-a54b-889edb4f5972",
      "name": "Webhook - On-Demand Briefing Request",
      "type": "n8n-nodes-base.webhook",
      "position": [
        1728,
        448
      ],
      "parameters": {
        "path": "generate-executive-briefing",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e9a1cf90-2445-47c4-acca-a6e3a127de17",
      "name": "Set - Tag Schedule Trigger",
      "type": "n8n-nodes-base.set",
      "position": [
        1952,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "name": "triggerSource",
              "type": "string",
              "value": "schedule"
            },
            {
              "name": "lookbackDays",
              "type": "number",
              "value": 7
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "42a8d9cc-09d3-4ea7-99d1-13ba5f81fe00",
      "name": "Set - Tag Webhook Trigger",
      "type": "n8n-nodes-base.set",
      "position": [
        1952,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "name": "triggerSource",
              "type": "string",
              "value": "webhook"
            },
            {
              "name": "lookbackDays",
              "type": "number",
              "value": "={{ $json.lookbackDays || $json.body?.lookbackDays || 7 }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "eaa7083d-fb63-42f5-8a4c-4065a33cff36",
      "name": "Set - Prepare Reporting Window",
      "type": "n8n-nodes-base.set",
      "position": [
        2176,
        352
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "name": "requestId",
              "type": "string",
              "value": "={{ 'BRIEF-' + Date.now().toString() }}"
            },
            {
              "name": "reportDate",
              "type": "string",
              "value": "={{ new Date().toISOString().split('T')[0] }}"
            },
            {
              "name": "requestTimestamp",
              "type": "string",
              "value": "={{ new Date().toISOString() }}"
            },
            {
              "name": "lookbackDays",
              "type": "number",
              "value": "={{ $json.lookbackDays }}"
            },
            {
              "name": "triggerSource",
              "type": "string",
              "value": "={{ $json.triggerSource }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "cea0902a-ccd6-4a5b-8b34-4040bb8de9e1",
      "name": "Fetch Financial Metrics",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2400,
        160
      ],
      "parameters": {
        "url": "=https://YOUR_FINANCE_API/api/v1/metrics?lookbackDays={{ $json.lookbackDays }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "f35aba02-d042-478d-909d-277f1a649914",
      "name": "Fetch Operational KPIs",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2400,
        352
      ],
      "parameters": {
        "url": "=https://YOUR_OPERATIONS_API/api/v1/kpis?lookbackDays={{ $json.lookbackDays }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "99374893-2820-4ae2-ac72-f86846f2d0fc",
      "name": "Fetch Market Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2400,
        544
      ],
      "parameters": {
        "url": "=https://YOUR_MARKET_DATA_PROVIDER/api/v1/quote?symbol=YOUR_TICKER&apikey=YOUR_MARKET_DATA_API_KEY",
        "options": {}
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "ee04f7ff-ddd3-4803-8b92-112778f4ed06",
      "name": "Code - Merge & Normalize Metrics",
      "type": "n8n-nodes-base.code",
      "position": [
        2624,
        352
      ],
      "parameters": {
        "jsCode": "// Merge financial, operational, and market data into a single snapshot\n// Falls back to safe defaults for any source that failed (continueOnFail)\nconst request = $('Set - Prepare Reporting Window').first().json;\n\nconst financialItem = $('Fetch Financial Metrics').first();\nconst operationalItem = $('Fetch Operational KPIs').first();\nconst marketItem = $('Fetch Market Data').first();\n\nconst financialData = (financialItem && !financialItem.json.error) ? financialItem.json : { unavailable: true };\nconst operationalData = (operationalItem && !operationalItem.json.error) ? operationalItem.json : { unavailable: true };\nconst marketData = (marketItem && !marketItem.json.error) ? marketItem.json : { unavailable: true };\n\nreturn [{\n  json: {\n    requestId: request.requestId,\n    reportDate: request.reportDate,\n    requestTimestamp: request.requestTimestamp,\n    lookbackDays: request.lookbackDays,\n    triggerSource: request.triggerSource,\n    financialData,\n    operationalData,\n    marketData\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "e3e10802-fea1-452a-bf79-f8a392a03750",
      "name": "AI - Detect Patterns & Anomalies",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3056,
        352
      ],
      "parameters": {
        "text": "=You are a business intelligence analyst. Review this company snapshot for the {{ $json.lookbackDays }}-day period ending {{ $json.reportDate }} and identify anomalies, unusual trends, and notable pattern shifts.\n\nFinancial data:\n{{ JSON.stringify($json.financialData) }}\n\nOperational data:\n{{ JSON.stringify($json.operationalData) }}\n\nMarket data:\n{{ JSON.stringify($json.marketData) }}\n\nIf any data set is marked unavailable, note that as a data-gap risk rather than inventing numbers.\n\nRespond with ONLY valid JSON, no commentary, no code fences, in exactly this shape:\n{\n  \"anomalies\": [ { \"area\": string, \"description\": string, \"severity\": \"low\" | \"medium\" | \"high\" | \"critical\", \"suggestedFollowUp\": string } ],\n  \"trendSummary\": string,\n  \"dataGaps\": string[]\n}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "d28e8100-7d2c-4db8-bfd4-afa315437e77",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3136,
        576
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "5aa3ba85-1694-4792-9a1b-dade8e30abfd",
      "name": "AI - Generate Executive Briefing",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3616,
        352
      ],
      "parameters": {
        "text": "=You are writing a two-minute executive briefing for company leadership, covering {{ $('Code - Merge & Normalize Metrics').item.json.lookbackDays }} days ending {{ $('Code - Merge & Normalize Metrics').item.json.reportDate }}.\n\nAnomaly findings:\n{{ JSON.stringify($json.output || $json.response || $json.text) }}\n\nFinancial data:\n{{ JSON.stringify($('Code - Merge & Normalize Metrics').item.json.financialData) }}\n\nOperational data:\n{{ JSON.stringify($('Code - Merge & Normalize Metrics').item.json.operationalData) }}\n\nMarket data:\n{{ JSON.stringify($('Code - Merge & Normalize Metrics').item.json.marketData) }}\n\nWrite in plain, direct language with no filler. Respond with ONLY valid JSON, no commentary, no code fences, in exactly this shape:\n{\n  \"executiveSummary\": string,\n  \"overallHealthScore\": number,\n  \"keyHighlights\": [ { \"metric\": string, \"value\": string, \"note\": string } ],\n  \"topRisks\": [ { \"risk\": string, \"severity\": \"low\" | \"medium\" | \"high\" | \"critical\", \"impact\": string } ],\n  \"topOpportunities\": [ { \"opportunity\": string, \"potentialImpact\": string } ],\n  \"recommendedActions\": string[]\n}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "3f12161a-d41c-454c-9dd9-c58204b0d3bb",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3696,
        576
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "35e1d282-4784-4bfa-805f-9f542146895a",
      "name": "Code - Format Final Briefing Output",
      "type": "n8n-nodes-base.code",
      "position": [
        3968,
        352
      ],
      "parameters": {
        "jsCode": "// Parse both AI responses (anomaly detection + executive briefing) and merge into one payload\nfunction parseJsonSafely(raw) {\n  let cleaned = (raw || '').trim();\n  cleaned = cleaned.replace(/^```json/i, '').replace(/^```/, '').replace(/```$/, '').trim();\n  try {\n    return JSON.parse(cleaned);\n  } catch (e) {\n    const match = cleaned.match(/\\{[\\s\\S]*\\}/);\n    return match ? JSON.parse(match[0]) : { error: 'Failed to parse JSON', raw: cleaned };\n  }\n}\n\nconst request = $('Code - Merge & Normalize Metrics').first().json;\n\nconst anomalyItem = $('AI - Detect Patterns & Anomalies').first().json;\nconst anomalyFindings = parseJsonSafely(anomalyItem.output || anomalyItem.response || anomalyItem.text || '');\n\nconst briefingItem = $input.first().json;\nconst briefing = parseJsonSafely(briefingItem.output || briefingItem.response || briefingItem.text || '');\n\nreturn [{\n  json: {\n    success: true,\n    requestId: request.requestId,\n    reportDate: request.reportDate,\n    requestTimestamp: request.requestTimestamp,\n    triggerSource: request.triggerSource,\n    executiveSummary: briefing.executiveSummary,\n    overallHealthScore: briefing.overallHealthScore,\n    keyHighlights: briefing.keyHighlights,\n    topRisks: briefing.topRisks,\n    topOpportunities: briefing.topOpportunities,\n    recommendedActions: briefing.recommendedActions,\n    anomalies: anomalyFindings.anomalies,\n    trendSummary: anomalyFindings.trendSummary,\n    dataGaps: anomalyFindings.dataGaps,\n    logDate: new Date().toISOString().split('T')[0],\n    logTimestamp: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "58802be0-16a8-41bc-aa85-7830efff8b8b",
      "name": "Send to Dashboard Endpoint",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4416,
        160
      ],
      "parameters": {
        "url": "https://YOUR_DASHBOARD_ENDPOINT_URL",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify($json) }}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "79de90b1-7b89-4a8e-b126-7bb3563d3cbf",
      "name": "Log to Google Sheet Tracker",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4416,
        352
      ],
      "parameters": {
        "url": "https://sheets.googleapis.com/v4/spreadsheets/YOUR_SHEET_ID/values/ExecutiveBriefings!A1:append?valueInputOption=USER_ENTERED",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"values\": [[\n    \"{{ $json.requestId }}\",\n    \"{{ $json.reportDate }}\",\n    \"{{ $json.logTimestamp }}\",\n    \"{{ $json.overallHealthScore }}\",\n    \"{{ ($json.anomalies || []).length }}\",\n    \"{{ $json.topRisks?.[0]?.risk || '' }}\",\n    \"{{ $json.topOpportunities?.[0]?.opportunity || '' }}\",\n    \"Delivered\"\n  ]]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleSheetsOAuth2Api"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "6cedc7df-1ed1-4c66-9b57-8621022b4754",
      "name": "IF - Triggered By Webhook",
      "type": "n8n-nodes-base.if",
      "position": [
        4416,
        544
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.triggerSource }}",
              "rightValue": "webhook"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f96f47b8-f838-43e6-b7bd-9b7d299d3bb7",
      "name": "Webhook Response - Send Briefing",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        4912,
        528
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "d9f5a1c9-fb57-495c-b9e3-47a1778a1f26",
      "name": "Wait For Response",
      "type": "n8n-nodes-base.wait",
      "position": [
        3408,
        352
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "224e5401-e2fb-48f1-828e-64793d7fcfc2",
      "name": "Wait For Result",
      "type": "n8n-nodes-base.wait",
      "position": [
        4704,
        528
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "e70b3e35-03c2-4a4b-9cdf-20688b1bb6fa",
      "name": "Wait for Data",
      "type": "n8n-nodes-base.wait",
      "position": [
        2832,
        352
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "43887e80-f0ef-4ccd-8c23-013646dc9bc2",
  "connections": {
    "Wait for Data": {
      "main": [
        [
          {
            "node": "AI - Detect Patterns & Anomalies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait For Result": {
      "main": [
        [
          {
            "node": "Webhook Response - Send Briefing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Market Data": {
      "main": [
        [
          {
            "node": "Code - Merge & Normalize Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI - Detect Patterns & Anomalies",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Wait For Response": {
      "main": [
        [
          {
            "node": "AI - Generate Executive Briefing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI - Generate Executive Briefing",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Operational KPIs": {
      "main": [
        [
          {
            "node": "Code - Merge & Normalize Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Financial Metrics": {
      "main": [
        [
          {
            "node": "Code - Merge & Normalize Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Triggered By Webhook": {
      "main": [
        [
          {
            "node": "Wait For Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set - Tag Webhook Trigger": {
      "main": [
        [
          {
            "node": "Set - Prepare Reporting Window",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set - Tag Schedule Trigger": {
      "main": [
        [
          {
            "node": "Set - Prepare Reporting Window",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set - Prepare Reporting Window": {
      "main": [
        [
          {
            "node": "Fetch Financial Metrics",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Operational KPIs",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Market Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI - Detect Patterns & Anomalies": {
      "main": [
        [
          {
            "node": "Wait For Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI - Generate Executive Briefing": {
      "main": [
        [
          {
            "node": "Code - Format Final Briefing Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Merge & Normalize Metrics": {
      "main": [
        [
          {
            "node": "Wait for Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Format Final Briefing Output": {
      "main": [
        [
          {
            "node": "Send to Dashboard Endpoint",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log to Google Sheet Tracker",
            "type": "main",
            "index": 0
          },
          {
            "node": "IF - Triggered By Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook - On-Demand Briefing Request": {
      "main": [
        [
          {
            "node": "Set - Tag Webhook Trigger",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger - Daily Briefing Refresh": {
      "main": [
        [
          {
            "node": "Set - Tag Schedule Trigger",
            "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 daily or via an on-demand webhook to pull financial metrics, operational KPIs, and market quotes via HTTP APIs, then uses OpenAI to detect anomalies and generate an executive briefing that is POSTed to a dashboard endpoint and logged to Google Sheets. Runs on…

Source: https://n8n.io/workflows/17038/ — 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

Complete PostgreSQL-backed system: Keyword scoring → AI research → Multi-part content generation → fal.ai Nano Banana image generation → WordPress publishing

WordPress, OpenAI, Perplexity +8
AI & RAG

auto_post_wordpress_. Uses rssFeedRead, lmChatOpenAi, textClassifier, agent. Scheduled trigger; 90 nodes.

RSS Feed Read, OpenAI Chat, Text Classifier +7
AI & RAG

blog writing automation. Uses rssFeedRead, lmChatOpenAi, textClassifier, agent. Scheduled trigger; 90 nodes.

RSS Feed Read, OpenAI Chat, Text Classifier +8
AI & RAG

We’ve released Version 4 of our AI Powered Blog Automation workflow. We heard your complains and made a complete redesign built for serious content creators.

RSS Feed Read, OpenAI Chat, Text Classifier +6
AI & RAG

This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform

Agent, OpenAI Chat, Airtable Tool +7