This workflow corresponds to n8n.io template #4447 — we link there as the canonical source.
This workflow follows the Chainllm → Emailsend 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "fc0f2155-ac48-4cd0-97d2-3eb81dac1757",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-840,
120
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash"
},
"typeVersion": 1
},
{
"id": "992c9e1b-ec91-4470-887f-e43c899cfb8c",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1080,
-280
],
"parameters": {
"color": 4,
"width": 500,
"height": 1280,
"content": "=======================================\n WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n - YouTube: https://www.youtube.com/@YaronBeen/videos\n - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n\nAuthor:\nYaron Been\n"
},
"typeVersion": 1
},
{
"id": "4c76ce3a-6c1d-493b-b648-12c0d56fd9d8",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-820,
-640
],
"parameters": {
"width": 580,
"content": "This workflow retrieves support ticket data from Google Sheets, counts how many tickets fall into each category, and sends a summary report via email."
},
"typeVersion": 1
},
{
"id": "ab24dd90-ae20-496d-a963-6c89a65d2340",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
-180
],
"parameters": {
"width": 170,
"height": 80,
"content": "Triggers the workflow to start the summary process."
},
"typeVersion": 1
},
{
"id": "968d3213-dafc-415f-8760-31e0fb55d94a",
"name": "Form Trigger",
"type": "n8n-nodes-base.typeformTrigger",
"position": [
-940,
-380
],
"parameters": {
"formId": "lwldQPTN"
},
"typeVersion": 1.1
},
{
"id": "d57b9477-f789-4ee2-a664-eba7f787a750",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-680,
-160
],
"parameters": {
"width": 190,
"height": 100,
"content": "Uses Gemini model to classify or tag each support request into predefined categories."
},
"typeVersion": 1
},
{
"id": "bb7ae6f3-5c32-47a3-a91b-97e4e4b4e0b1",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
-160
],
"parameters": {
"width": 170,
"height": 100,
"content": "Parses Gemini's response to extract only the relevant category label from the output."
},
"typeVersion": 1
},
{
"id": "b7eb9e53-916f-4c34-babf-c8b23641b8a2",
"name": "AI Categorization",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-740,
-380
],
"parameters": {
"text": "=Classify the support request below:\nMessage: {{ $json['Your message'] }}\n\nReturn output with 'category' and 'sentiment' columns of JSON FILE:\n{\n \"category\": one of [\"Billing\", \"Bug Report\", \"Feature Request\", \"How-To\", \"Complaint\"],\n \"sentiment\": one of [\"Positive\", \"Neutral\", \"Negative\"]\n}\n ",
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "eb3c3d0a-cdad-4792-a954-1de022d968dd",
"name": "Extract Category",
"type": "n8n-nodes-base.code",
"position": [
-360,
-380
],
"parameters": {
"jsCode": "// Get the input string\nconst inputString = $json.text;\n\n// Remove code block markers using regex\nconst cleaned = inputString.replace(/```json|```/g, '').trim();\n\n// Parse the JSON\nconst data = JSON.parse(cleaned);\n\n// Extract the values\nconst category = data.category;\nconst sentiment = data.sentiment;\n\n// Return as output\nreturn [{ category, sentiment }];"
},
"typeVersion": 2
},
{
"id": "b3c418d7-9113-46eb-af0a-2372de5a3eec",
"name": "Store Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
-120,
-380
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $('Form Trigger').item.json['Enter your name'] }}",
"Email": "={{ $('Form Trigger').item.json['Enter your email'] }}",
"Message": "={{ $('Form Trigger').item.json['Your message'] }}",
"Category": "={{ $json.category }}",
"Sentiment": "={{ $json.sentiment }}",
"Timestamp": "={{$now}}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Message",
"type": "string",
"display": true,
"required": false,
"displayName": "Message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Category",
"type": "string",
"display": true,
"required": false,
"displayName": "Category",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "string",
"display": true,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM/edit?usp=drivesdk",
"cachedResultName": "Support"
}
},
"typeVersion": 4.5
},
{
"id": "51ef2daa-2c2e-409c-a103-6f915d3ef0d0",
"name": "Fetch Support Ticket Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
100,
-380
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SY1fCAbsvyTzIBbmwZpdktbUFN4jKNIpF4GJ9lFKvPM/edit?usp=drivesdk",
"cachedResultName": "Support"
}
},
"typeVersion": 4.5
},
{
"id": "b3258a29-9bfa-4361-83d3-804aac76e976",
"name": "Increment Counter",
"type": "n8n-nodes-base.code",
"position": [
300,
-380
],
"parameters": {
"jsCode": "const items = $input.all();\nconst counts = {};\nitems.forEach(item => {\n const cat = item.json.Category;\n if (cat) {\n counts[cat] = (counts[cat] || 0) + 1;\n }\n});\nreturn [{ json: { summary: counts } }];"
},
"typeVersion": 2
},
{
"id": "5c8193a0-6fab-494a-bd40-b26188c319b0",
"name": "Email Ticket Summary",
"type": "n8n-nodes-base.emailSend",
"position": [
500,
-380
],
"parameters": {
"text": "=Hello,\n\nHere is the updated count of categorized support tickets:\n\nBilling: {{$json.summary.Billing || 0}}\nBug Report: {{$json.summary['Bug Report'] || 0}}\nFeature Request: {{$json.summary['Feature Request'] || 0}}\nHow-To: {{$json.summary['How-To'] || 0}}\nComplaint: {{$json.summary.Complaint || 0}}\n\nBest regards,\nSupport Tracker",
"options": {},
"subject": "Support Ticket Summary",
"toEmail": "user@example.com",
"fromEmail": "you@example.com"
},
"typeVersion": 1
},
{
"id": "3827fa87-5669-4217-88fe-978328f0ec4c",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-140,
-180
],
"parameters": {
"width": 170,
"height": 120,
"content": "Appends each categorized and data ticket into a central Google Sheet for record keeping and later aggregation."
},
"typeVersion": 1
},
{
"id": "c515d231-f260-4c5a-9895-19fe0c229762",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
-180
],
"parameters": {
"width": 170,
"height": 120,
"content": "Fetches all categorized entries from the Google Sheet to compute ticket counts by category."
},
"typeVersion": 1
},
{
"id": "f6eb3bd4-c4fa-4b98-bc58-1930118e3b25",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
300,
-180
],
"parameters": {
"width": 170,
"height": 100,
"content": "Groups tickets by category and counts the total per group to prepare data for reporting."
},
"typeVersion": 1
},
{
"id": "5ec81b1c-14d1-4540-9acb-ad8c97632246",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
520,
-180
],
"parameters": {
"width": 170,
"height": 100,
"content": "Sends an email with the total number of tickets per category from today\u2019s run."
},
"typeVersion": 1
}
],
"connections": {
"Store Data": {
"main": [
[
{
"node": "Fetch Support Ticket Data",
"type": "main",
"index": 0
}
]
]
},
"Form Trigger": {
"main": [
[
{
"node": "AI Categorization",
"type": "main",
"index": 0
}
]
]
},
"Extract Category": {
"main": [
[
{
"node": "Store Data",
"type": "main",
"index": 0
}
]
]
},
"AI Categorization": {
"main": [
[
{
"node": "Extract Category",
"type": "main",
"index": 0
}
]
]
},
"Increment Counter": {
"main": [
[
{
"node": "Email Ticket Summary",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Categorization",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Fetch Support Ticket Data": {
"main": [
[
{
"node": "Increment Counter",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform chaotic support requests into organized, actionable insights automatically.
Source: https://n8n.io/workflows/4447/ — 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 end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr
This n8n workflow automates the collection, enrichment, and analysis of e-commerce product listings using Bright Data and AI, then delivers an HTML email report with the most competitive offers.
Job-Posting-agent. Uses googleSheetsTrigger, chainLlm, lmChatGoogleGemini, httpRequest. Event-driven trigger; 14 nodes.
Episode 11: AI shorts factory app. Uses httpRequest, googleSheets, lmChatOpenAi, lmChatOllama. Event-driven trigger; 96 nodes.
This workflow creates a multi-talented AI assistant named Simran that interacts with users via Telegram. It can handle text and voice messages, understand the user's intent, and perform various tasks.