This workflow follows the Google Drive → Google Drive 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 →
{
"name": "Financial Report Analyzer (10-K, 10-Q)",
"nodes": [
{
"parameters": {
"content": "## \ud83d\udcca Financial Report Analyzer\n\n### What this workflow does\n1. Watches Google Drive for financial reports\n2. Downloads and extracts key financial data\n3. Parses revenue, income, margins, ratios\n4. Generates AI assessment of financial health\n5. Logs metrics to Google Sheets database\n6. Sends analysis summary to Slack\n\n### Setup steps\n1. Get PDF Vector API key from pdfvector.com/api-keys\n2. Create Google Drive folder for reports\n3. Create Google Sheet with columns:\n Company, Ticker, Report Type, Fiscal Period, Revenue, Revenue Growth, Net Income, EPS, Net Margin, Cash, FCF, D/E Ratio, Risk Factors, Report Link, Analyzed Date\n4. Update folder ID and spreadsheet ID in nodes\n5. Connect Slack for notifications\n\n### Perfect for\n- Financial analysts\n- Investors\n- Portfolio managers\n- Research teams",
"height": 580,
"width": 380,
"color": 5
},
"id": "sticky-main",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-120,
20
]
},
{
"parameters": {
"content": "## \ud83d\udcb9 Key Metrics Extracted\n\n- Revenue & Growth YoY\n- Net Income & EPS\n- Gross/Operating/Net Margins\n- Cash & Free Cash Flow\n- Debt-to-Equity Ratio\n- Risk Factors\n- Management Outlook",
"height": 240,
"width": 220
},
"id": "sticky-metrics",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1480,
20
]
},
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"value": "YOUR_REPORTS_FOLDER_ID",
"mode": "list",
"cachedResultName": "Financial Reports"
},
"event": "fileCreated",
"options": {}
},
"id": "gdrive-trigger",
"name": "New Financial Report",
"type": "n8n-nodes-base.googleDriveTrigger",
"typeVersion": 1,
"position": [
300,
300
]
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "={{ $json.id }}",
"mode": "id"
},
"options": {}
},
"id": "gdrive-download",
"name": "Download Report",
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
500,
300
]
},
{
"parameters": {
"jsCode": "const triggerData = $('New Financial Report').item.json;\nconst fileName = triggerData.name || 'unknown';\nconst fileId = triggerData.id || '';\n\nreturn [{\n json: { fileName, fileId },\n binary: $input.first().binary\n}];"
},
"id": "store-metadata",
"name": "Store File Info",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
700,
300
]
},
{
"parameters": {
"operation": "extract",
"inputType": "file",
"prompt": "Extract financial report data as flat fields. companyName, tickerSymbol, reportType (e.g. Q1 2025, Annual 2024), fiscalPeriod, reportDate (YYYY-MM-DD), revenue (number in millions), revenuePriorPeriod (number), revenueGrowthPct (number), grossProfit (number), grossMarginPct (number), operatingIncome (number), operatingMarginPct (number), netIncome (number), netMarginPct (number), eps (number), epsPriorPeriod (number), cashAndEquivalents (number), totalDebt (number), debtToEquityRatio (number), freeCashFlow (number), capitalExpenditures (number), guidance (next period revenue or EPS guidance as string), riskFactorsList (semicolon-separated top risk factors), keyHighlightsList (semicolon-separated key business highlights).",
"schema": "{\"type\": \"object\", \"properties\": {\"companyName\": {\"type\": \"string\"}, \"tickerSymbol\": {\"type\": \"string\"}, \"reportType\": {\"type\": \"string\"}, \"fiscalPeriod\": {\"type\": \"string\"}, \"reportDate\": {\"type\": \"string\"}, \"revenue\": {\"type\": \"number\"}, \"revenuePriorPeriod\": {\"type\": \"number\"}, \"revenueGrowthPct\": {\"type\": \"number\"}, \"grossProfit\": {\"type\": \"number\"}, \"grossMarginPct\": {\"type\": \"number\"}, \"operatingIncome\": {\"type\": \"number\"}, \"operatingMarginPct\": {\"type\": \"number\"}, \"netIncome\": {\"type\": \"number\"}, \"netMarginPct\": {\"type\": \"number\"}, \"eps\": {\"type\": \"number\"}, \"epsPriorPeriod\": {\"type\": \"number\"}, \"cashAndEquivalents\": {\"type\": \"number\"}, \"totalDebt\": {\"type\": \"number\"}, \"debtToEquityRatio\": {\"type\": \"number\"}, \"freeCashFlow\": {\"type\": \"number\"}, \"capitalExpenditures\": {\"type\": \"number\"}, \"guidance\": {\"type\": \"string\"}, \"riskFactorsList\": {\"type\": \"string\"}, \"keyHighlightsList\": {\"type\": \"string\"}}, \"additionalProperties\": false}"
},
"id": "pdfvector-extract",
"name": "PDF Vector Extract",
"type": "n8n-nodes-pdfvector.pdfVector",
"typeVersion": 2,
"position": [
920,
200
]
},
{
"parameters": {
"operation": "ask",
"inputType": "file",
"question": "Based on this financial report, provide: 1) A brief executive summary (2-3 sentences), 2) The top 3 positive highlights, 3) The top 3 concerns or risks, and 4) An overall assessment of the company's financial health (Strong/Stable/Concerning/Weak) with brief justification."
},
"id": "pdfvector-assess",
"name": "PDF Vector Assessment",
"type": "n8n-nodes-pdfvector.pdfVector",
"typeVersion": 2,
"position": [
920,
400
]
},
{
"parameters": {
"mode": "combine",
"combineBy": "combineByPosition",
"options": {}
},
"id": "merge-results",
"name": "Merge Results",
"type": "n8n-nodes-base.merge",
"typeVersion": 3,
"position": [
1140,
300
]
},
{
"parameters": {
"jsCode": "const fin = $('PDF Vector Extract').item.json.data || $('PDF Vector Extract').item.json;\nconst assessment = $('PDF Vector Assessment').item.json.answer || $('PDF Vector Assessment').item.json.markdown || '';\nconst fileName = $('Store File Info').item.json.fileName;\nconst fileId = $('Store File Info').item.json.fileId;\n\nconst riskCount = (fin.riskFactorsList || '').split(';').filter(r => r.trim()).length;\n\nreturn [{ json: {\n companyName: fin.companyName || 'Unknown',\n tickerSymbol: fin.tickerSymbol || 'N/A',\n reportType: fin.reportType || 'N/A',\n fiscalPeriod: fin.fiscalPeriod || 'N/A',\n revenue: fin.revenue || 0,\n revenueGrowthPct: fin.revenueGrowthPct || 0,\n netIncome: fin.netIncome || 0,\n eps: fin.eps || 0,\n netMarginPct: fin.netMarginPct || 0,\n cashAndEquivalents: fin.cashAndEquivalents || 0,\n freeCashFlow: fin.freeCashFlow || 0,\n debtToEquityRatio: fin.debtToEquityRatio || 0,\n riskFactorsList: fin.riskFactorsList || 'None',\n keyHighlightsList: fin.keyHighlightsList || 'None',\n riskCount,\n guidance: fin.guidance || 'Not provided',\n assessment,\n company: fin.companyName || 'Unknown',\n ticker: fin.tickerSymbol || 'N/A',\n debtToEquity: fin.debtToEquityRatio || 0,\n topRisks: fin.riskFactorsList || 'None',\n revenueFormatted: '$' + (fin.revenue||0).toLocaleString() + 'M',\n netIncomeFormatted: '$' + (fin.netIncome||0).toLocaleString() + 'M',\n fcfFormatted: '$' + (fin.freeCashFlow||0).toLocaleString() + 'M',\n fileName, fileId,\n processedAt: new Date().toISOString()\n}}];"
},
"id": "compile-analysis",
"name": "Compile Analysis",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
300
]
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "list",
"cachedResultName": "Financial Database"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Reports"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Company": "={{ $json.companyName }}",
"Ticker": "={{ $json.tickerSymbol }}",
"Report Type": "={{ $json.reportType }}",
"Fiscal Period": "={{ $json.fiscalPeriod }}",
"Revenue": "={{ $json.revenue }}",
"Revenue Growth": "={{ $json.revenueGrowthPct }}%",
"Net Income": "={{ $json.netIncome }}",
"EPS": "={{ $json.eps }}",
"Net Margin": "={{ $json.netMarginPct }}%",
"Cash": "={{ $json.cashAndEquivalents }}",
"FCF": "={{ $json.freeCashFlow }}",
"D/E Ratio": "={{ $json.debtToEquityRatio }}",
"Risk Factors": "={{ $json.riskCount }}",
"Report Link": "=https://drive.google.com/file/d/{{ $json.fileId }}/view",
"Analyzed Date": "={{ $json.processedAt.split('T')[0] }}"
},
"matchingColumns": [],
"schema": [
{
"id": "Company",
"displayName": "Company",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Ticker",
"displayName": "Ticker",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Report Type",
"displayName": "Report Type",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Fiscal Period",
"displayName": "Fiscal Period",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Revenue",
"displayName": "Revenue",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Revenue Growth",
"displayName": "Revenue Growth",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Net Income",
"displayName": "Net Income",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "EPS",
"displayName": "EPS",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Net Margin",
"displayName": "Net Margin",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Cash",
"displayName": "Cash",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "FCF",
"displayName": "FCF",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "D/E Ratio",
"displayName": "D/E Ratio",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Risk Factors",
"displayName": "Risk Factors",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Report Link",
"displayName": "Report Link",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Analyzed Date",
"displayName": "Analyzed Date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
]
},
"options": {}
},
"id": "sheets-log",
"name": "Log to Database",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.4,
"position": [
1540,
300
]
},
{
"parameters": {
"select": "channel",
"channelId": {
"__rl": true,
"value": "YOUR_SLACK_CHANNEL_ID",
"mode": "list",
"cachedResultName": "finance-team"
},
"text": "=\ud83d\udcca *Financial Report Analysis*\n\n*Company:* {{ $('Compile Analysis').item.json.company }} ({{ $('Compile Analysis').item.json.ticker }})\n*Report:* {{ $('Compile Analysis').item.json.reportType }} - {{ $('Compile Analysis').item.json.fiscalPeriod }}\n\n\ud83d\udcb0 *Key Financials:*\n\u2022 Revenue: {{ $('Compile Analysis').item.json.revenueFormatted }}\n\u2022 Net Income: {{ $('Compile Analysis').item.json.netIncomeFormatted }}\n\u2022 EPS: {{ $('Compile Analysis').item.json.eps || 'N/A' }}\n\u2022 Free Cash Flow: {{ $('Compile Analysis').item.json.fcfFormatted }}\n\u2022 D/E Ratio: {{ $('Compile Analysis').item.json.debtToEquity }}\n\n---\n\n\ud83e\udde0 *AI Assessment:*\n{{ $('Compile Analysis').item.json.assessment }}\n\n---\n\n\u26a0\ufe0f *Top Risk Factors ({{ $('Compile Analysis').item.json.riskCount }}):*\n{{ $('Compile Analysis').item.json.topRisks }}\n\n\ud83d\udd17 <https://drive.google.com/file/d/{{ $('Compile Analysis').item.json.fileId }}/view|View Full Report>",
"options": {}
},
"id": "slack-share",
"name": "Send to Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1740,
300
]
}
],
"connections": {
"New Financial Report": {
"main": [
[
{
"node": "Download Report",
"type": "main",
"index": 0
}
]
]
},
"Download Report": {
"main": [
[
{
"node": "Store File Info",
"type": "main",
"index": 0
}
]
]
},
"Store File Info": {
"main": [
[
{
"node": "PDF Vector Extract",
"type": "main",
"index": 0
},
{
"node": "PDF Vector Assessment",
"type": "main",
"index": 0
}
]
]
},
"PDF Vector Extract": {
"main": [
[
{
"node": "Merge Results",
"type": "main",
"index": 0
}
]
]
},
"PDF Vector Assessment": {
"main": [
[
{
"node": "Merge Results",
"type": "main",
"index": 1
}
]
]
},
"Merge Results": {
"main": [
[
{
"node": "Compile Analysis",
"type": "main",
"index": 0
}
]
]
},
"Compile Analysis": {
"main": [
[
{
"node": "Log to Database",
"type": "main",
"index": 0
}
]
]
},
"Log to Database": {
"main": [
[
{
"node": "Send to Slack",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Financial Report Analyzer (10-K, 10-Q). Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 11 nodes.
Source: https://github.com/khanhduyvt0101/workflows/blob/0153ee2efc0f692c931b9bb4c2a04abf11756822/n8n-workflows/financial-report-analyzer.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Lease Agreement Analyzer for Renters. Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 12 nodes.
Expense Report Processor with AI Categorization. Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 12 nodes.
AI Contract Review & Risk Analysis. Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 10 nodes.
Patient Intake Form Processor for Healthcare. Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 10 nodes.
Analyze medical bills for errors with AI and Slack alerts. Uses googleDriveTrigger, googleDrive, n8n-nodes-pdfvector, googleSheets. Event-driven trigger; 10 nodes.