This workflow corresponds to n8n.io template #15065 — we link there as the canonical source.
This workflow follows the Google Sheets → 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 →
{
"id": "6zyHopCz7BIM3wHc",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Auto FAQ Generator for Clients",
"tags": [],
"nodes": [
{
"id": "5be8e21a-7a60-4ee5-9643-d8f9b0c8e03a",
"name": "Fetch Market News",
"type": "n8n-nodes-base.httpRequest",
"position": [
14576,
2240
],
"parameters": {
"url": "https://newsapi.org/v2/top-headlines",
"options": {},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "sources",
"value": "techcrunch"
},
{
"name": "apiKey"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "a047cfeb-a244-4820-b36b-1aa98dea5c16",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
16192,
1952
],
"parameters": {
"color": 7,
"width": 464,
"height": 752,
"content": "## FAQ Storage & Usage\n\nThis stage formats and stores the final results.\n\nIt ensures:\n\nFAQs are structured into Q&A format (Q1\u2013Q5, A1\u2013A5)\nData is clean and consistent\nResults are saved to Google Sheets\n\nThis makes the output easy to access, reuse and share with clients."
},
"typeVersion": 1
},
{
"id": "81bd75e0-d410-4c50-a923-04b2e51f8fcb",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
15488,
1952
],
"parameters": {
"color": 7,
"width": 672,
"height": 752,
"content": "## AI-Powered FAQ Generation\n\nThis stage combines all prepared data into one context.\n\nIt uses AI to:\n\nAnalyze market trends and portfolio performance\nGenerate 5 relevant client questions\nProvide clear, one-line answers\n\nThe output is focused on practical and client-friendly insights."
},
"typeVersion": 1
},
{
"id": "31736f47-5152-49c9-b5c1-a7393587ac33",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
14176,
1936
],
"parameters": {
"color": 7,
"width": 560,
"height": 736,
"content": "## Automated Data Collection\n\nThis workflow runs every Monday at 8:00 AM.\n\nIt collects data from:\n\nMarket news via API\nPortfolio data from Google Sheets\n\nThese two sources provide the foundation for generating relevant client insights."
},
"typeVersion": 1
},
{
"id": "db5b9cb0-725b-4bd5-b6c5-217182886f5e",
"name": "Save FAQs to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
16496,
2448
],
"parameters": {
"columns": {
"value": {
"A1": "={{$json[\"A1\"]}}",
"A2": "={{ $json[\"A2\"] }}",
"A3": "={{$json[\"A3\"]}}",
"A4": "={{$json[\"A4\"]}}",
"A5": "={{$json[\"A5\"]}}",
"Q1": "={{$json[\"Q1\"]}}\n",
"Q2": "={{$json[\"Q2\"]}}",
"Q3": "={{$json[\"Q3\"]}}",
"Q4": "={{$json[\"Q4\"]}}",
"Q5": "={{$json[\"Q5\"]}}"
},
"schema": [
{
"id": "Q1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Q1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "A1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "A1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Q2",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Q2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "A2",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "A2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Q3",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Q3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "A3",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "A3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Q4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Q4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "A4",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "A4",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Q5",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Q5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "A5",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "A5",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "index",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "index",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "message",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "logprobs",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "logprobs",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "finish_reason",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "finish_reason",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How can I check the current value of my investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How can I check the current value of my investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What does it mean if my investment shows a decrease in value?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What does it mean if my investment shows a decrease in value?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level associated with my investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level associated with my investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Should I be concerned if my asset\u2019s value drops from last week?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Should I be concerned if my asset\u2019s value drops from last week?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How can I diversify my investments to manage risk?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How can I diversify my investments to manage risk?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How much has my investment in Apple grown recently?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How much has my investment in Apple grown recently?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level of my Tesla investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level of my Tesla investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "How is my Google investment performing?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "How is my Google investment performing?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Are my investments in low-risk assets doing well?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Are my investments in low-risk assets doing well?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How much has Bitcoin increased in value?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How much has Bitcoin increased in value?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What does the risk level of my investment mean?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What does the risk level of my investment mean?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "How has my asset performed compared to last week?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "How has my asset performed compared to last week?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What should I do if my investment is losing value?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What should I do if my investment is losing value?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How much has my investment grown since I started?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How much has my investment grown since I started?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How is my investment performing?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How is my investment performing?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level of my assets?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level of my assets?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Can I see the current value of my investments?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Can I see the current value of my investments?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What sectors are these investments in?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What sectors are these investments in?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How much has my asset changed in value?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How much has my asset changed in value?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level associated with my asset?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level associated with my asset?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Did the value of my investment increase or decrease last week?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Did the value of my investment increase or decrease last week?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How much profit or loss have I made on my investments?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How much profit or loss have I made on my investments?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Should I invest more in a high-risk asset like Tesla or Bitcoin?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Should I invest more in a high-risk asset like Tesla or Bitcoin?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How has my investment in Apple performed?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How has my investment in Apple performed?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Is it risky to invest in high-risk assets like Tesla and Bitcoin?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Is it risky to invest in high-risk assets like Tesla and Bitcoin?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the current value of my Google investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the current value of my Google investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How has my gold ETF investment changed recently?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How has my gold ETF investment changed recently?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Are my investments in banking and energy sectors performing well?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Are my investments in banking and energy sectors performing well?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How has my Apple investment performed recently?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How has my Apple investment performed recently?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Is the Tesla stock a risky investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Is the Tesla stock a risky investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the current value of my Amazon holdings?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the current value of my Amazon holdings?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How did my Gold ETF perform last week?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How did my Gold ETF perform last week?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What is the current value of my Bitcoin investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What is the current value of my Bitcoin investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How can I check the current value of my investment?\\n",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How can I check the current value of my investment?\\n",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level of my asset?\\n",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level of my asset?\\n",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "How much has my investment grown compared to last week?\\n",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "How much has my investment grown compared to last week?\\n",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Can I see the sector of my investment?\\n",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Can I see the sector of my investment?\\n",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What should I do if I want to sell my asset?\\n",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What should I do if I want to sell my asset?\\n",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level for my Tesla investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level for my Tesla investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "How much did my Google investment change in value?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "How much did my Google investment change in value?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What is the current value of my Gold ETF?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What is the current value of my Gold ETF?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How has the Bitcoin investment performed this week?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How has the Bitcoin investment performed this week?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=How can I check my investment performance?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=How can I check my investment performance?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What is the risk level associated with my investments?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What is the risk level associated with my investments?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "How much has my Apple investment grown recently?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "How much has my Apple investment grown recently?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Is there a way to get updates on my investments?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Is there a way to get updates on my investments?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=What should I consider before investing in high-risk assets like Bitcoin?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=What should I consider before investing in high-risk assets like Bitcoin?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "What does the risk level 'Medium' mean for my investment?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "What does the risk level 'Medium' mean for my investment?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Should I consider reallocating my investments based on the risk levels?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Should I consider reallocating my investments based on the risk levels?",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "=Why did the value of my asset change recently?",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "=Why did the value of my asset change recently?",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1558419824,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg/edit#gid=1558419824",
"cachedResultName": "ANswer"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg/edit?usp=drivesdk",
"cachedResultName": "FAQS"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "2ba42834-444f-4db9-a369-dc9f89c7aa22",
"name": "Extract FAQs (Structured Output)",
"type": "n8n-nodes-base.set",
"position": [
16256,
2448
],
"parameters": {
"values": {
"string": [
{
"name": "=Q1",
"value": "={{$json[\"message\"][\"content\"].match(/Q1:\\s*(.*?)\\nA1:/s)?.[1]}}"
},
{
"name": "A1",
"value": "={{$json[\"message\"][\"content\"].match(/A1:\\s*(.*?)\\nQ2:/s)?.[1]}}"
},
{
"name": "Q2",
"value": "={{$json[\"message\"][\"content\"].match(/Q2:\\s*(.*?)\\nA2:/s)?.[1]}}"
},
{
"name": "A2",
"value": "={{$json[\"message\"][\"content\"].match(/A2:\\s*(.*?)\\nQ3:/s)?.[1]}}"
},
{
"name": "Q3",
"value": "={{$json[\"message\"][\"content\"].match(/Q3:\\s*(.*?)\\nA3:/s)?.[1]}}"
},
{
"name": "A3",
"value": "={{$json[\"message\"][\"content\"].match(/A3:\\s*(.*?)\\nQ4:/s)?.[1]}}"
},
{
"name": "Q4",
"value": "={{$json[\"message\"][\"content\"].match(/Q4:\\s*(.*?)\\nA4:/s)?.[1]}}"
},
{
"name": "A4",
"value": "={{$json[\"message\"][\"content\"].match(/A4:\\s*(.*?)\\nQ5:/s)?.[1]}}"
},
{
"name": "Q5",
"value": "={{$json[\"message\"][\"content\"].match(/Q5:\\s*(.*?)\\nA5:/s)?.[1]}}"
},
{
"name": "A5",
"value": "={{ $json[\"message\"][\"content\"].match(/A5:(.*)/s)[1].trim() }}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"id": "866732b2-2058-4058-afe2-049124e56e74",
"name": "Generate Client FAQs (AI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
15808,
2448
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "GPT-4.1-NANO"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "=You are an assistant that generates client FAQs based on provided context. Output **exactly 5 FAQs only** with short, simple answers. Do not generate more than 5."
},
{
"content": "=Here is the client portfolio:{{ $json.Portfolio }} and news context:{{ $json[\"Prepare News\"] }}\n\nYou are a financial assistant.\n\nBased on news + portfolio context, generate 5 FAQs clients may ask this week.\n\nRules:\n- Focus on trends, risks, opportunities\n- Keep answers very simple (1 line)\n- Avoid generic questions\n- Make them practical for investors\nSTRICT FORMAT (do not change):\nQ1: question\nA1: answer\nQ2: question\nA2: answer\nQ3: question\nA3: answer\nQ4: question\nA4: answer\nQ5: question\nA5: answer"
}
]
}
},
"typeVersion": 1
},
{
"id": "2e29ba94-51f6-4b2d-ace6-20ff584f9744",
"name": "Merge News + Portfolio Context",
"type": "n8n-nodes-base.merge",
"position": [
15568,
2448
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "8d562271-9d62-40c1-916c-5e93c9f2ecf4",
"name": "Fetch Portfolio Data (Google Sheets)",
"type": "n8n-nodes-base.googleSheets",
"position": [
14560,
2512
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg/edit#gid=0",
"cachedResultName": "FAQS"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1cNPNmqkABsykQQuAsop_9-pqD-3OrjFvmTpdWRfdgfg/edit?usp=drivesdk",
"cachedResultName": "FAQS"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "5319de63-b50e-4eb8-b34d-678e72e87260",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
13408,
1424
],
"parameters": {
"color": "#F5D224",
"width": 662,
"height": 1072,
"content": "## Auto FAQ Generator for Clients\n### Overview\n\nThis workflow automatically generates weekly client-ready investment FAQs by combining real-time market news with portfolio performance data. It ensures clients receive timely, relevant and easy-to-understand insights\u2014helping you stay proactive and consistent in communication.\n\n### How It Works:\nThe workflow runs every Monday at 8:00 AM\nIt fetches the latest tech-focused market news\nIt pulls current and historical portfolio data from a spreadsheet\nIt analyzes portfolio risk levels and performance changes\nBoth datasets are formatted and merged into a single context\nAn AI model generates 5 practical FAQs with simple answers\nThe structured FAQs are extracted and saved to Google Sheets for use or sharing\n\n### Setup Steps: \n1. Schedule Trigger\nConfigure the workflow to run weekly (Monday at 8:00 AM)\n\n2. Collect Market News\nUse an HTTP Request node to fetch top headlines (e.g., TechCrunch)\nAdd a fallback message if no news is available\n\n3. Retrieve Portfolio Data\nConnect Google Sheets to load portfolio data\nFormat asset details (current value, last week value, risk level)\n\n4. Analyze Portfolio\nCalculate:\n\nNumber of high-risk assets\nAssets losing value\n\n5. Combine Data\nMerge news data and portfolio insights into one structured input\n\n6. Generate FAQs\nUse an AI node to:\n\nCreate exactly 5 relevant client questions\nProvide short, clear, one-line answers\nFocus on trends, risks and opportunities\n\n7. Structure Output\nParse the AI response into structured Q&A fields (Q1\u2013Q5, A1\u2013A5)\n\n8. Store Results\nSave FAQs into Google Sheets for tracking or reuse\n\n9. (Optional) Share Output\nDistribute FAQs via email, dashboard or client communication tools"
},
"typeVersion": 1
},
{
"id": "ba60dafc-543f-4fae-a558-cf957e611847",
"name": "Weekly Portfolio & News Trigger (Mon 8AM)",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
14224,
2368
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.3
},
{
"id": "f213fd5c-3ac5-4e63-a0b7-abaf7c0648ce",
"name": "Check News Availability",
"type": "n8n-nodes-base.if",
"position": [
14816,
2240
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "5660d4e7-906c-46f2-9394-bf4b42eeaa37",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ !!$json[\\\"articles\\\"] && $json[\\\"articles\\\"].length > 0 }}",
"rightValue": 0
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.3
},
{
"id": "a3b72e3a-e2aa-4e93-acd2-844ea12ad925",
"name": "Format Top News",
"type": "n8n-nodes-base.set",
"position": [
15232,
2224
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "79367086-a290-48e9-b2ee-5262cab15fbc",
"name": "Prepare News",
"type": "string",
"value": "={{ ($json.articles || []).slice(0,5).map(a => a.title + \": \" + (a.description || \"\")).join(\"\\n\") }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8a04a043-ba0a-460d-9642-75499c143e6d",
"name": "Fallback News Message",
"type": "n8n-nodes-base.set",
"position": [
15056,
2352
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4519518c-ac38-407d-b6a6-b26f710d04e7",
"name": "Prepare News",
"type": "string",
"value": "No major market news this week. Focus on portfolio performance"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2e7b39f5-f1f8-42c3-ab96-a8bc992ed7cb",
"name": "Format Portfolio Summary",
"type": "n8n-nodes-base.set",
"position": [
14816,
2512
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "48efab47-204f-4571-82d3-89cb805194f6",
"name": "Portfolio",
"type": "string",
"value": "={{ $input.all().map(item => \n item.json[\"Asset\"] + \n \" | Current: \" + item.json[\"Current Value\"] + \n \" | Last Week: \" + item.json[\"Last Week Value\"] + \n \" | Risk: \" + item.json[\"Risk Level\"]\n).join(\"\\n\") }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8b300b45-e535-4805-b48e-96fb7c341823",
"name": "Analyze Portfolio Risk & Loss",
"type": "n8n-nodes-base.code",
"position": [
15232,
2512
],
"parameters": {
"jsCode": "const items = $input.all();\n\nlet highRisk = 0;\nlet losses = 0;\n\nitems.forEach(item => {\n const current = Number(item.json[\"Current Value\"]);\n const last = Number(item.json[\"Last Week Value\"]);\n const risk = item.json[\"Risk Level\"];\n\n if (risk === \"High\") highRisk++;\n if (current < last) losses++;\n});\n\nreturn [{\n json: {\n PortfolioSummary: `\nHigh Risk Assets: ${highRisk}\nAssets Losing Value: ${losses}\n`\n }\n}];"
},
"typeVersion": 2
},
{
"id": "b54c48b3-4cd8-43cd-8d9b-89bce4489331",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
14768,
1952
],
"parameters": {
"color": 7,
"width": 672,
"height": 752,
"content": "## Data Preparation & Portfolio Analysis\n\nThis stage prepares and enriches the collected data.\n\nIt includes:\n\nFormatting news into readable summaries\nHandling missing news with a fallback message\nStructuring portfolio data (current value, past value, risk level)\nAnalyzing portfolio trends (high-risk assets, declining assets)\n\nThis ensures the data is clean, structured and insight-ready."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "c003b477-c354-4dd5-9197-6bec92e35602",
"connections": {
"Format Top News": {
"main": [
[
{
"node": "Merge News + Portfolio Context",
"type": "main",
"index": 0
}
]
]
},
"Fetch Market News": {
"main": [
[
{
"node": "Check News Availability",
"type": "main",
"index": 0
}
]
]
},
"Check News Availability": {
"main": [
[
{
"node": "Format Top News",
"type": "main",
"index": 0
}
],
[
{
"node": "Fallback News Message",
"type": "main",
"index": 0
}
]
]
},
"Format Portfolio Summary": {
"main": [
[
{
"node": "Analyze Portfolio Risk & Loss",
"type": "main",
"index": 0
}
]
]
},
"Generate Client FAQs (AI)": {
"main": [
[
{
"node": "Extract FAQs (Structured Output)",
"type": "main",
"index": 0
}
]
]
},
"Analyze Portfolio Risk & Loss": {
"main": [
[
{
"node": "Merge News + Portfolio Context",
"type": "main",
"index": 1
}
]
]
},
"Merge News + Portfolio Context": {
"main": [
[
{
"node": "Generate Client FAQs (AI)",
"type": "main",
"index": 0
}
]
]
},
"Extract FAQs (Structured Output)": {
"main": [
[
{
"node": "Save FAQs to Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Fetch Portfolio Data (Google Sheets)": {
"main": [
[
{
"node": "Format Portfolio Summary",
"type": "main",
"index": 0
}
]
]
},
"Weekly Portfolio & News Trigger (Mon 8AM)": {
"main": [
[
{
"node": "Fetch Market News",
"type": "main",
"index": 0
},
{
"node": "Fetch Portfolio Data (Google Sheets)",
"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.
googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically generates weekly client-ready investment FAQs by combining market news (NewsAPI) and portfolio data (Google Sheets) using OpenAI GPT-4.1. The final FAQs are structured and saved back into Google Sheets. Import the workflow into n8n Add your NewsAPI…
Source: https://n8n.io/workflows/15065/ — 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.
AI Institutional Stock Valuation Engine with Risk Scoring & Scenario Targets
Overview This is a production-grade, fully automated stock analysis system built entirely in n8n. It combines institutional-level financial analysis, dual AI model consensus, and a self-improving back
This automation is a complete end-to-end system designed to find, qualify, and contact B2B leads — fully automated and powered by AI. Searches for target companies on LinkedIn via Ghost Genius API, us
This comprehensive n8n automation template orchestrates a complete end-to-end workflow for generating engaging short-form Point-of-View (POV) style videos using multiple AI services and automatically
A professional AI equity analysis automation built on n8n that transforms structured financial data and real-time news into disciplined, risk-adjusted price targets and actionable BUY/HOLD/SELL signal