AutomationFlowsSlack & Telegram › AI-Powered Survey Response Analyzer

AI-Powered Survey Response Analyzer

Original n8n title: Survey Response Analyzer with AI

Survey Response Analyzer with AI. Uses openAi, googleSheets, slack. Webhook trigger; 6 nodes.

Webhook trigger★★★★☆ complexityAI-powered6 nodesOpenAIGoogle SheetsSlack
Slack & Telegram Trigger: Webhook Nodes: 6 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Google Sheets → OpenAI 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
{
  "name": "Survey Response Analyzer with AI",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "analyze-survey",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000001",
      "name": "Webhook - Survey Data",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "resource": "chat",
        "model": "gpt-4o",
        "messages": {
          "values": [
            {
              "content": "=You are a survey analysis expert. Analyze the following survey responses and provide:\n\n1. **Sentiment Analysis**: For each response, classify sentiment as positive, neutral, or negative with a confidence score (0-1).\n2. **Theme Extraction**: Identify the top 5 recurring themes across all responses.\n3. **Key Insights**: Provide 3-5 actionable insights based on the data.\n4. **Overall Satisfaction Score**: Calculate an aggregate score from 1-10.\n5. **Response Categories**: Group responses into logical categories.\n\nReturn as JSON with fields: sentiments (array), themes (array), insights (array), overallScore (number), categories (object).\n\nSurvey Responses:\n{{ JSON.stringify($json.body.responses) }}"
            }
          ]
        },
        "options": {
          "temperature": 0.3,
          "maxTokens": 4096,
          "responseFormat": "json_object"
        }
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000002",
      "name": "OpenAI - Analyze Sentiment & Themes",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.4,
      "position": [
        480,
        300
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const aiResponse = $input.first().json.message.content;\nlet analysis;\ntry {\n  analysis = JSON.parse(aiResponse);\n} catch (e) {\n  analysis = { raw: aiResponse, parseError: true };\n}\nconst timestamp = new Date().toISOString();\nconst surveyId = $('Webhook - Survey Data').first().json.body.surveyId || 'unknown';\nreturn [{ json: { surveyId, timestamp, ...analysis } }];"
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000003",
      "name": "Code - Format Analysis",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        720,
        300
      ]
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "Survey Analysis"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Survey ID": "={{ $json.surveyId }}",
            "Timestamp": "={{ $json.timestamp }}",
            "Overall Score": "={{ $json.overallScore }}",
            "Top Themes": "={{ $json.themes ? $json.themes.join(', ') : '' }}",
            "Key Insights": "={{ $json.insights ? $json.insights.join(' | ') : '' }}",
            "Positive Count": "={{ $json.sentiments ? $json.sentiments.filter(s => s.sentiment === 'positive').length : 0 }}",
            "Negative Count": "={{ $json.sentiments ? $json.sentiments.filter(s => s.sentiment === 'negative').length : 0 }}",
            "Neutral Count": "={{ $json.sentiments ? $json.sentiments.filter(s => s.sentiment === 'neutral').length : 0 }}"
          }
        },
        "options": {}
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000004",
      "name": "Google Sheets - Store Results",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        960,
        300
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "channel": "#survey-results",
        "text": "=:bar_chart: *Survey Analysis Complete*\n\n*Survey ID:* {{ $('Code - Format Analysis').first().json.surveyId }}\n*Overall Score:* {{ $('Code - Format Analysis').first().json.overallScore }}/10\n\n*Top Themes:*\n{{ $('Code - Format Analysis').first().json.themes ? $('Code - Format Analysis').first().json.themes.map((t, i) => `${i+1}. ${t}`).join('\\n') : 'None identified' }}\n\n*Key Insights:*\n{{ $('Code - Format Analysis').first().json.insights ? $('Code - Format Analysis').first().json.insights.map(i => `\u2022 ${i}`).join('\\n') : 'None' }}\n\n*Sentiment Breakdown:* :thumbsup: {{ $('Code - Format Analysis').first().json.sentiments ? $('Code - Format Analysis').first().json.sentiments.filter(s => s.sentiment === 'positive').length : 0 }} | :neutral_face: {{ $('Code - Format Analysis').first().json.sentiments ? $('Code - Format Analysis').first().json.sentiments.filter(s => s.sentiment === 'neutral').length : 0 }} | :thumbsdown: {{ $('Code - Format Analysis').first().json.sentiments ? $('Code - Format Analysis').first().json.sentiments.filter(s => s.sentiment === 'negative').length : 0 }}",
        "otherOptions": {}
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000005",
      "name": "Slack - Post Summary",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1200,
        300
      ],
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ success: true, surveyId: $('Code - Format Analysis').first().json.surveyId, overallScore: $('Code - Format Analysis').first().json.overallScore, themes: $('Code - Format Analysis').first().json.themes, insights: $('Code - Format Analysis').first().json.insights }) }}"
      },
      "id": "c3d4e5f6-3333-4000-8000-000000000006",
      "name": "Respond with Analysis",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1440,
        300
      ]
    }
  ],
  "connections": {
    "Webhook - Survey Data": {
      "main": [
        [
          {
            "node": "OpenAI - Analyze Sentiment & Themes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI - Analyze Sentiment & Themes": {
      "main": [
        [
          {
            "node": "Code - Format Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Format Analysis": {
      "main": [
        [
          {
            "node": "Google Sheets - Store Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets - Store Results": {
      "main": [
        [
          {
            "node": "Slack - Post Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack - Post Summary": {
      "main": [
        [
          {
            "node": "Respond with Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "name": "ai-data"
    }
  ]
}

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

Survey Response Analyzer with AI. Uses openAi, googleSheets, slack. Webhook trigger; 6 nodes.

Source: https://github.com/mlnjsh/n8n-workflows-mega/blob/main/workflows/ai-data/03-survey-response-analyzer.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

Webhook Slack. Uses venafiTlsProtectCloud, stickyNote, respondToWebhook, httpRequest. Webhook trigger; 38 nodes.

Venafi Tls Protect Cloud, HTTP Request, OpenAI +1
Slack & Telegram

Webhook Slack. Uses venafiTlsProtectCloud, stickyNote, respondToWebhook, httpRequest. Webhook trigger; 38 nodes.

Venafi Tls Protect Cloud, HTTP Request, OpenAI +1
Slack & Telegram

Splitout Code. Uses googleSheetsTrigger, httpRequest, splitInBatches, googleSheets. Event-driven trigger; 35 nodes.

Google Sheets Trigger, HTTP Request, Google Sheets +2
Slack & Telegram

This workflow is designed for business analysts, market researchers, lead generation specialists, and sales teams who need to gather detailed business intelligence from Google Maps. It's particularly

Telegram, OpenAI, N8N Nodes Apify +5
Slack & Telegram

This workflow monitors your Gmail support inbox every minute, automatically sending each unread email to OpenAI for intelligent analysis. The AI evaluates sentiment (Positive/Neutral/Negative/Critical

RSS Feed Read, OpenAI, Slack +3