Written By William Bowen
Last updated 15 days ago
Intro
This AI CSAT agent runs in the background of support conversations, detecting when issues are resolved and automatically requesting a CSAT score if none is given. It updates the contact card with the score and reason, seamlessly integrating with CRMs like Salesforce or Zendesk for real-time customer satisfaction tracking.
Use cases
This AI CSAT agent runs in the background of support conversations, detecting when issues are resolved and automatically requesting a CSAT score if none is given. It updates the contact card with the score and reason, seamlessly integrating with CRMs like Salesforce or Zendesk for real-time customer satisfaction tracking.
Automated CSAT Collection for Live Chat Support: When a support agent resolves a ticket in Zendesk, the AI detects the resolution and automatically asks the customer for a CSAT rating. If the customer provides feedback, the AI logs it in the contact card for future analysis.
CSAT Tracking in SMS-Based Customer Support: A company using Twilio for SMS support integrates the AI to track customer satisfaction. After a resolved inquiry about a delayed shipment, the AI requests a CSAT score and logs the feedback in Salesforce.
CSAT Score Monitoring for AI-Only Support: A business running a fully AI-powered chatbot uses the agent to measure customer satisfaction. If a bot resolves a billing issue but no feedback is received, the AI follows up to collect and record a rating.
Proactive CSAT for Tiered Support Escalations: A telecom company has AI handling basic queries and live agents tackling complex ones. The AI only requests CSAT when an issue is resolved, ensuring accurate customer sentiment tracking without interrupting ongoing cases.
Integration with Help Desk Software for Service Teams: A managed IT service provider integrates the AI with Freshdesk to monitor CSAT after resolving technical issues. If an employee reports a laptop issue and itβs fixed, the AI asks for feedback and logs it automatically.
E-commerce Post-Resolution Satisfaction Measurement: A Shopify store using a support chatbot wants to track satisfaction after refund requests. The AI identifies when a refund has been processed, asks the customer about their experience, and updates the CRM accordingly.
Customer Experience Analysis for SaaS Onboarding: A SaaS company tracks CSAT after resolving onboarding issues. If a new user has trouble setting up integrations and receives help via chat, the AI ensures feedback is collected and linked to their account.
Call Center Post-Call CSAT Tracking: A customer calls a bankβs support line about a locked account. After the issue is resolved, the AI sends a follow-up SMS asking for feedback and records the score in their profile in Salesforce.
Measuring AI Chatbot Performance in Hybrid Support Teams: A company uses AI and human agents in parallel. The AI ensures that resolved cases, whether handled by bots or humans, get a CSAT score, helping teams track performance differences.
Hospitality Industry Guest Experience Feedback: A hotel chain uses AI to follow up with guests after resolving requests like room service issues. If a guest reports a missing towel and it
Screenshots


Template
Example{
"$schema": "https://web-api.clerk.chat/pipeline-schema",
"name": "Support - CSAT Agent",
"nodes": [
{
"type": "tool_runner",
"name": "Update contact card",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"type": "contact_tools",
"config": {},
"enabledTools": [
"set_attribute"
],
"tools": {
"set_attribute": {
"paramValues": {
"attributeName": {
"type": "fixed",
"value": "CSAT"
},
"attributeValue": {
"path": "CSAT",
"type": "pipeline-variable"
}
}
}
}
}
},
{
"type": "ai_bot",
"name": "What's their CSAT score?",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "user_message",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "Your job is to ask the client how satisfied they are with their resolution. We are trying to gauge their CSAT score for context. Do this conversationally (it must make sense in the context of the conversation).",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [],
"properties": {}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "ai_bot",
"name": "Has the client given us a CSAT score?",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "By this point, the most recent problem in the conversation history has been identified as resolved. \n\nThe problem is: {{message.problem}} \n\nYour job is to read the conversation history and see if the client has provided us with a CSAT score (in relation to this specific problem) or some message that would indicate how satisfied they are with the solution to their problem.\n\nOutput this under \"CSAT\". This could be a number or a sentence or a mix.\n\nIf there is no indication of CSAT, leave it blank. \n\nYour output should be written about the client, e.g. \"the client has indicated they are .... because ....\"",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [
"CSAT"
],
"properties": {
"CSAT": {
"type": "string"
}
}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "ai_bot",
"name": "Has the problem been resolved?",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "Your job is to understand the clients problem. Their problem is: {{message.problem}} \n\nYou then need to read the conversation history and decide if this specific problem has been resolved. \n\nOutput \"resolved\" as true or false. \n\nIf their was no problem in the first place, then nothing has been resolved, so you would output false.",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [
"resolved"
],
"properties": {
"resolved": {
"type": "boolean"
}
}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "ai_bot",
"name": "What's the problem?",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "Your job is to read the conversation history and the most recent message(s) the client has said and determine what their most recent problem is. \n\nIt's important to note that you may be reading a very long conversation, which could have several problems mentioned throughout. You only need to extract the most recent problem. \n\nOutput this under 'problem'.",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [
"problem"
],
"properties": {
"problem": {
"type": "string"
}
}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "trigger",
"name": "Start",
"triggeredBy": [
"userMessage"
],
"responseType": "json"
}
],
"edges": [
{
"name": "YES",
"sourceNode": "Has the client given us a CSAT score?",
"destinationNode": "Update contact card",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"!isEmpty": [
{
"var": "message.CSAT"
}
]
}
}
}
]
},
{
"name": "No",
"sourceNode": "Has the client given us a CSAT score?",
"destinationNode": "What's their CSAT score?",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"isEmpty": [
{
"var": "message.CSAT"
}
]
}
}
}
]
},
{
"name": "Yes",
"sourceNode": "Has the problem been resolved?",
"destinationNode": "Has the client given us a CSAT score?",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"===": [
{
"var": "message.resolved"
},
true
]
}
}
}
]
},
{
"name": null,
"sourceNode": "What's the problem?",
"destinationNode": "Has the problem been resolved?",
"sourceVariables": null,
"filters": []
},
{
"name": null,
"sourceNode": "Start",
"destinationNode": "What's the problem?",
"sourceVariables": null,
"filters": []
}
]
}