AutomationFlowsAI & RAG › Ai-powered Customer Feedback Analysis & Routing for Gmail, Zendesk, Slack &…

Ai-powered Customer Feedback Analysis & Routing for Gmail, Zendesk, Slack &…

Original n8n title: Ai-powered Customer Feedback Analysis & Routing for Gmail, Zendesk, Slack & Pipedrive

ByPollupAI @Pollup on n8n.io

This workflow is for Customer Success, Product, and Support teams who need to centralize and analyze unstructured customer feedback. It automates the process of identifying key themes from various communication channels, allowing you to proactively address issues, track feature…

Event trigger★★★★☆ complexityAI-powered23 nodesOpenAI ChatMemory Buffer WindowAgentOutput Parser StructuredGmail ToolPipedrive ToolZendesk ToolSlack Tool
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9782 — 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
{
  "nodes": [
    {
      "id": "60256706-eabb-4ff1-abf0-78b5a9ca0869",
      "name": "Manual Trigger: Start VOC Analysis",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        48,
        368
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "be859333-a941-4a71-951f-eeb6adcd0e4f",
      "name": "Set: Initial Parameters",
      "type": "n8n-nodes-base.set",
      "position": [
        320,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d69bdbe2-f51a-4956-9d5d-bfe3a82ec82d",
              "name": "CSM email",
              "type": "string",
              "value": "user@example.com"
            },
            {
              "id": "3efe4a59-2983-4f07-8e5c-130a5aad6fdb",
              "name": "slack_billing_channel",
              "type": "string",
              "value": "#billing-feedback"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c263ec19-9bdb-46fb-afde-4a17da961d3c",
      "name": "Config: Set LLM for Agents",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1552,
        928
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {
          "temperature": 0
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "bf4488bd-0e20-4827-b370-77396415f7c8",
      "name": "Config: Set Agent Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        432,
        592
      ],
      "parameters": {
        "sessionKey": "1",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8f128774-c198-4a13-8d19-8cf5ac19c8b8",
      "name": "AI Agent: Gather Customer Feedback",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        736,
        368
      ],
      "parameters": {
        "text": "=- Get **ALL** the mails sent after {{Date.now() - 7 * 24 * 60 * 60 * 1000}} from the user {{ $('Set: Initial Parameters').item.json['CSM email'] }}. Return only the Subject and the snippet.\n- Get **ALL** the messages from Slack return the user ID as customerId.\n- Get **ALL** the notes from Pipedrive. Use person_id as the customerId\n- Get **ALL** the tickets from Zendesk. Use requester_id as customerId",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "6b70f528-bd39-4758-9d04-6b3ff93af6ff",
      "name": "AI: Structure Feedback Data",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1184,
        592
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "\n  [{\n  \"source\": \"Zendesk | Gmail | Slack | Pipedrive\",\n  \"customerId\": \"...\",\n  \"messageId\": \"\",\n  \"subject\": \"...\",\n  \"text\": \"...\"\n}]\n\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "7c5791aa-2842-47af-818b-004af9685455",
      "name": "Tool: Get Gmail Messages",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        576,
        592
      ],
      "parameters": {
        "filters": {
          "sender": "=",
          "receivedAfter": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Received_After', ``, 'string') }}"
        },
        "operation": "getAll",
        "returnAll": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Return_All', ``, 'boolean') }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "fbca39a8-6593-4cdb-a582-3bb81d18cb3a",
      "name": "Tool: Get Pipedrive Notes",
      "type": "n8n-nodes-base.pipedriveTool",
      "position": [
        736,
        592
      ],
      "parameters": {
        "resource": "note",
        "operation": "getAll",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "a833e7b4-6510-44a5-934a-9d3b46289717",
      "name": "Tool: Get Zendesk Tickets",
      "type": "n8n-nodes-base.zendeskTool",
      "position": [
        880,
        592
      ],
      "parameters": {
        "options": {},
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "28a49bba-62fa-4896-8604-098903b84450",
      "name": "Tool: Search Slack Messages  Export to Sheets",
      "type": "n8n-nodes-base.slackTool",
      "position": [
        1024,
        592
      ],
      "parameters": {
        "query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Search_Query', ``, 'string') }}",
        "options": {
          "searchChannel": ""
        },
        "operation": "search",
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    },
    {
      "id": "b9212f35-c028-481e-908b-12aa3324ac25",
      "name": "AI Chain: Extract Key Signals",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1552,
        368
      ],
      "parameters": {
        "text": "=Prompt:\nYou are analyzing raw customer feedback from multiple sources (Gmail, Slack, Pipedrive, Zendesk).\nYour task: compress the \"text\" of each feedback into a concise signal (1\u20132 sentences max) that captures the core issue, request, or sentiment without losing meaning.\n\nRules:\n\t\u2022\tStrip away greetings, signatures, and filler.\n\t\u2022\tKeep specific product terms, error codes, or feature names if present.\n\t\u2022\tNeutral, factual tone (don\u2019t add assumptions).\n\t\u2022\tIf the text is vague, summarize it at the same level of vagueness.\n\t\u2022\tOutput only the summary text, no extra commentary.\n\nExample:\n\t\u2022\tInput: \u201cHi team, I\u2019ve tried three times to update my billing info but the system keeps failing with error 502. Can someone help?\u201d\n\t\u2022\tOutput: Customer unable to update billing info due to repeated error 502. \n\nHere is the content:\n{{ JSON.stringify($json.output) }}",
        "batching": {
          "batchSize": 5
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "7ec417ac-bc65-4c9e-a1f7-dc3d295403e0",
      "name": "AI: Structure Key Signals",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1696,
        592
      ],
      "parameters": {
        "jsonSchemaExample": "[\n\t{\"original_text\": \"\",\n\t\"signals\": [\"\", \"\"]\n}]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "09797f66-2ce6-4392-afb4-a646ba733799",
      "name": "AI Chain: Cluster Signals into Topics",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1904,
        368
      ],
      "parameters": {
        "text": "=Prompt:\nYou will receive a set of short customer feedback signals.\nYour task: group them by shared topic or problem and assign each group a clear, human-readable label.\n\nRules:\n\t\u2022\tLabels should be broad enough to cover all items in the group, but still actionable (e.g. Billing, Onboarding, Performance, Feature Requests).\n\t\u2022\tAvoid vague labels like General Feedback unless no pattern exists.\n\t\u2022\tEach cluster must include:\n\t\u2022\tLabel\n\t\u2022\tCount of items\n\t\u2022\tRepresentative examples (1\u20133 feedback snippets).\n\n {{ JSON.stringify($json.output) }}",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "d31b8993-f7c4-496f-9515-ae2e39e84f17",
      "name": "AI: Structure Clustered Topics  Export to Sheets",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2048,
        592
      ],
      "parameters": {
        "jsonSchemaExample": "[\n  {\n    \"label\": \"Billing\",\n    \"count\": 8,\n    \"examples\": [\n      \"Unable to update billing info due to error 502\",\n      \"Invoice shows wrong amount\"\n    ]\n  }\n]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "b26017dd-99f0-4033-9fb4-cfcf3be03c14",
      "name": "AI Agent: Route Topics to Actions",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2320,
        368
      ],
      "parameters": {
        "text": "=Prompt:\nYou will receive a list of feedback clusters, each with a label, count, and examples.\nFirst you will send the processed input to \"{{ $('Set: Initial Parameters').item.json['CSM email'] }}\" with the subject \"Weekly digest\"\nYour task: decide the correct destination action for each cluster based on the label and the count if it is superior to 1. Each message will have the examples in it.\n\n## Routing Rules:\n### Performance / Feature gaps \u2192 Product\n    - Create a zendesk ticket with the label as the title and the examples as the description\n### Billing / Contract issues \u2192 Finance or Sales Ops\n  - Post message to Slack channel {{ $('Set: Initial Parameters').item.json.slack_billing_channel }} with the examples as the text\n### Onboarding / Training \u2192 CS Enablement\n  - Create Notion task with the label as the title and the examples as the content\n### High-risk sentiment / VIP account \u2192 CS Manager\n  - Send direct email to cs Manager \"{{ $('Set: Initial Parameters').item.json['CSM email'] }}\" with tzhe subject \"Problem with the software\" and the examples as the text\n### Sales and customer engagement\n  -  Send direct email to cs Manager \"{{ $('Set: Initial Parameters').item.json['CSM email'] }}\" with the subject \"Customer engagement\" and the examples as the text\n\n### Client Management and Proposals\n    -  Send direct email to cs Manager \"{{ $('Set: Initial Parameters').item.json['CSM email'] }}\" with the subject \"Client Management and Proposals\" with the examples as the text\n  \nIf the cluster doesn\u2019t fit above, mark as \"unassigned\" but keep it in the output.\nThe input:\n {{ JSON.stringify($json.output) }}",
        "options": {},
        "promptType": "=define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "ebefbd63-8ea6-49e3-be48-4aaf1b4f7011",
      "name": "Tool: Create Zendesk Ticket",
      "type": "n8n-nodes-base.zendeskTool",
      "position": [
        2320,
        592
      ],
      "parameters": {
        "description": "Ticket generated by n8n",
        "jsonParameters": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('JSON_Parameters', ``, 'boolean') }}",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "2b0c3dc2-cf60-4d2b-8127-4141d34e7bee",
      "name": "Tool: Send Email Alert",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        2464,
        592
      ],
      "parameters": {
        "sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('To', ``, 'string') }}",
        "message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
        "options": {},
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "b47fc28d-72f5-42f9-a661-254a392ae443",
      "name": "Tool: Create Notion Page",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        2608,
        592
      ],
      "parameters": {
        "title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
        "simple": false,
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Content|rich_text",
              "textContent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('propertyValues0_Text', ``, 'string') }}"
            }
          ]
        }
      },
      "notesInFlow": false,
      "typeVersion": 2.2
    },
    {
      "id": "fdac92b0-5b36-4fdc-a384-93c2d6c20cc6",
      "name": "Note: Data Gathering",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        176
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 128,
        "content": "### Data Gathering Agent\nThis AI Agent's job is to collect all recent customer interactions.\nIt uses its tools (Gmail, Pipedrive, Zendesk, Slack) to fetch the raw data based on the initial prompt."
      },
      "typeVersion": 1
    },
    {
      "id": "ab1edac7-c359-433a-bad5-70c876d9cfb1",
      "name": "Note: Analysis Chain",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 476,
        "height": 152,
        "content": "### AI Analysis Chain\nThis chain processes the raw data in two steps:\n1.  **Signal Extraction:** The first LLM Chain reads all the raw text and compresses it into concise 'signals'.\n2.  **Clustering:** The second LLM Chain takes these signals and groups them into actionable topics (e.g., 'Billing', 'Performance')."
      },
      "typeVersion": 1
    },
    {
      "id": "0e500b93-135e-4a03-91e8-2159cc58718b",
      "name": "Note: Action Agent",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2224,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 412,
        "height": 152,
        "content": "### Action & Routing Agent\nThis final AI Agent acts as a dispatcher. It analyzes the clustered topics and follows a set of 'Routing Rules' in its prompt to decide which action to take.\nIt then uses its tools to send the information to the correct destination (Zendesk, Slack, Notion, or Email)."
      },
      "typeVersion": 1
    },
    {
      "id": "0642f4ae-f111-4446-9e9a-c9bb0c1e609c",
      "name": "Workflow Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        16,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 980,
        "height": 392,
        "content": "### **Voice of Customer AI Analysis & Routing**\nThis workflow automates the process of gathering customer feedback from multiple sources, using a chain of AI agents to analyze, summarize, and categorize it, and finally routing the insights to the appropriate teams for action.\n\n**How it Works:**\n1.  **Gathers Data:** An AI Agent uses tools to collect recent messages from Gmail, Pipedrive, Zendesk, and Slack.\n2.  **Analyzes & Summarizes:** An AI Chain processes the raw text, first extracting key 'signals' and then clustering those signals into topics (e.g., 'Billing', 'Feature Request').\n3.  **Routes for Action:** A final AI Agent analyzes the topics and uses tools to create Zendesk tickets, send Slack messages, create Notion pages, or send email alerts based on a set of rules.\n\n### \ud83d\ude80 **How to Set Up**\n1.  **Configure Credentials:** Add your credentials for all the 'Tool' nodes and the `Config: Set LLM for Agents` node.\n2.  **Set Initial Parameters:** In the `Set: Initial Parameters` node, update the placeholder email address and the Slack channel name for billing alerts.\n3.  **Update Slack Search Channel:** In the `Tool: Search Slack Messages` node, set the channel you want the agent to search for feedback in.\n4.  **Activate Workflow:** Once configured, activate the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "eff608be-8f8d-4379-a9f0-5ab1beb26b3d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        960
      ],
      "parameters": {
        "color": 6,
        "width": 432,
        "height": 176,
        "content": "## Contact me\n- If you need any modification to this workflow\n- if you need some help with this workflow\n- Or if you need any workflow in n8n, Make, or Langchain / Langgraph\n\nWrite to me: [thomas@pollup.net](<mailto:thomas@pollup.net>)"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Tool: Send Email Alert": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Route Topics to Actions",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Set: Initial Parameters": {
      "main": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Config: Set Agent Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Create Notion Page": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Route Topics to Actions",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Get Gmail Messages": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI: Structure Key Signals": {
      "ai_outputParser": [
        [
          {
            "node": "AI Chain: Extract Key Signals",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Get Pipedrive Notes": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Get Zendesk Tickets": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Config: Set LLM for Agents": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Structure Feedback Data",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Chain: Extract Key Signals",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Chain: Cluster Signals into Topics",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "AI Agent: Route Topics to Actions",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI: Structure Feedback Data": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Create Zendesk Ticket": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Route Topics to Actions",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI Chain: Extract Key Signals": {
      "main": [
        [
          {
            "node": "AI Chain: Cluster Signals into Topics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent: Gather Customer Feedback": {
      "main": [
        [
          {
            "node": "AI Chain: Extract Key Signals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Trigger: Start VOC Analysis": {
      "main": [
        [
          {
            "node": "Set: Initial Parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Chain: Cluster Signals into Topics": {
      "main": [
        [
          {
            "node": "AI Agent: Route Topics to Actions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tool: Search Slack Messages  Export to Sheets": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Gather Customer Feedback",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI: Structure Clustered Topics  Export to Sheets": {
      "ai_outputParser": [
        [
          {
            "node": "AI Chain: Cluster Signals into Topics",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is for Customer Success, Product, and Support teams who need to centralize and analyze unstructured customer feedback. It automates the process of identifying key themes from various communication channels, allowing you to proactively address issues, track feature…

Source: https://n8n.io/workflows/9782/ — 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 workflow serves as a comprehensive "Workflow Nodes SEO & Documentation Generator". It uses AI to analyze, rename, and document n8n workflows, offering a streamlined way to optimize workflow reada

Form Trigger, n8n, Output Parser Autofixing +11
AI & RAG

This workflow is perfect for creators, solopreneurs, and personal brands who want to consistently publish bold, high-performing content on X (Twitter) — without writing a single line themselves. After

OpenAI Chat, Memory Buffer Window, Tool Workflow +10
AI & RAG

This workflow is for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It's ideal for solo founders, operators, or profe

Memory Buffer Window, Tool Workflow, Tool Think +9
AI & RAG

AI Blog Publisher – Automated Blog Content Workflow This workflow is designed for individuals and teams who regularly publish content on their blog and want to automate the entire process from start t

WordPress, HTTP Request, Memory Buffer Window +9
AI & RAG

This workflow automates credit operations onboarding by running KYC verification, credit bureau checks, identity validation, and sanctions screening through a single AI-powered agent. Built for credit

Agent, OpenAI Chat, Output Parser Structured +8