CSAT Surveys
Measure customer satisfaction at the end of every WhatsApp or email conversation — 1-5 / 1-10 scale, yes/no or open text, with per-version aggregates.
CSAT Surveys
CSAT (Customer Satisfaction) is the short survey the agent fires automatically when a conversation ends. One to three quick questions — "How satisfied are you?", "Did we solve your problem?" — consolidated into per-agent, per-channel aggregates so supervisors see real trends instead of gut feelings.
Executive summary
The game changer: measure satisfaction where the conversation happens — not in a separate form nobody opens.
| Before | With CSAT |
|---|---|
| Supervisor guesses whether service is going well | Response rate + average score per agent |
| Separate email survey → 2% response | Same chat question → 30-40% response |
| No traceability per conversation | Every answer tied to its conversation_id |
What is it for?
- Spot quality drops for a specific agent (a prompt change that hurt experience).
- Compare channels: WhatsApp vs email across the same organisation.
- Justify improvements: "score went from 3.8 to 4.4 after the new prompt".
- Get operational NPS with zero extra tooling.
How it works
sequenceDiagram
autonumber
participant U as User
participant A as WhatsApp/Email Agent
participant T as Conversation timeout service
participant C as CSAT service
U->>A: last message in conversation
Note over A,T: 30 min idle (configurable timeout)
T->>C: any active question set for this agent+channel?
C-->>T: yes, version 3, 2 questions
T->>A: send intro_message
A->>U: "Quick survey to help us?"
U->>A: answer 1
A->>C: parse → CSATAnswer
A->>U: question 2
U->>A: answer 2
A->>C: complete CSATResponseItem
A->>U: thank_you_messageKey details:
- Trigger: when the agent's
session_timeout_minutesexpires (default 30 min), ifcsat_enabled=trueand an active question set exists, the survey fires. - Versioning: editing questions creates a new version; the previous one is archived. Existing responses keep pointing at their original version — aggregates never mix versions.
- Multi-language parser: the parser accepts "1/5", "⭐⭐⭐⭐⭐", "five", "5 stars" for
scale_1_5; "yes", "sí", "sure", "no", "nope" foryes_no; free text foropen_text. - Snapshot: every
CSATResponseItempersists itsquestion_set_version. If you edit the set later, previous responses stay uncontaminated.
Question types
| Type | Typical use | Normalised answer |
|---|---|---|
scale_1_5 | Overall satisfaction (5 stars) | int 1-5 |
scale_1_10 | Net Promoter Score | int 0-10 |
yes_no | "Did we solve your problem?" | bool |
open_text | Qualitative feedback | str (max 500) |
Setup
Enable CSAT on an agent
From the dashboard:
- AI Agents → WhatsApp (or Email) → pick the agent.
- In the Settings tab, flip the Enable CSAT switch.
- Save.
The agent is now linked to the active question set for its channel + agent. If no question set exists, the toggle is a no-op.
Create a question set
Open the agent's CSAT editor (Settings → CSAT):
- Intro message (optional): short line before the first question, e.g. "Can you help us with 2 quick questions?".
- Question 1 — type:
scale_1_5,scale_1_10,yes_no,open_text. - Prompt: text that guides the AI when phrasing the question. E.g.
"Ask if they were satisfied with the service". The system paraphrases it in the user's language at runtime. - Repeat for 2-10 questions.
- Thank-you message (optional): e.g. "Thanks! Your feedback helps us improve."
- Save → version 1 is created. Every later edit bumps the version.
Per-question fields
| Field | Description |
|---|---|
key | Stable identifier (max 50 chars). Used in aggregates — renaming the question does NOT break the historical series as long as key is kept. |
prompt_to_ai | Text that guides Gemini when phrasing the question in the user's language. |
interpretation_hint | Optional hint for parsing answers, e.g. "accept 1-5, one-five, ⭐⭐⭐, 1/5". |
type | scale_1_5 / scale_1_10 / yes_no / open_text. |
required | If true, the agent rephrases when the user skips. Default true. |
Aggregates
The dedicated dashboard lives at Satisfaction (/satisfaction), with per-agent and per-channel views:
- Response rate:
total_completed / total_started * 100. - Average score per numeric question.
- Distribution by value (histogram for scales, yes/no split).
- Open text: paginated list of answers.
Aggregates are computed on-the-fly against the _csat_responses collection filtered by question_set_id + version. No batch job — the dashboard numbers are real-time.
Use cases
1 · WhatsApp supervisor spots a dropping agent. "north-support" agent held a 4.6 scale_1_5 average for 3 months. After a prompt change it fell to 3.9 in one week. Supervisor sees the drop, reverts the prompt, score bounces back to 4.5 in two days.
2 · Operational NPS with no external tool.
B2B company with email agents uses a single scale_1_10 question "How likely are you to recommend us?". NPS = %promoters (9-10) − %detractors (0-6) straight from the aggregate. 200 responses/month, 35% response rate.
3 · Triageable qualitative feedback.
Agent with 2 questions: scale_1_5 + open_text. Scores ≤2 get reviewed manually. The AI agent classifies open text by theme (tech issue, time complaint, positive feedback). Continuous improvement flow with zero bulk human effort.
Limits and assumptions
- Survey fires on idle timeout, not when the user says "thanks, bye". If the conversation stays open 30 minutes without closure, it still fires.
- Max 10 questions per set. Beyond that, response rate collapses.
- The answer parser is forgiving but not infallible. Ambiguous replies are stored as raw text in
CSATAnswer.textwithvalue = null. - Aggregates do NOT mix versions. To see historical evolution after a question change, compare versions side-by-side — the system doesn't combine them.
- CSAT runs per-channel only: no cross-channel survey (email + WhatsApp into one unified set).
Key benefits
- Satisfaction measured where the conversation happens → 10-20× higher response rate than a separate email survey.
- Automatic versioning: every question change is archived, aggregates stay comparable by version.
- No external service: no SurveyMonkey or Typeform bill. Everything lives in the platform.
- Tolerant parser for natural user styles (emojis, numbers, words).
- Per-conversation traceability: every answer points to its
conversation_idfor audit.
Operational Dashboard
Real-time aggregated KPIs: alarms by severity, tasks by status, trends, anomalies, SLA, and heat maps. Comprehensive view of the operational health of your entire fleet.
Conversation Authentication
Conversation authentication allows the agent to verify the user's identity before responding with sensitive information. The agent requests an identifying piece of data and validates the user against a configured database.