{
  "id": "vhfHESk9Lyu0bQwH",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Client Onboarding Form \u2192 Profile Summary",
  "tags": [],
  "nodes": [
    {
      "id": "59d0e6c0-3a20-4543-bc63-9dd7c17d8f26",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1056,
        -688
      ],
      "parameters": {
        "width": 752,
        "height": 608,
        "content": "## Workflow Overview: Investor Profiler\nThis workflow automates the transition from **lead capture to financial strategy**. It enriches client onboarding data with **real-time market insights**, ensuring every recommendation is data-driven, consistent and delivered with professional precision while maintaining real-time team visibility.\n\n\n## How it works\nNew data from the **New Onboarding Submission** node passes through a **Rate Limit Control** node to manage execution. The workflow then fetches live market data using **Fetch Market Data**, processes key values like price and change and derives insights such as trend and volatility through **Generate Market Insights**. In parallel, client data is analyzed by the **Analyze Investor Profile** node using AI. The response is structured via the **Profile Data Parser**, mapped through **Prepare CRM Mapping** and stored in Google Sheets using **Update CRM**. Finally, a **Slack Notification** is sent for real-time visibility and a **Send Welcome Email** delivers the personalized investment strategy to the client.\n\n## Setup steps\n**New Onboarding Submission**: Link your Google Sheet and select the Get Rows trigger.  \n**Rate Limit Control**: Set max items (e.g., 1) to control execution and avoid API limits.  \n**Fetch Market Data**: Configure your market API (e.g., Alpha Vantage) with correct query parameters.  \n**Process Market Data**: Normalize API response fields such as price, change and percentage change.  \n**Generate Market Insights**: Use a Function node to derive trend and volatility from market data.  \n**Analyze Investor Profile**: Ensure your Groq API key is active. Reference fields using expressions like `{{ $json[\"Income\"] }}` and include market data if needed.  \n**Profile Data Parser**: Match the schema exactly with AI output to ensure proper structuring.  \n**Prepare CRM Mapping**: Map all required fields for storage.  \n**Update CRM**: Set operation to Append or Update and configure your destination sheet.  \n**Slack Notification**: Connect your Slack account and map fields for real-time alerts.  \n**Send Welcome Email**: Customize the message using AI-generated insights."
      },
      "typeVersion": 1
    },
    {
      "id": "7b366d7d-d2c3-42af-9b81-a4cc9f047410",
      "name": "Analyze Investor Profile",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        560,
        256
      ],
      "parameters": {
        "text": "=You are an expert financial advisor and portfolio strategist.\n\nAnalyze the client profile along with current market conditions to generate a personalized investment recommendation.\n\nClient Data:\nName: {{ $('Rate Limit Control').item.json.Name }}\nEmail: {{ $('Rate Limit Control').item.json.Email }}\nAge: {{ $('Rate Limit Control').item.json.Age }}\nIncome: {{ $('Rate Limit Control').item.json.Income }}\nRisk Appetite: {{ $('Rate Limit Control').item.json['Risk Appetite  '] }}\n\nMarket Data:\nMarket Trend: {{ $json.marketTrend }}\nVolatility: {{ $json.volatility }}\nMarket Change: {{ $json.marketChangePercent }}\n\nInstructions:\n- Classify the investor into a clear risk category (Low, Medium, High)\n- Align the strategy with BOTH client risk appetite AND market conditions\n- Be practical and realistic (like a real financial advisor)\n- Keep the output concise but insightful\n\nReturn your response in the following JSON-friendly format:\n\nInvestor Profile: [2\u20133 line summary of the client]\nRisk Category: [Low/Medium/High]\nSuggested Approach: [Personalized investment strategy considering market trend]\nPortfolio Allocation: [Equity %, Debt %, Gold %]\nMarket Insight: [1-line explanation of current market condition]",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 1.8
    },
    {
      "id": "1d9a9359-14e0-4a86-b353-2b87d2f03f35",
      "name": "Profile Data Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "onError": "continueRegularOutput",
      "position": [
        720,
        464
      ],
      "parameters": {
        "autoFix": true,
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"Investor Profile\": {\n      \"type\": \"string\"\n    },\n    \"Risk Category\": {\n      \"type\": \"string\"\n    },\n    \"Suggested Approach\": {\n      \"type\": \"string\"\n    },\n    \"Portfolio Allocation\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"Equity\": { \"type\": \"string\" },\n        \"Debt\": { \"type\": \"string\" },\n        \"Gold\": { \"type\": \"string\" }\n      }\n    },\n    \"Market Insight\": {\n      \"type\": \"string\"\n    }\n  }\n}"
      },
      "retryOnFail": true,
      "typeVersion": 1.3
    },
    {
      "id": "7607fba0-75c2-45a0-ab1c-73a02cce27ee",
      "name": "Prepare CRM Mapping",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2464ffb0-5ad6-487d-896b-2ccce4e879d8",
              "name": "Timestamp",
              "type": "string",
              "value": "={{ $('New Onboarding Submission').item.json.Timestamp }}"
            },
            {
              "id": "e929d824-64df-4884-b902-0b52e55ec9fc",
              "name": "Name",
              "type": "string",
              "value": "={{ $('New Onboarding Submission').item.json.Name }}"
            },
            {
              "id": "8cc7eb62-af62-409c-bd0a-b872ee2c4582",
              "name": "Age",
              "type": "number",
              "value": "={{ $('New Onboarding Submission').item.json.Age }}"
            },
            {
              "id": "4879523c-1d9b-46c8-bb77-2fe18bc0f689",
              "name": "Income",
              "type": "number",
              "value": "={{ $('New Onboarding Submission').item.json.Income }}"
            },
            {
              "id": "666b014d-b2d3-4710-a2e3-103a19695563",
              "name": "Profile Summary",
              "type": "string",
              "value": "={{ $json.output['Investor Profile'] }}"
            },
            {
              "id": "72260fb1-+1234567890cd1b0db4c5",
              "name": "Risk Category",
              "type": "string",
              "value": "={{ $json.output['Risk Category'] }}"
            },
            {
              "id": "3dfac793-d43c-4280-8e69-e3993dab4326",
              "name": "Strategy",
              "type": "string",
              "value": "={{ $json.output['Suggested Approach'] }}"
            },
            {
              "id": "277418dd-58fa-463d-89c7-f8ff821f5c7e",
              "name": "Email",
              "type": "string",
              "value": "={{ $('New Onboarding Submission').item.json.Email }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ff615a23-530a-499f-94a9-90d2ee8d8370",
      "name": "Update CRM",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1360,
        256
      ],
      "parameters": {
        "columns": {
          "value": {
            "Age": "={{ $json.Age }}",
            "Name": "={{ $json.Name }}",
            "Email": "={{ $json.Email }}",
            "Income": "={{ $json.Income }}",
            "Strategy": "={{ $json.Strategy }}",
            "Timestamp": "={{ $json.Timestamp }}",
            "Risk Category": "={{ $json[\"Risk Category\"] }}",
            "Profile Summary": "={{ $json['Profile Summary'] }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Age",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Age",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Income",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Income",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Profile Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Profile Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Risk Category",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Risk Category",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Strategy",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Strategy",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Timestamp"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15ysUfMTPzHjPxweQ3b1Po4WzVAHsSiKml8FAcDGqn8U/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "15ysUfMTPzHjPxweQ3b1Po4WzVAHsSiKml8FAcDGqn8U"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ebd47c34-04e6-486c-b5e5-5f50a70d0f2c",
      "name": "Groq (gpt-oss-120b)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        560,
        480
      ],
      "parameters": {
        "model": "openai/gpt-oss-120b",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7be37211-5f08-4e84-819c-d5182d993328",
      "name": "Send Welcome Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1632,
        176
      ],
      "parameters": {
        "sendTo": "={{ $json.Email }}",
        "message": "=<!DOCTYPE html>\n\n<html>\n  <body style=\"font-family: Arial, sans-serif; background-color: #f4f6f8; padding: 20px; margin: 0;\">\n\n```\n<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width: 600px; margin: auto; background: #ffffff; border-radius: 8px; padding: 20px;\">\n  \n  <!-- Header -->\n  <tr>\n    <td>\n      <h2 style=\"color: #2c3e50;\">Your Investment Strategy Report</h2>\n      <p>Hi {{ $json.Name }},</p>\n      <p>Thank you for completing your onboarding. Based on your profile and current market conditions, here is your personalized investment plan:</p>\n    </td>\n  </tr>\n\n  <!-- Risk Category -->\n  <tr>\n    <td>\n      <h3 style=\"color: #34495e;\">Risk Assessment</h3>\n      <p><strong>Risk Category:</strong> {{ $('Analyze Investor Profile').item.json.output['Risk Category'] }}</p>\n    </td>\n  </tr>\n\n  <!-- Strategy -->\n  <tr>\n    <td>\n      <h3 style=\"color: #34495e;\">Recommended Strategy</h3>\n      <p>{{ $('Analyze Investor Profile').item.json.output['Suggested Approach'] }}</p>\n    </td>\n  </tr>\n\n  <!-- Portfolio Allocation -->\n  <tr>\n    <td>\n      <h3 style=\"color: #34495e;\">Suggested Portfolio Allocation</h3>\n      <ul>\n        <li><strong>Equity:</strong> {{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Equity }}</li>\n        <li><strong>Debt:</strong>{{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Debt }}</li>\n        <li><strong>Gold:</strong> {{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Gold }}</li>\n      </ul>\n    </td>\n  </tr>\n\n  <!-- Market Insight -->\n  <tr>\n    <td>\n      <h3 style=\"color: #34495e;\">Market Insight</h3>\n      <p>{{ $('Analyze Investor Profile').item.json.output['Market Insight'] }}</p>\n    </td>\n  </tr>\n\n  <!-- Footer -->\n  <tr>\n    <td>\n      <p style=\"margin-top: 20px;\">\n        This strategy is tailored specifically for you. Our team will reach out shortly to help you take the next steps.\n      </p>\n\n      <p>\n        Regards,<br>\n        <strong>Your Advisory Team</strong>\n      </p>\n    </td>\n  </tr>\n\n</table>\n```\n\n  </body>\n</html>\n",
        "options": {
          "ccList": ""
        },
        "subject": "=Your Personalized Investment Strategy - {{ $json.Name }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1ddcd899-d79f-4968-a077-4c63e2ec547d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 304,
        "content": "## Trigger & Input Capture \nCapture new client onboarding data from Google Sheets in real time. Apply a limit to control workflow execution and prevent excessive API usage during high submission volumes."
      },
      "typeVersion": 1
    },
    {
      "id": "aec6a8ca-f6e9-4ffe-b791-a2f7093ebd41",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 496,
        "content": "## AI Profile Analysis & Structuring\nAnalyze client details alongside real-time market insights to generate an investor profile, risk category, personalized strategy, portfolio allocation and market outlook. Structure the response into JSON for consistent, reliable downstream processing and automation."
      },
      "typeVersion": 1
    },
    {
      "id": "c36d550d-2024-480f-8054-dbfe19886b5c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 912,
        "height": 512,
        "content": "## Data Mapping, Storage & Communication\nMap AI insights with client data, store the enriched profile in Google Sheets and trigger multi-channel communication. A personalized welcome email is sent to the client with their investment strategy, while a Slack notification alerts your team in real time about the new onboarding, ensuring visibility, faster follow-ups and a seamless client experience."
      },
      "typeVersion": 1
    },
    {
      "id": "78ea63a4-89c2-4a4d-b6a7-8e33d634d1eb",
      "name": "Rate Limit Control",
      "type": "n8n-nodes-base.limit",
      "position": [
        -608,
        256
      ],
      "parameters": {
        "keep": "lastItems"
      },
      "typeVersion": 1
    },
    {
      "id": "55f0f02e-994e-409c-aaf3-b7e9c9df0eea",
      "name": "Slack Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        1632,
        352
      ],
      "parameters": {
        "text": "=New Client Onboarded\n\nName: {{ $json.Name }}\nEmail: {{ $json.Email }}\nIncome: {{ $json.Income }}\n\nRisk Category: {{ $('Analyze Investor Profile').item.json.output['Risk Category'] }}\n\nInvestor Profile:\n{{ $('Analyze Investor Profile').item.json.output['Investor Profile'] }}\n\nStrategy:\n{{ $('Analyze Investor Profile').item.json.output['Suggested Approach'] }}\n\nMarket Insight:\n{{ $('Analyze Investor Profile').item.json.output['Market Insight'] }}\n\nPortfolio Allocation:\nEquity: {{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Equity }}\nDebt: {{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Debt }}\nGold: {{ $('Analyze Investor Profile').item.json.output['Portfolio Allocation'].Gold }}\n\nStatus: Analysis completed successfully",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AQS47TGQ0",
          "cachedResultName": "all-dropbox-note-sync"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "0515fb4b-4a5b-4e2c-a3e6-28fa49e937a3",
      "name": "New Onboarding Submission",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -784,
        256
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 154765901,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1si3ETJVqSgxCyfFvCnVgzBjWivf43y6clPxRrms39Hc/edit#gid=154765901",
          "cachedResultName": "Form Responses 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "1si3ETJVqSgxCyfFvCnVgzBjWivf43y6clPxRrms39Hc"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "a7475621-0e93-43d4-b43e-99d7d0fdea6b",
      "name": "Start Workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -976,
        256
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ebea27b5-bf23-40d4-938c-2e359cfa4f07",
      "name": "Fetch Market Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -240,
        256
      ],
      "parameters": {
        "url": "https://www.alphavantage.co/query",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "function",
              "value": "GLOBAL_QUOTE"
            },
            {
              "name": "symbol",
              "value": "RELIANCE.BSE"
            },
            {
              "name": "apikey"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "8af6b16d-e2ae-4306-bd97-2411d6c50888",
      "name": "Process Market Data",
      "type": "n8n-nodes-base.code",
      "position": [
        -32,
        256
      ],
      "parameters": {
        "jsCode": "const data = $json[\"Global Quote\"];\n\nconst price = parseFloat(data[\"05. price\"]);\nconst change = parseFloat(data[\"09. change\"]);\nconst changePercent = data[\"10. change percent\"];\n\nlet trend = \"Neutral\";\n\nif (change > 0) trend = \"Bullish\";\nif (change < 0) trend = \"Bearish\";\n\nreturn [{\n  ...$json,\n  marketPrice: price,\n  marketChange: change,\n  marketChangePercent: changePercent,\n  marketTrend: trend\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "7cbcfdd6-82c8-4ef7-8d36-de872910f894",
      "name": "Generate Market Insights",
      "type": "n8n-nodes-base.code",
      "position": [
        176,
        256
      ],
      "parameters": {
        "jsCode": "const data = $json[\"Global Quote\"];\n\nconst price = parseFloat(data[\"05. price\"]);\nconst change = parseFloat(data[\"09. change\"]);\nconst changePercent = parseFloat(data[\"10. change percent\"]);\n\nlet trend = \"Neutral\";\nif (change > 0) trend = \"Bullish\";\nif (change < 0) trend = \"Bearish\";\n\n// Volatility\nlet volatility = \"Low\";\nif (Math.abs(changePercent) > 1) volatility = \"High\";\nelse if (Math.abs(changePercent) > 0.5) volatility = \"Medium\";\n\n// Strategy + Allocation\nlet strategy = \"\";\nlet allocation = {};\n\nif (trend === \"Bullish\" && volatility === \"Low\") {\n  strategy = \"Stable growth investing\";\n  allocation = { Equity: \"70%\", Debt: \"20%\", Gold: \"10%\" };\n} else if (trend === \"Bullish\" && volatility === \"High\") {\n  strategy = \"Aggressive growth investing\";\n  allocation = { Equity: \"80%\", Debt: \"10%\", Gold: \"10%\" };\n} else if (trend === \"Bearish\") {\n  strategy = \"Defensive investing (capital protection)\";\n  allocation = { Equity: \"40%\", Debt: \"40%\", Gold: \"20%\" };\n} else {\n  strategy = \"Balanced investing\";\n  allocation = { Equity: \"60%\", Debt: \"30%\", Gold: \"10%\" };\n}\n\nreturn [{\n  ...$json,\n  marketPrice: price,\n  marketChange: change,\n  marketChangePercent: changePercent + \"%\",\n  marketTrend: trend,\n  volatility,\n  recommendedStrategy: strategy,\n  allocation\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "c73da9f1-a57c-4bc7-8ec6-338b2ac5bd9c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 304,
        "content": "## Market Data Enrichment & Intelligence\nFetch real-time market data via API, process and normalize key values, then generate actionable insights such as trend, volatility and strategy. This ensures every client recommendation is context-aware and aligned with current market conditions."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "177f7c67-7aaa-4cc8-96dd-77ff45d6a098",
  "connections": {
    "Update CRM": {
      "main": [
        [
          {
            "node": "Send Welcome Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Workflow": {
      "main": [
        [
          {
            "node": "New Onboarding Submission",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Market Data": {
      "main": [
        [
          {
            "node": "Process Market Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rate Limit Control": {
      "main": [
        [
          {
            "node": "Fetch Market Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Welcome Email": {
      "main": [
        []
      ]
    },
    "Groq (gpt-oss-120b)": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze Investor Profile",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Profile Data Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Prepare CRM Mapping": {
      "main": [
        [
          {
            "node": "Update CRM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Market Data": {
      "main": [
        [
          {
            "node": "Generate Market Insights",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Profile Data Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze Investor Profile",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Analyze Investor Profile": {
      "main": [
        [
          {
            "node": "Prepare CRM Mapping",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Market Insights": {
      "main": [
        [
          {
            "node": "Analyze Investor Profile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Onboarding Submission": {
      "main": [
        [
          {
            "node": "Rate Limit Control",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}