This workflow corresponds to n8n.io template #5831 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"id": "U8L7ojJGYnPXUZZm",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Intercom Conversation Reviews",
"tags": [],
"nodes": [
{
"id": "3a663159-b082-440d-b15f-81a4f246e8c2",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
720,
420
],
"parameters": {
"path": "a716761a-b062-4f93-9734-04fdc83e9a9a",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "82fb7f3c-137f-4d28-8764-4b71ecca18d4",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
940,
420
],
"parameters": {
"url": "=https://api.intercom.io/conversations/{{ $json.body.data.item.id }}?display_as=plaintext' ",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "intercomApi"
},
"credentials": {
"intercomApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "42d3660f-ef89-4b05-92b7-8efbe1d5a9d4",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2480,
120
],
"parameters": {
"text": "={{ $json }}",
"options": {
"systemMessage": "I manage a customer support team based in India. I want to evaluate how our agents handle live chat conversations. \n\nThe goal is to improve response speed, clarity, urgency handling, tone, ownership, and problem resolution.\n\nYou are to act like a human QA reviewer \u2014 not an AI. \n\nProvide straight, coaching-style feedback in simple, easy-to-understand language that agents can learn and act on.\n\nConversation mostly have involvement of AI replies in the name of \"Alisha ( AI Bot ) from Saleshandy\" initially and then if not solved real human team member participate. \n\n\ud83e\udde0 Tone Reminder\nUse a friendly, coaching tone \u2014 never sound like a complaint. The goal is to help the agent grow, not to shame them.\n\n\ud83d\udd27 GPT Feedback Instructions\n\n\u2705 Be factual, crisp, and direct\n\n\u2705 Avoid technical or fancy words\n\n\u2705 Use exact sentences from the chat to highlight mistakes\n\n\u2705 Suggest a clear and improved reply\n\n\u2705 Explain the impact and what the agent should do instead\n\n\u2705 Use the agent\u2019s first name (from the transcript) \u2014 never say \u201cagent\u201d or mention AI\n\n\u2705 Adjust tone and expectations if the customer was angry, confused, or seemed in a hurry\n\n\u2705 Our support hours are from 10:00 AM to 2:30 AM IST\n\n\u2705 If team member has not participated in the conversation, mention the rating is for AI bot i.e Alisa. \n\n\u2705 Ensure the feedback is easy to read:\n- Use proper line breaks and spacing\n- Keep sentences short and clear (ideally under 20 words)\n- Use bullets or emojis where helpful\n- Avoid large blocks of text\n\n\nFedback formate\n\nResponse Time: (Fast / Okay / Slow)\n\nWas the reply quick or delayed? Include the customer's wait time if available.\n\nClarity of Answers: (Clear / Confusing / Incomplete)\n\nWas the explanation simple and understandable?\n\nTone & Behavior: (Polite / Robotic / Rude)\n\nDid the agent sound human, helpful, and respectful?\n\nUrgency Handling: (Handled Well / Ignored / Unaware)\n\nDid the agent notice urgency and respond accordingly?\n\nOwnership & Accountability: (Strong / Weak / Avoiding)\n\nDid the agent take responsibility or deflect the issue?\n\nDid They Solve the Problem? (Yes / Partially / No)\n\nWas the issue resolved or clearly guided?\n\nGive conversation start date & end date in seperate lines (follow yyyy-mm-dd formate)\n\nOverall Score: (1 to 5)\n\nScoring Guide\n5 \u2013 Excellent (All aspects handled well with ownership)\n4 \u2013 Good (Minor gaps, customer likely satisfied)\n3 \u2013 Average (Some confusion, but no major damage)\n2 \u2013 Poor (Multiple issues, customer likely frustrated)\n1 \u2013 Unacceptable (Neglected, robotic, or disrespectful)\n\n\nOutput Format Requirements:\n\n\u26a0\ufe0f Return output as a pure JSON array, no extra keys, no string wrapping, no markdown, no triple backticks.\n\nDo NOT wrap the JSON in any extra string or code block.\n\n\ud83d\udd01 Only return the array.\n\u2705 No markdown formatting\n\u2705 No output: key\n\u2705 No escaping of quotes\n\u2705 No explanation\n\u2705 No wrapping in a string\n\nSample below:\n\n[\n {\n \"Response Time\": \"Fast\",\n \"Clarity of Answers\": \"Confusing\",\n \"Tone & Behavior\": \"Polite\",\n \"Urgency Handling\": \"Ignored\",\n \"Ownership & Accountability\": \"Weak\",\n \"Did They Solve the Problem?\": \"No\",\n \"Start Date\": \"2025-07-07\",\n \"End Date\": \"2025-07-07\",\n \"Overall Score\": 2\n }\n]"
},
"promptType": "define"
},
"typeVersion": 1.8
},
{
"id": "b71a3cfd-e33a-4bbe-8e14-d6b25aed76aa",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2568,
340
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "gpt-4o"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "0dec2602-4e2d-43d4-b494-094f9a3c5e29",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
1380,
570
],
"parameters": {
"options": {},
"fieldToSplitOut": "conversation_parts"
},
"typeVersion": 1
},
{
"id": "b5a0fd7a-c73c-44b6-bbda-86daf62dc1aa",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
1600,
570
],
"parameters": {
"jsCode": "// Start from items[1], since items[0] only has metadata\nconst conversationParts = items[1].json;\n\nconst output = [];\n\nfor (const key in conversationParts) {\n const part = conversationParts[key];\n\n if (part && part.part_type === 'comment') {\n output.push({\n json: part,\n pairedItem: {\n item: 1, // link to items[1], where the data came from\n },\n });\n }\n}\n\nreturn output;\n"
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "0ba2ff75-4ee6-4db8-8aef-8d7bbfc56ccd",
"name": "Split Out1",
"type": "n8n-nodes-base.splitOut",
"position": [
1820,
570
],
"parameters": {
"options": {},
"fieldToSplitOut": "body, created_at, author.type, author.name, author.email"
},
"typeVersion": 1
},
{
"id": "963b2239-32af-4cb0-a130-e3b067b6fe7e",
"name": "Code1",
"type": "n8n-nodes-base.code",
"position": [
2040,
570
],
"parameters": {
"jsCode": "function formatTimestamp(unixTime) {\n const date = new Date(unixTime * 1000);\n return date.toISOString().replace('T', ' ').split('.')[0]; // \"YYYY-MM-DD HH:mm:ss\"\n}\n\nlet combinedText = items.map(item => {\n const body = item.json.body || '';\n const author = item.json[\"author.name\"] || 'Unknown';\n const role = item.json[\"author.type\"] || 'unknown';\n const timestamp = item.json.created_at ? formatTimestamp(item.json.created_at) : 'Unknown time';\n\n const cleanBody = body.replace(/<[^>]*>/g, '').trim();\n\n let speaker = 'Unknown';\n if (role === 'user') {\n speaker = 'User';\n } else if (role === 'bot') {\n speaker = 'Bot';\n } else if (role === 'admin') {\n speaker = 'Admin';\n }\n\n return `[${timestamp}] ${speaker} (${author}): ${cleanBody}`;\n}).join('\\n\\n');\n\nreturn [\n {\n json: {\n conversation: combinedText\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "e51d2ee7-fd29-4535-88be-94bbaf5083dd",
"name": "Code2",
"type": "n8n-nodes-base.code",
"position": [
2856,
220
],
"parameters": {
"jsCode": "const raw = $json[\"output\"];\nreturn JSON.parse(raw);\n"
},
"typeVersion": 2
},
{
"id": "d15b437b-e2a3-4fcc-a167-7bcc1c1ac8ff",
"name": "Split Out2",
"type": "n8n-nodes-base.splitOut",
"position": [
1820,
170
],
"parameters": {
"options": {},
"fieldToSplitOut": "source.body, source.delivered_as, source.author.name, source.author.email, "
},
"typeVersion": 1
},
{
"id": "a4d0c944-d7d3-4fa2-8549-24e0895f9ecd",
"name": "Code3",
"type": "n8n-nodes-base.code",
"position": [
2040,
170
],
"parameters": {
"jsCode": "return items.map(item => {\n const data = item.json;\n\n // Remove HTML tags from body if needed\n const plainBody = data[\"source.body\"]\n ? data[\"source.body\"].replace(/<[^>]*>/g, '').trim()\n : '';\n\n const name = data[\"source.author.name\"] || 'Unknown';\n const email = data[\"source.author.email\"] || 'user@example.com';\n\n return {\n json: {\n conversationinitiatied: `${name} (${email}): ${plainBody}`\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "f8e6b7dc-9a3d-4ffa-ace0-dc2da6dd5534",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
2260,
220
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "9afa1edb-2693-4705-b1af-ac5b56beea2c",
"name": "AI Agent1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2480,
620
],
"parameters": {
"text": "={{ $json.conversation }}",
"options": {
"systemMessage": "Analyze the following conversation transcript.\n\nYour tasks:\n\nCount the number of messages sent by each role: Bot, User, and Admin.\n\nIdentify who was the last admin person to send a message (include their name, avoid considering bot or user for the last messsage).\n\n\u2705 Output the result in the following JSON format:\n\njson\n{\n {\n \"Bot\": 10,\n \"User\": 8,\n \"Admin\": 5\n \"last_message_by\":\n \"name\": \"Kinjal\",\n}\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "e41e5ed9-069b-4a6b-b0d1-e07a628b4be8",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2568,
840
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "7e77f48d-2201-4e87-9426-9e9f0a84460d",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
3076,
420
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "d1390d6c-d5f7-4789-8751-89bfdf2c11d7",
"name": "Code5",
"type": "n8n-nodes-base.code",
"position": [
2856,
620
],
"parameters": {
"jsCode": "let raw = $json[\"output\"];\n\n// Remove Markdown-style code block if present\nraw = raw.replace(/^```json\\n/, '').replace(/\\n```$/, '');\n\nreturn JSON.parse(raw);\n"
},
"typeVersion": 2
},
{
"id": "69277b71-7eb0-444d-9b9b-0f4bc3795811",
"name": "Append row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
3296,
320
],
"parameters": {
"columns": {
"value": {
"Tone": "={{ $json[\"Tone & Behavior\"] }}",
"Solved": "={{ $json[\"Did They Solve the Problem?\"] }}",
"Clarity": "={{ $json[\"Clarity of Answers\"] }}",
"Urgency": "={{ $json[\"Urgency Handling\"] }}",
"Ownership": "={{ $json[\"Ownership & Accountability\"] }}",
"#Bot Replies ": "={{ $json.Bot }}",
"Overall Score": "={{ $json[\"Overall Score\"] }}",
"Response time": "={{ $json[\"Response Time\"] }}",
"Conversation ID": "={{ $item(0).$node[\"HTTP Request\"].json[\"id\"] }}",
"Last Message by": "={{ $json.last_message_by.name }}",
"Our Replies count": "={{ $json.Admin }}",
"#User Replies Count": "={{ $json.User }}",
"Conversation end date": "={{ $json[\"End Date\"] }}",
"Conversation Start Date": "={{ $json[\"Start Date\"] }}"
},
"schema": [
{
"id": "Conversation end date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Conversation end date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Conversation Start Date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Conversation Start Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Conversation ID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Conversation ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Intercom URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Intercom URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Response time",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Response time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Clarity",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Clarity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tone",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Tone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Urgency",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Urgency",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ownership",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Ownership",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Solved",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Solved",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Overall Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Overall Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Time to close (Days)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Time to close (Days)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "#Bot Replies ",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "#Bot Replies ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "#User Replies Count",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "#User Replies Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Our Replies count",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Our Replies count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Message by",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Last Message by",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Conversation Start Date"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1593039064,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1f9VmrRKolmn3PKIyLWy0yVSiTlQ1QbCAz-8E93XzTJM/edit#gid=1593039064",
"cachedResultName": "AI.Coach"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1f9VmrRKolmn3PKIyLWy0yVSiTlQ1QbCAz-8E93XzTJM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1f9VmrRKolmn3PKIyLWy0yVSiTlQ1QbCAz-8E93XzTJM/edit?usp=drivesdk",
"cachedResultName": "Daily Input Update (DIU) - Customer Support"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "cc12f47b-8421-44da-887d-d096635a8be4",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
1160,
420
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "b7f80639-c3cd-49ae-acbb-0f54d399844a",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.custom_attributes.Type }}",
"rightValue": "Spam/Promotional"
},
{
"id": "344ac3eb-6308-4973-882b-274cee353dac",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.custom_attributes.Type }}",
"rightValue": "Other"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "a86ada21-36c9-46cd-81d4-b3c038311f34",
"name": "If1",
"type": "n8n-nodes-base.if",
"position": [
3296,
520
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ef9a24d9-2cc2-4199-b9e4-2d8d85771b4f",
"operator": {
"type": "number",
"operation": "lte"
},
"leftValue": "={{ $json['Overall Score'] }}",
"rightValue": 3
}
]
}
},
"typeVersion": 2.2
},
{
"id": "86e0be5c-4328-4468-a567-7ba66039ae5a",
"name": "AI Agent2",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3516,
520
],
"parameters": {
"text": "={{ $('Merge').item.json.conversationinitiatied }}{{ $('Merge').item.json.conversation }}",
"options": {
"systemMessage": "I manage a customer support team based in India. I want to evaluate how our agents handle live chat conversations. \n\nThe goal is to improve response speed, clarity, urgency handling, tone, ownership, and problem resolution.\n\nYou are to act like a human QA reviewer \u2014 not an AI. \n\nProvide straight, coaching-style feedback in simple, easy-to-understand language that agents can learn and act on.\n\nConversation mostly have involvement of AI replies in the name of \"Alisha ( AI Bot ) from Saleshandy\" initially and then if not solved real human team member participate. \n\n\ud83e\udde0 Tone Reminder\nUse a friendly, coaching tone \u2014 never sound like a complaint. The goal is to help the agent grow, not to shame them.\n\n\ud83d\udd27 GPT Feedback Instructions\n\n\u2705 Be factual, crisp, and direct\n\n\u2705 Avoid technical or fancy words\n\n\u2705 Use exact sentences from the chat to highlight mistakes\n\n\u2705 Suggest a clear and improved reply\n\n\u2705 Explain the impact and what the agent should do instead\n\n\u2705 Use the agent\u2019s first name (from the transcript) \u2014 never say \u201cagent\u201d or mention AI\n\n\u2705 Adjust tone and expectations if the customer was angry, confused, or seemed in a hurry\n\n\u2705 Our support hours are from 10:00 AM to 2:30 AM IST\n\n\u2705 If team member has not participated in the conversation, mention the rating is for AI bot i.e Alisa. \n\n\u2705 Ensure the feedback is easy to read:\n- Use proper line breaks and spacing\n- Keep sentences short and clear (ideally under 20 words)\n- Use bullets or emojis where helpful\n- Avoid large blocks of text\n\n\n\ud83d\udce3 Feedback for Team member \n\nWhat you did well\n\nMention 1\u20132 positive points (e.g., polite tone, clear guidance, fast reply)\n\nWhere you messed up\n\u274c Quote the exact problematic sentence\n\u2705 Show a better version\n\u2795 Explain the impact and the expected behavior\n\nWhat the customer likely felt\n\nExplain in simple, emotional terms (e.g., \u201cThe customer probably felt ignored\u2026\u201d)\n\nHow to fix it next time\n\nGive practical advice the agent can follow in future chats\n\n\ud83d\udd04 Example Feedback\n\u274c You said: \u201cWe will check and revert in 1 hour\u201d \u2014 but the customer had already waited 12 hours.\n\nThis reply added no value and made the customer feel ignored.\n\n\u2705 Instead: \u201cApologies for the delay. I\u2019ve checked internally \u2014 we need another hour and will update you by 4 PM IST today.\u201d\n\u2192 This shows urgency, ownership, and clear commitment.\n\n\u274c You wrote: \u201cWe regret the inconvenience caused\u201d without offering a solution.\n\u2705 Don\u2019t paste sympathy lines. Understand the issue and respond with a real fix.\n"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "3970a104-1a7a-4df2-b6ab-7e4a4e1a5b87",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
3604,
740
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "chatgpt-4o-latest",
"cachedResultName": "chatgpt-4o-latest"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ec53d175-543b-4e49-a894-07e34d97b33d",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-40,
-320
],
"parameters": {
"color": 5,
"width": 620,
"height": 2460,
"content": "\n# \ud83e\udde0 Intercom Conversation QA Review Automation \u2013 n8n Workflow\n\n## \u2705 Objective\n\nAutomate the QA review of Intercom support conversations using AI to:\n\n* Evaluate agent performance\n* Log structured feedback\n* Provide coaching where needed\n* Track trends in customer interactions\n\n---\n\n## \ud83e\udde9 Workflow Overview\n\n### 1. **Webhook Trigger**\n\n* Listens for `conversation.admin.closed` events from Intercom.\n* Initiates the workflow whenever a conversation is closed.\n\n### 2. **Fetch Conversation Details**\n\n* Uses Intercom API to retrieve the full conversation using `conversation ID`.\n\n### 3. **Filter Irrelevant Conversations**\n\n* Skips conversations marked as \u201cSpam/Promotional\u201d or \u201cOther\u201d via `custom_attributes`.\n\n### 4. **Structure the Conversation**\n\n* Extracts:\n\n * Message body\n * Role (User, Bot, Admin)\n * Author name\n * Timestamps\n* Formats messages into a readable transcript.\n\n### 5. **AI-Powered Evaluation (Parallel Branches)**\n\n#### A. \ud83e\uddea **Performance Scoring (GPT-4o)**\n\nEvaluates the following attributes:\n\n* **Response Time**\n* **Clarity of Answers**\n* **Tone & Behavior**\n* **Urgency Handling**\n* **Ownership & Accountability**\n* **Problem Solving**\n* Outputs:\n\n * `Start Date`, `End Date`\n * `Overall Score` (1 to 5)\n * Attribute-wise scores\n\n#### B. \ud83d\udd0d **Message Analytics**\n\n* Counts the number of messages from:\n\n * Bot\n * User\n * Admin\n* Identifies the **last admin responder's name**\n\n### 6. **Merge & Log**\n\n* Combines scoring and metadata\n* Appends the data to a Google Sheet:\n\n * **Sheet:** `Daily Input Update`\n * **Tab:** `AI.Coach`\n\n### 7. **Optional: Coaching Feedback Generator (Score \u2264 3)**\n\n* Triggered if the score is 3 or below\n* Generates coaching feedback in this format:\n\n * \u2705 What went well\n * \u274c What needs fixing (with quote + suggestion)\n * \ud83d\ude15 How the customer likely felt\n * \ud83d\udd04 What to do differently next time\n\n---\n\n## \ud83d\udcc8 Example Output\n\n| Conversation ID | Response Time | Clarity | Tone | Ownership | Overall Score | Last Message By |\n| --------------- | ------------- | ------- | ------ | --------- | ------------- | --------------- |\n| 215469787223351 | Fast | Clear | Polite | Strong | 5 | Kinjal |\n\n---\n\n## \ud83d\udca1 Why It Matters\n\n* Automates repetitive QA work at scale\n* Transforms unstructured conversations into actionable insights\n* Boosts support quality, ownership, and customer satisfaction\n* Offers personalized, high-signal feedback for team coaching\n\n---"
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "5125f964-44cf-4fae-80b8-1cc7cafa056b",
"connections": {
"If": {
"main": [
[],
[
{
"node": "Split Out2",
"type": "main",
"index": 0
},
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"If1": {
"main": [
[
{
"node": "AI Agent2",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Split Out1",
"type": "main",
"index": 0
}
]
]
},
"Code1": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
},
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
]
]
},
"Code2": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Code3": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Code5": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
},
"Merge": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
},
{
"node": "If1",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Code2",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Code5",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Split Out1": {
"main": [
[
{
"node": "Code1",
"type": "main",
"index": 0
}
]
]
},
"Split Out2": {
"main": [
[
{
"node": "Code3",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model2": {
"ai_languageModel": [
[
{
"node": "AI Agent2",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}
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.
googleSheetsOAuth2ApiintercomApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates QA review of Intercom support conversations by: Triggering on events via a webhook Fetching full conversation data using Intercom API Structuring and summarizing the conversation into a readable transcript Using GPT to evaluate: Response time Clarity Tone…
Source: https://n8n.io/workflows/5831/ — 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.
⏺ 🚀 How it works
This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La
leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.
🧠 Gwen – The AI Voice Marketing Agent Gwen is your intelligent voice-powered marketing assistant built in n8n. She combines the power of OpenAI, ElevenLabs, and automation workflows to handle content
Tired of grinding out YouTube content? This n8n workflow turns AI into your personal video factory—creating engaging, faceless shorts on autopilot. Perfect for creators, marketers, or side-hustlers lo