AutomationFlowsAI & RAG › Mine User Complaints and Generate Insight Reports with Olostep, Gemini and…

Mine User Complaints and Generate Insight Reports with Olostep, Gemini and…

Original n8n title: Mine User Complaints and Generate Insight Reports with Olostep, Gemini and Google Docs

ByYasser Sami @yassersami on n8n.io

This n8n template automates complaint mining from unstructured text sources and turns raw user feedback into clear, actionable insights. It uses AI to identify recurring complaints, pain points, and themes, helping teams understand what users are unhappy about and why. Product…

Event trigger★★★★★ complexityAI-powered38 nodesOutput Parser StructuredChain LlmGoogle Gemini ChatAgentInformation ExtractorForm TriggerHTTP Request ToolGoogle Docs
AI & RAG Trigger: Event Nodes: 38 Complexity: ★★★★★ AI nodes: yes Added:
Mine User Complaints and Generate Insight Reports with Olostep, Gemini and… — n8n workflow card showing Output Parser Structured, Chain Llm, Google Gemini Chat integration

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

This workflow follows the Agent → Chainllm 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": "bxXk728I3eSAUiLo",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Complaint Mining",
  "tags": [
    {
      "id": "xRJNyiRIpAsEzL8y",
      "name": "Olostep",
      "createdAt": "2026-01-31T11:17:46.807Z",
      "updatedAt": "2026-01-31T11:17:46.807Z"
    }
  ],
  "nodes": [
    {
      "id": "382b9a6f-3294-4c21-ae76-e3a7290431d0",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        272,
        80
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"findings\": [\n    {\n      \"verbatim_quote\": \"I've been a user for 5 years. Great app, but I noticed a small bug where the dark mode doesn't work correctly after the last update.\",\n      \"url\": \"https://reddit.com/r/notetakingapps/comments/xxxxxx/bug_report_productivenote/\",\n      \"source_title\": \"Reddit r/saas\"\n    },\n    {\n      \"verbatim_quote\": \"I've been trying to export my data for three hours and the feature is completely broken. This is a nightmare.\",\n      \"url\": \"https://g2.com/reviews/productivenote-2024\",\n      \"source_title\": \"G2 Reviews\"\n    },\n    {\n      \"verbatim_quote\": \"The new UI is a bit confusing to navigate. It's clunky and I wish it had a simpler search function. Still, a solid app overall.\",\n      \"url\": \"https://twitter.com/johndoe/status/xxxxxx\",\n      \"source_title\": \"Twitter\"\n    }\n  ]\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c1a279fb-6640-4b42-aaa5-2f650c07dd94",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1344,
        -16
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "91a69753-ebd6-442f-851d-04500d4eb289",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        496,
        -128
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.findings"
      },
      "typeVersion": 1
    },
    {
      "id": "f9b76f3f-07f3-4f75-9e68-376fc23d0b4a",
      "name": "Pain Level Identifier",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "maxTries": 2,
      "position": [
        672,
        -128
      ],
      "parameters": {
        "text": "=list of verbatim quotes: {{ $json.verbatim_quote }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=#Overview\n\nYou are a complaint mining agent. Your job is to analyze verbatim user feedback and classify the pain level expressed in each quote.\n\n##Pain Level Rubric:\n\n  -High: The quote expresses extreme frustration, anger, or mentions a significant roadblock. Keywords often include: frustrating, impossible, broken, can't, stuck, terrible, waste of time, nightmare. The user is prevented from completing a key task or describes the problem as a deal-breaker.\n  -Medium: The quote expresses annoyance or inconvenience. Keywords often include: annoying, difficult, clunky, wish it had, could be better, confusing. The problem is a point of friction but does not prevent them from using the product.\n  -Low: The quote expresses a minor issue, a simple suggestion, or a cosmetic complaint. The tone is neutral or polite. Keywords often include: minor bug, small, little, suggest, would be nice to have. The problem is not essential to the core function of the product.\n\n##instructions\n\n-Carefully read and analyze the user_quote.\n-Using only the criteria in the pain_level_rubric, determine the pain level expressed in the quote.\n-Do not use any external knowledge. Base your decision solely on the keywords, emotional cues, and expressed impact in the provided quote.\n\n##Output Format\nThe output must be one of the following exact words: \"High\", \"Medium\", or \"Low\". Do not include any other text or explanation in the final output."
            }
          ]
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 1.7
    },
    {
      "id": "1b90c03d-54b6-48a2-85a1-2067e3515a17",
      "name": "Google Gemini Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        528,
        800
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "fd77a21c-6da5-4dbc-a8ea-3b81588afa30",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        160,
        656
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"problem_statement\": \"SaaS founders struggle with validation stage\",\n  \"keywords\": [\n    {\n      \"keyword\": \"Difficulty validating/struggle with idea validation\",\n      \"mentions\": 20\n    },\n    {\n      \"keyword\": \"No Market Demand/problem not big enough/customers don't care\",\n      \"mentions\": 12\n    },\n    {\n      \"keyword\": \"Time constraints/obstacles (time)\",\n      \"mentions\": 10\n    },\n    {\n      \"keyword\": \"Hard to get information/data\",\n      \"mentions\": 8\n    },\n    {\n      \"keyword\": \"Hard to interpret information/data\",\n      \"mentions\": 8\n    },\n    {\n      \"keyword\": \"Lack of technical/design resources/skills/team for prototypes\",\n      \"mentions\": 8\n    },\n    {\n      \"keyword\": \"Difficulty getting clear feedback/effectively communicate vision\",\n      \"mentions\": 8\n    }\n  ],\n  \"total_mentions\": 280\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "02b9e9f1-20ee-46d9-8eb5-6eb1eaf882e3",
      "name": "Keyword Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        0,
        448
      ],
      "parameters": {
        "text": "=Problem Statement or Keywords: {{ $json['Problem Statement or Keywords'] }}",
        "options": {
          "systemMessage": "=#Overview\n\nYou are a specialized search and complaint mining expert. Your input should be a problem statement or keywords. Your job is to search relevant platforms like Reddit, Hacker News and specialized forums to find real complaints about the problem space. You do not analyze or summarize the information. You only find and collect it.\n\n##Instructions\n\n-Generate a list of the most effective search queries to find user feedback and complaints about the given product. Think about how a real user would phrase a search to find this information.\n-Perform a search for each query.\n-For each result, extract the most frequently mentioned keywords and a simple count of how many times a specific problem was mentioned.\n-You should also analyse and calculate the total mentions found for the problem provided in the input.\n\n##Final Notes\n\nYou must search for at least 3-5 queries.\nYou should do all the search first then extract the required output.\nhere's the current date: {{ $now }}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "daedbee0-11c3-46bd-9ffb-8bdc25017c86",
      "name": "Verbatim Quotes Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "maxTries": 2,
      "position": [
        0,
        -128
      ],
      "parameters": {
        "text": "=Problem Statement Or Keywords: {{ $json['Problem Statement or Keywords'] }}",
        "options": {
          "systemMessage": "=#Overview\n\nYou are a specialized search and complaint mining expert. Your input should be a problem statement or keywords. Your job is to search relevant platforms like Reddit, Hacker News and specialized forums to find real complaints about the problem space. You do not analyze or summarize the information. You only find and collect it.\n\n\n##Instructions\n\n-Generate a list of the most effective search queries to find user feedback and complaints about the given product. Think about how a real user would phrase a search to find this information.\n-Perform a search for each query.\n-For each result, extract a relevant snippet of user verbatim quote. This can be a full comment, a review, or a short post.\n-For each extracted snippet, you must also capture the URL and title of the source.\n-You must search for real user complaint not just blogs content and news. You should be searching in forums like:\n  .Reddit Search: Use the site:reddit.com operator.\n  .Review Site Search: Include specific review site names like G2 or Capterra.\n  .Forum Search: Include forum-specific phrases like \"forum\" or \"community\" in your queries.\n-Do not analyse or summarize the data. You just collect it.\n\n##Priority\n\n    -Highest Priority: Direct quotes from real users expressing an opinion, a frustration, or a specific experience. Look for these on forums, social media, and review sites.\n    -Lowest Priority: Articles, blog posts, or reports that talk about a problem in a general or abstract sense. Only use these if they contain a direct quote from a user or a specific, verifiable statistic.\n\n##Final Notes\n\nYou must output at least 10 items.\nYou should do all the search first then extract the required output.\nYou must search for at least 3-5 queries.\nthe source title should not be a full title, just the source title like \"Reddit r/saas\" or whatever the source is.\nhere's the current date: {{ $now }}\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 2.2
    },
    {
      "id": "e5a92ecf-6fe2-4af9-9846-2d0434cfb7d9",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        752,
        432
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "70a189b9-a2bb-4ee6-9986-66faef7178b6",
      "name": "Split Out1",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        512,
        448
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.keywords"
      },
      "typeVersion": 1
    },
    {
      "id": "43e924a9-23cf-4ebd-b492-44e55c17432e",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        944,
        432
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "verbatim_quote"
            },
            {
              "fieldToAggregate": "source_title"
            },
            {
              "fieldToAggregate": "keyword"
            },
            {
              "fieldToAggregate": "mentions"
            },
            {
              "fieldToAggregate": "pain-level"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "fdcad28b-9668-4e1f-8369-eb0d533d7a25",
      "name": "Merge2",
      "type": "n8n-nodes-base.merge",
      "position": [
        2016,
        416
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition",
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "c71cef0e-bece-4f50-bdd3-df662070ab30",
      "name": "Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        1488,
        208
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {},
        "attributes": {
          "attributes": [
            {
              "name": "express frustration",
              "required": true,
              "description": "this should be a percantage of the frustration expression"
            },
            {
              "name": "demand signal",
              "required": true,
              "description": "this should be the demand signal for the problem"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c84fa8ad-4931-46e8-862c-d4fc5508288c",
      "name": "Merge3",
      "type": "n8n-nodes-base.merge",
      "position": [
        1808,
        320
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "16c39465-8d14-433f-909b-518965adcf65",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -256,
        48
      ],
      "parameters": {
        "options": {},
        "formTitle": "Mine Complaint",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Problem Statement or Keywords",
              "requiredField": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "bc824caf-6fcf-415e-85ea-296d37d0bb84",
      "name": "olostep",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        96,
        176
      ],
      "parameters": {
        "url": "https://api.olostep.com/v1/answers",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', `this is the search query field`, 'string') }}"
            }
          ]
        },
        "toolDescription": "Makes an HTTP request for research and real-time data collection, and returns the response data.",
        "nodeCredentialType": "olostepScrapeApi"
      },
      "credentials": {
        "olostepScrapeApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "df6b9bce-6b71-40f7-bcc6-137483654115",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        320,
        -128
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "cf001578-ecc6-458d-bd3d-6b28222e52d8",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        992,
        -128
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "eb6fd158-4c08-48bf-bbc4-5007cf162af4",
      "name": "Wait2",
      "type": "n8n-nodes-base.wait",
      "position": [
        320,
        448
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "978698f2-0001-4df2-9daa-f299977d11e8",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2208,
        432
      ],
      "parameters": {
        "text": "=Express Frustration: {{ $json.output['express frustration'] }}\nDemand Signal: {{ $json.output['demand signal'] }}\nAnalysis: {{ $json.text }}\nVerbatim Quotes: {{ $json.verbatim_quote }}\nVerbatim Quotes Pain Level: {{ $json['pain-level'] }}\nSource Titles: {{ $json.source_title }}\nKeywords: {{ $json.keyword }}\nKeywords Mentions: {{ $json.mentions }}",
        "options": {
          "systemMessage": "=# Overview\nYou are an expert doc writer, your role is to structure and write the final report without changing any of the information provided.\n\n## Instructions\n- Do Not change any of the incoming information or come up with new information.\n- Do Not summarize anything, just put the data in it's write place.\n- Your output must be in markdown."
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "9c8a5dfd-b06f-4704-8895-54442ac383d3",
      "name": "Create a document",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        2560,
        432
      ],
      "parameters": {
        "title": "=Complaint Mining Report For: {{ $('On form submission').item.json['Problem Statement or Keywords'] }}",
        "folderId": "default"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6e3b0d11-a12c-45d4-b262-0c20d5de1660",
      "name": "Update a document",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        2768,
        432
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $('AI Agent').item.json.output }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d0f51c94-043e-4760-8587-c35d2c48c8ab",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        -576
      ],
      "parameters": {
        "width": 832,
        "height": 1664,
        "content": "# AI Complaint Mining & Insight Extraction  \n\nThis n8n template automates **complaint mining** from unstructured text sources and turns raw user feedback into **clear, actionable insights**.  \nIt uses AI to identify recurring complaints, pain points, and themes, helping teams understand what users are unhappy about and why.\n\n## Who\u2019s it for  \n- Product managers identifying recurring user pain points  \n- Customer support and success teams  \n- Founders validating product-market fit issues  \n- UX researchers analyzing qualitative feedback  \n- Anyone dealing with large volumes of complaints or negative feedback  \n\n## How it works / What it does  \n1. **Trigger**  \n   - The workflow starts with a manual trigger, form submission, or imported text source containing user complaints.\n\n2. **Data Preparation**  \n   - Raw complaint text is cleaned, normalized, and split into individual complaint entries.  \n   - Ensures consistent input for AI processing.\n\n3. **AI Complaint Analysis**  \n   - An AI model analyzes each complaint to identify:  \n     - Core issue  \n     - Complaint category  \n     - Emotional tone  \n     - Severity or urgency  \n\n4. **Pattern Detection**  \n   - Complaints are grouped by similarity to uncover recurring issues and themes.  \n   - Highlights the most frequent and impactful problems.\n\n5. **Insight Extraction**  \n   - AI summarizes key insights such as:  \n     - Top recurring complaints  \n     - Root causes  \n     - Suggested improvement areas  \n\n6. **Structured Output**  \n   - Results are converted into structured data fields.  \n   - Ready to be stored, visualized, or shared with stakeholders.\n\n7. **Storage & Reporting**  \n   - Extracted complaints and insights are saved to a table or sheet for easy review and analysis.\n\nThis workflow transforms unstructured complaint data into a clear feedback loop you can act on.\n\n## How to set up  \n1. Import the template into your n8n workspace.  \n2. Connect your AI model credentials (OpenAI or Gemini).  \n3. Define your input source (text, form, or file).  \n4. Connect your storage destination (Google Sheets, Data Table, or database).  \n5. Run the workflow to start mining complaints automatically.\n\n## Requirements  \n- n8n account (cloud or self-hosted)  \n- AI model provider (OpenAI or Gemini)  \n- Storage destination (Google Sheets, Data Table, or database)\n\n## How to customize the workflow  \n- Adjust complaint categories and severity scoring.  \n- Add sentiment analysis or emotion classification.  \n- Connect a vector database to track complaints over time.  \n- Trigger alerts when critical issues are detected.  \n- Generate dashboards or weekly complaint summaries automatically.\n\n---\n\n\ud83d\udc49 This template helps you turn complaints into insights \u2014 and insights into product improvements.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "730f37f2-fd29-40da-885f-d63d24a5fb30",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 224,
        "content": "## Trigger\nStart the workflow with user feedback or complaint text."
      },
      "typeVersion": 1
    },
    {
      "id": "610c9a8d-869c-4661-a493-d4b5d4ba3ab8",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 272,
        "content": "## Verbatim Quotes Agent\nUses Olostep /answer endpoint as a tool to searches for complaints about the problem statement/keywords directly from the mouth of potential customers from forums like Reddit, Hacker news, and other specialized forums."
      },
      "typeVersion": 1
    },
    {
      "id": "54af0218-e461-4f77-bcdb-809e3d337153",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 272,
        "content": "## Pain Level Identifier\nTakes the raw verbatim quotes and identifies if this quote defines a high, medium, or low pain."
      },
      "typeVersion": 1
    },
    {
      "id": "0ae1e91f-0415-4c9e-ad31-ed89a2e21897",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 288,
        "content": "## Verbatim Quotes Agent\nUses Olostep /answer endpoint as a tool to searches for relevant keywords about the problem and defines how many times those keywords have been mentioned."
      },
      "typeVersion": 1
    },
    {
      "id": "85c8976d-b1b7-44b1-8f3d-ae66ed7afa1e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        720
      ],
      "parameters": {
        "color": 5,
        "height": 224,
        "content": "## LLM Model\n"
      },
      "typeVersion": 1
    },
    {
      "id": "97cf245c-8951-4df1-8bf4-adfad50486e8",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        112
      ],
      "parameters": {
        "color": 5,
        "height": 208,
        "content": "## Olostep /answer enpoint"
      },
      "typeVersion": 1
    },
    {
      "id": "57aa1136-3c30-4c4f-9155-99c620b56b0e",
      "name": "pain level",
      "type": "n8n-nodes-base.set",
      "position": [
        1168,
        -128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "93dfa8cf-cf63-41be-b175-b7d6cdfab92f",
              "name": "pain-level",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "91d1d786-9540-45fa-b21d-2abcef24d292",
      "name": "total mentions",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        608
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "df556ba1-fc3e-438b-b9c8-f3aeb1f6069e",
              "name": "total-mentions",
              "type": "string",
              "value": "={{ $json.output.total_mentions }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "7ed54c62-a4ce-4b19-a2c9-be312d5c3f13",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 448,
        "height": 288,
        "content": "## Merge & Aggregate\nClean and prepare data for Analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "2a43f8ec-3f25-4d75-83c9-62ac7d4cf23a",
      "name": "Analyzer Agent",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1152,
        336
      ],
      "parameters": {
        "text": "=the problem statement: {{ $('On form submission').item.json['Problem Statement or Keywords'] }}\nlist of verbatim quotes: {{ $json.verbatim_quote }}\nsource_title: {{ $json.source_title }}\nkeywords: {{ $json.keyword }}\nnumber of mentions of every keyword (in order): {{ $json.mentions }}\ntotal mentions: {{ $('Keyword Agent').item.json.output.total_mentions }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=#Overview\n\nYou are a data analysis specialist and expert. Your role is to analyze all the input data and show if the problem has a \"high demand signal\", \"medium demand signal\" or \"low demand signal\". Also provide key insights like the express frustration percantage and other valuable key insights."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "0b04de45-5c2a-4f69-9950-89fb29c248dc",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 464,
        "content": "## Analyzer Agent\nTakes the raw data and analyze it and determines if the problem has a high, medium, or low signal.\nAlso provides key insights like the express frustration percantage and other valuable key insights."
      },
      "typeVersion": 1
    },
    {
      "id": "858cdff9-4a16-4eb1-be65-3507abe0cb25",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 528,
        "content": "## Information Extractor\nExtracts the frustration percentage and the demand signal from the analysis provided by the analyzer agent."
      },
      "typeVersion": 1
    },
    {
      "id": "d6cf5101-deb4-496c-8977-995e14166b21",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1792,
        208
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 416,
        "content": "## Merge\nMerge all previous data and prepare it for the final report writing agent."
      },
      "typeVersion": 1
    },
    {
      "id": "bb7f739f-6c86-4d43-ba93-cd2133a969ac",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        304
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 320,
        "content": "## Writing agent\nWrites the final report gathering all the information and insights from previous steps, and structure it in a good format."
      },
      "typeVersion": 1
    },
    {
      "id": "9834e191-4099-4f50-ba76-8764c8d396c6",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2496,
        304
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 320,
        "content": "## Document creation\nCreates a new document and write the content of the final report into it."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e5e6f3fa-8ba1-47bf-8faa-937640904517",
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "pain level",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait2": {
      "main": [
        [
          {
            "node": "Split Out1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge2": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge3": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "olostep": {
      "ai_tool": [
        [
          {
            "node": "Verbatim Quotes Agent",
            "type": "ai_tool",
            "index": 0
          },
          {
            "node": "Keyword Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Create a document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Analyzer Agent",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Pain Level Identifier",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Split Out1": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "pain level": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keyword Agent": {
      "main": [
        [
          {
            "node": "total mentions",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzer Agent": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "total mentions": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Create a document": {
      "main": [
        [
          {
            "node": "Update a document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Verbatim Quotes Agent",
            "type": "main",
            "index": 0
          },
          {
            "node": "Keyword Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pain Level Identifier": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verbatim Quotes Agent": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Verbatim Quotes Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Verbatim Quotes Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Keyword Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Pain Level Identifier",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Analyzer Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Keyword Agent",
            "type": "ai_outputParser",
            "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 n8n template automates complaint mining from unstructured text sources and turns raw user feedback into clear, actionable insights. It uses AI to identify recurring complaints, pain points, and themes, helping teams understand what users are unhappy about and why. Product…

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

This is an automated blog post generation system that: Researches topics using AI agents and web search tools Writes complete blog posts with proper SEO structure Generates custom images for each post

Output Parser Structured, Google Gemini Chat, HTTP Request Tool +11
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7
AI & RAG

Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses outputParserStructured, chainLlm, googleDrive, stickyNote. Webhook trigger; 67 nodes.

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

Candidate Engagement | Resume Screening | AI Voice Interviews | Applicant Insights

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

Streamline your recruitment process with AI-powered resume analysis that goes beyond keyword matching.

Form Trigger, Google Drive, Google Gemini Chat +7