{
"name": "SupportFlow Lite \u2014 Simple AI Support Bot (No RAG)",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "supportflow-lite",
"responseMode": "responseNode",
"options": {}
},
"id": "trigger-webhook",
"name": "Receive Message",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
200,
400
],
"webhookId": "supportflow-lite"
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || $input.first().json;\nconst message = body.message || body.text || '';\nconst sessionId = body.session_id || require('crypto').randomUUID();\nconst customerName = body.customer_name || 'Customer';\n\nif (!message || message.trim().length < 2) {\n throw new Error('Message is required.');\n}\n\nreturn [{ json: { message: message.trim(), sessionId, customerName, receivedAt: new Date().toISOString(), messageId: require('crypto').randomUUID() } }];"
},
"id": "validate-input",
"name": "Validate Input",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
420,
400
]
},
{
"parameters": {
"model": "gpt-4o-mini",
"messages": {
"values": [
{
"role": "system",
"content": "=You are a helpful customer support assistant for {{ $env.SUPPORTFLOW_COMPANY_NAME || 'our company' }}.\n\nCompany info:\n{{ $env.SUPPORTFLOW_COMPANY_INFO || 'We are a technology company focused on providing excellent customer service.' }}\n\nRules:\n1. Be friendly, professional, and concise\n2. Answer based on the company info provided\n3. If you don't know the answer, say: 'I don't have that information. Let me connect you with our team at [support email].'\n4. Keep responses under 150 words\n5. Never make up product features, prices, or policies\n\nRespond in JSON: { \"answer\": \"...\", \"confidence\": 0.0-1.0, \"category\": \"faq|billing|technical|complaint|other\" }"
},
{
"role": "user",
"content": "=Customer {{$json.customerName}} asks:\n{{$json.message}}"
}
]
},
"options": {
"temperature": 0.3,
"maxTokens": 500,
"responseFormat": "json_object"
}
},
"id": "ai-respond",
"name": "AI: Generate Response",
"type": "n8n-nodes-base.openAi",
"typeVersion": 1.8,
"position": [
660,
400
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 2000
},
{
"parameters": {
"jsCode": "const original = $('Validate Input').first().json;\nconst aiRaw = $input.first().json;\nlet ai;\ntry {\n ai = JSON.parse(aiRaw.message?.content || aiRaw.content || '{}');\n} catch (e) {\n ai = { answer: 'Sorry, I had trouble processing that. Please try again.', confidence: 0, category: 'other' };\n}\n\nreturn [{ json: { ...original, answer: ai.answer || '', confidence: ai.confidence || 0, category: ai.category || 'other', respondedAt: new Date().toISOString() } }];"
},
"id": "merge-response",
"name": "Merge Response",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
900,
400
]
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "={{ $env.SUPPORTFLOW_SHEET_ID }}",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Lite Conversations",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Message ID": "={{ $json.messageId }}",
"Session ID": "={{ $json.sessionId }}",
"Customer": "={{ $json.customerName }}",
"Question": "={{ $json.message }}",
"Answer": "={{ $json.answer }}",
"Confidence": "={{ $json.confidence }}",
"Category": "={{ $json.category }}",
"Received": "={{ $json.receivedAt }}",
"Responded": "={{ $json.respondedAt }}"
}
},
"options": {}
},
"id": "log-sheets",
"name": "Log to Sheets",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1140,
300
],
"retryOnFail": true,
"maxTries": 2
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ success: true, messageId: $json.messageId, answer: $json.answer, confidence: $json.confidence, category: $json.category }) }}"
},
"id": "respond",
"name": "Respond to Customer",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1140,
500
]
},
{
"parameters": {
"content": "## SupportFlow Lite \u2014 Simple AI Bot\n\nNo vector database needed.\nUses company info from environment variable.\n\nBest for: Small businesses, MVPs, testing.\nSetup: 2 minutes (just OpenAI + Sheets).\n\nUpgrade to Main workflow when you\nneed RAG-powered knowledge base.",
"width": 350,
"height": 220,
"color": 6
},
"id": "note-overview",
"name": "Sticky Note: Lite",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
120,
140
]
}
],
"connections": {
"Receive Message": {
"main": [
[
{
"node": "Validate Input",
"type": "main",
"index": 0
}
]
]
},
"Validate Input": {
"main": [
[
{
"node": "AI: Generate Response",
"type": "main",
"index": 0
}
]
]
},
"AI: Generate Response": {
"main": [
[
{
"node": "Merge Response",
"type": "main",
"index": 0
}
]
]
},
"Merge Response": {
"main": [
[
{
"node": "Log to Sheets",
"type": "main",
"index": 0
},
{
"node": "Respond to Customer",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true
},
"tags": [
{
"name": "SupportFlow",
"id": "supportflow"
},
{
"name": "AutoFlow",
"id": "autoflow"
},
{
"name": "Lite",
"id": "lite"
}
],
"meta": {
"instanceId": "supportflow-lite-v1"
}
}