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 →
{
"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.
googleSheetsOAuth2ApiopenAiApislackOAuth2Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow receives negative brand mentions via webhook, uses OpenAI to classify crisis severity and draft a holding statement, logs incidents to Google Sheets, and notifies approvers and teams via
This workflow monitors new hires in Google Sheets, downloads onboarding documents from Google Drive, uses OpenAI (gpt-4o-mini) to verify each file and determine overall compliance, then notifies HR vi
This workflow handles customer order complaints submitted via Telegram by looking up order details in Google Sheets, using OpenAI to classify message sentiment, and routing each case to auto-approval,
This workflow handles COD order confirmation and abandoned-cart recovery by combining webhooks, Google Sheets logging, OpenAI message generation, and Telegram messaging with inline buttons, plus Slack
Webhook Slack. Uses venafiTlsProtectCloud, stickyNote, respondToWebhook, httpRequest. Webhook trigger; 38 nodes.