csm-sentiment-analysis
Sentiment Analysis
Overview
This skill provides a systematic approach to analyzing customer sentiment across CSM case communications and interactions. It helps you:
- Collect and analyze all customer-facing communications (emails, chat transcripts, comments, portal submissions)
- Assess sentiment polarity (positive, neutral, negative) and intensity across each communication
- Track sentiment progression over the case lifecycle to identify trends (improving, stable, deteriorating)
- Detect escalation risk indicators such as repeated contacts, negative language patterns, and SLA breaches
- Flag at-risk cases and accounts that require immediate attention or proactive outreach
- Provide sentiment scoring for account health dashboards and management reporting
When to use: When a CSM manager needs to assess customer satisfaction trends, when triaging cases for priority, when identifying accounts at churn risk, or when evaluating agent performance based on customer outcomes.
Prerequisites
- Roles:
sn_customerservice_agent,sn_customerservice_manager, orcsm_admin - Access: Read access to
sn_customerservice_case,interaction,sys_journal_field,sys_email,customer_account,csm_consumer, andsn_customerservice_slatables - Knowledge: Understanding of sentiment analysis concepts, CSM case lifecycle, and your organization's escalation policies
Procedure
Step 1: Retrieve the Case and Customer Context
Fetch the case record and customer information to establish baseline context.
Using MCP (Claude Code/Desktop):
Tool: SN-Read-Record
Parameters:
table_name: sn_customerservice_case
sys_id: [case_sys_id]
fields: number,short_description,description,state,priority,urgency,impact,category,subcategory,contact,account,consumer,product,opened_at,opened_by,resolved_at,closed_at,escalation,severity,reassignment_count,reopen_count,contact_type,sla_due
Tool: SN-Query-Table
Parameters:
table_name: customer_account
query: sys_id=[account_sys_id]
fields: sys_id,name,customer_tier,industry,notes
limit: 1
Using REST API:
GET /api/now/table/sn_customerservice_case/{case_sys_id}?sysparm_fields=number,short_description,description,state,priority,urgency,impact,category,subcategory,contact,account,consumer,product,opened_at,escalation,severity,reassignment_count,reopen_count,contact_type,sla_due&sysparm_display_value=true
GET /api/now/table/customer_account/{account_sys_id}?sysparm_fields=name,customer_tier,industry,notes&sysparm_display_value=true
Step 2: Collect Customer Comments and Communications
Retrieve all customer-facing comments (additional comments / customer-visible entries).
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_journal_field
query: element_id=<case_sys_id>^element=comments^ORDERBYsys_created_on
fields: sys_id,value,sys_created_on,sys_created_by,element
limit: 100
Using REST API:
GET /api/now/table/sys_journal_field?sysparm_query=element_id=<case_sys_id>^element=comments^ORDERBYsys_created_on&sysparm_fields=value,sys_created_on,sys_created_by,element&sysparm_limit=100
Step 3: Retrieve Email Communications
Pull inbound emails from the customer for sentiment analysis.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_email
query: instance=<case_sys_id>^type=received^ORDERBYsys_created_on
fields: sys_id,subject,body_text,sys_created_on,sys_created_by,importance,type
limit: 30
Using REST API:
GET /api/now/table/sys_email?sysparm_query=instance=<case_sys_id>^type=received^ORDERBYsys_created_on&sysparm_fields=subject,body_text,sys_created_on,importance,type&sysparm_limit=30&sysparm_display_value=true
Step 4: Retrieve Chat and Interaction Transcripts
Pull chat interaction entries for analysis.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: interaction
query: parent=<case_sys_id>^ORDERBYsys_created_on
fields: sys_id,number,channel,state,opened_at,closed_at,short_description
limit: 20
For each chat interaction, retrieve the transcript:
Tool: SN-Query-Table
Parameters:
table_name: interaction_entry
query: interaction=<interaction_sys_id>^ORDERBYsys_created_on
fields: sys_id,message,type,sys_created_on,sys_created_by,initiated_from
limit: 100
Using REST API:
GET /api/now/table/interaction?sysparm_query=parent=<case_sys_id>^ORDERBYsys_created_on&sysparm_fields=sys_id,number,channel,state,opened_at,closed_at&sysparm_limit=20&sysparm_display_value=true
GET /api/now/table/interaction_entry?sysparm_query=interaction=<interaction_sys_id>^ORDERBYsys_created_on&sysparm_fields=message,type,sys_created_on,sys_created_by&sysparm_limit=100
Step 5: Check SLA Compliance and Escalation History
SLA breaches and escalations are strong sentiment indicators.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_sla
query: task=<case_sys_id>
fields: sys_id,sla,stage,has_breached,planned_end_time,percentage,business_percentage,start_time,end_time
limit: 10
Using REST API:
GET /api/now/table/sn_customerservice_sla?sysparm_query=task=<case_sys_id>&sysparm_fields=sla,stage,has_breached,planned_end_time,percentage,business_percentage&sysparm_limit=10&sysparm_display_value=true
Step 6: Analyze Customer's Case History for Patterns
Check if the customer has a pattern of negative experiences across multiple cases.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: consumer=[consumer_sys_id]^ORDERBYDESCopened_at
fields: number,short_description,state,priority,escalation,reopen_count,reassignment_count,opened_at,closed_at,resolution_code
limit: 20
Using REST API:
GET /api/now/table/sn_customerservice_case?sysparm_query=consumer=<consumer_sys_id>^ORDERBYDESCopened_at&sysparm_fields=number,short_description,state,priority,escalation,reopen_count,reassignment_count,opened_at,closed_at,resolution_code&sysparm_limit=20&sysparm_display_value=true
Step 7: Perform Sentiment Analysis and Generate Report
Analyze all collected communications for sentiment indicators and produce a structured assessment.
Sentiment Indicator Keywords:
| Negative Indicators | Neutral Indicators | Positive Indicators |
|---|---|---|
| frustrated, unacceptable | following up, checking in | thank you, appreciate |
| disappointed, angry | any update, status | excellent, great job |
| escalate, manager | when will, timeline | resolved, working now |
| unresolved, still broken | can you confirm | helpful, impressed |
| worst, terrible, awful | need more info | recommend, satisfied |
| cancel, legal, lawsuit | please advise | above and beyond |
| wasting my time | looking forward | quick response |
| incompetent, useless | per our discussion | keep up the good work |
Risk Factor Scoring:
| Factor | Score | Condition |
|---|---|---|
| SLA Breached | +3 | Any SLA in breached state |
| Escalation Active | +2 | Escalation level > 0 |
| Reopen Count > 0 | +2 | Case has been reopened |
| Reassignment Count > 3 | +1 | Multiple team handoffs |
| Negative Email Tone | +2 | Per negative email detected |
| High Priority (P1/P2) | +1 | Priority is 1 or 2 |
| Multiple Cases Open | +1 | Customer has > 2 open cases |
| Case Age > 7 days | +1 | Case open longer than expected |
Risk Levels:
- Score 0-2: Low Risk (Green)
- Score 3-5: Medium Risk (Yellow)
- Score 6-8: High Risk (Orange)
- Score 9+: Critical Risk (Red)
Output Report:
=== SENTIMENT ANALYSIS REPORT ===
Case: [number] | Customer: [name] | Account: [account_name]
Account Tier: [tier] | Case Age: [days] days
Analysis Date: [current_date]
OVERALL SENTIMENT: [Positive/Neutral/Negative]
RISK SCORE: [score]/15 ([Low/Medium/High/Critical])
TREND: [Improving/Stable/Deteriorating]
COMMUNICATION SENTIMENT TIMELINE:
Date | Channel | Sentiment | Key Indicators
-----------+---------+-----------+------------------
[date_1] | Email | Negative | "frustrated", "unacceptable"
[date_2] | Chat | Negative | "still not working", "escalate"
[date_3] | Email | Neutral | "any update on timeline"
[date_4] | Comment | Positive | "thank you for the update"
SENTIMENT PROGRESSION:
[date_1] ████████░░ Negative (-0.7)
[date_2] ███████░░░ Negative (-0.6)
[date_3] █████░░░░░ Neutral (-0.1)
[date_4] ███░░░░░░░ Positive (+0.4)
Trend: IMPROVING ↑
RISK FACTORS:
[✓] SLA Breached (Response SLA) .............. +3
[✓] Escalation Level 1 ...................... +2
[✗] Case Reopened ............................ +0
[✓] Reassignment Count: 4 ................... +1
[✓] Negative Communications: 2 .............. +4
[✗] High Priority ............................ +0
[✗] Multiple Open Cases ..................... +0
[✓] Case Age: 12 days ....................... +1
Total: 11 (CRITICAL)
ACCOUNT HEALTH INDICATORS:
- Total Cases (90 days): [count]
- Open Cases: [count]
- Average Resolution Time: [days]
- Escalation Rate: [percentage]%
- Reopen Rate: [percentage]%
KEY OBSERVATIONS:
1. [observation about sentiment trend]
2. [observation about risk factors]
3. [observation about account health]
RECOMMENDED ACTIONS:
1. [action based on sentiment analysis]
2. [action based on risk score]
3. [action based on account health]
Tool Usage
MCP Tools Reference
| Tool | When to Use |
|---|---|
SN-NL-Search |
Search for cases by sentiment-related keywords or descriptions |
SN-Query-Table |
Retrieve communications, case history, SLA data |
SN-Read-Record |
Fetch individual case or account records |
REST API Reference
| Endpoint | Method | Purpose |
|---|---|---|
/api/now/table/sn_customerservice_case |
GET | Case details and history |
/api/now/table/sys_journal_field |
GET | Customer comments and work notes |
/api/now/table/sys_email |
GET | Email communications |
/api/now/table/interaction |
GET | Chat and phone interactions |
/api/now/table/interaction_entry |
GET | Chat transcript messages |
/api/now/table/sn_customerservice_sla |
GET | SLA compliance data |
/api/now/table/customer_account |
GET | Account tier and health |
/api/now/table/csm_consumer |
GET | Consumer profile data |
Best Practices
- Analyze all channels: Customer sentiment may differ across email, chat, and portal; aggregate all channels for an accurate picture
- Weight recent communications higher: The most recent interaction is more indicative of current sentiment than older ones
- Consider context: A terse message may be neutral rather than negative; always consider the full conversation thread
- Track sentiment over time: A single negative message is less concerning than a sustained downward trend
- Cross-reference with metrics: Combine sentiment analysis with SLA data, reassignment counts, and reopen counts for a holistic view
- Account-level aggregation: Individual case sentiment should roll up to an account-level health score
- Flag proactively: Don't wait for explicit escalation requests; flag cases where sentiment is deteriorating before the customer escalates
- Respect cultural differences: Tone and directness vary by culture; avoid false positives from direct communication styles
- Document findings: Record sentiment analysis results as work notes for team awareness
Troubleshooting
"No customer comments found"
Cause: The case may use work notes exclusively, or comments may be stored in a different field
Solution: Check both element=comments and element=work_notes in sys_journal_field. Also check sys_email for customer communications. Some organizations use custom journal fields.
"Chat transcripts are empty"
Cause: Chat messages may be in a different table depending on the messaging framework
Solution: Try querying live_message table: sysparm_query=group=<interaction_sys_id>. Also check sys_cs_message for Customer Service Messaging (CSM) chats.
"Sentiment analysis seems inaccurate"
Cause: Automated keyword-based analysis may miss sarcasm, context, or domain-specific language Solution: Supplement keyword detection with contextual analysis. Look at the full conversation thread rather than individual messages. Check for follow-up messages that clarify intent.
"Account health data incomplete"
Cause: Historical cases may have been archived or the consumer record may not link all cases
Solution: Query cases by both consumer and account fields to capture all related cases. Check contact field as well since some cases may link to customer_contact instead of csm_consumer.
Examples
Example 1: Single Case Sentiment Analysis
Scenario: Analyze sentiment for a billing dispute case that has been open for 10 days.
Step 1 - Get case:
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: number=CS0090100
fields: sys_id,number,short_description,state,priority,escalation,contact,account,consumer,opened_at,reopen_count,reassignment_count,sla_due
limit: 1
Step 2 - Get customer emails:
Tool: SN-Query-Table
Parameters:
table_name: sys_email
query: instance=<sys_id>^type=received^ORDERBYsys_created_on
fields: body_text,sys_created_on,subject
limit: 20
Step 3 - Check SLA:
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_sla
query: task=<sys_id>
fields: sla,stage,has_breached,percentage
limit: 5
Output:
SENTIMENT ANALYSIS - CS0090100 (Billing Dispute)
Customer: Robert Chen | Account: Meridian Inc. (Gold)
OVERALL SENTIMENT: Negative (deteriorating)
RISK SCORE: 9/15 (CRITICAL)
TIMELINE:
Mar 09 | Email | Neutral | "I noticed an incorrect charge..."
Mar 12 | Email | Negative | "I haven't heard back, this is urgent"
Mar 15 | Email | Negative | "This is unacceptable, 6 days with no response"
Mar 18 | Email | Negative | "I'm considering escalating to management"
RISK FACTORS: SLA Breached (+3), Negative emails x3 (+6)
TREND: Deteriorating ↓
RECOMMENDED ACTIONS:
1. Immediate manager outreach call to Robert Chen
2. Fast-track billing adjustment with finance team
3. Provide concession or credit for service failure
Example 2: Account-Level Sentiment Dashboard
Scenario: Generate sentiment overview for all open cases under a key account.
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: account=[account_sys_id]^stateNOT IN6,7,8^ORDERBYpriority
fields: sys_id,number,short_description,state,priority,escalation,contact,opened_at,reopen_count,reassignment_count
limit: 50
Output:
ACCOUNT SENTIMENT DASHBOARD - GLOBEX CORPORATION
Tier: Platinum | Open Cases: 7 | Avg Age: 8.3 days
CASE SENTIMENT SUMMARY:
Case | Priority | Age | Sentiment | Risk
-----------+----------+------+-----------+--------
CS0089001 | P1 | 3d | Negative | HIGH
CS0089234 | P2 | 5d | Neutral | MEDIUM
CS0089500 | P2 | 12d | Negative | CRITICAL
CS0089801 | P3 | 7d | Neutral | LOW
CS0090010 | P3 | 2d | Positive | LOW
CS0090150 | P3 | 14d | Negative | HIGH
CS0090200 | P4 | 1d | Neutral | LOW
ACCOUNT HEALTH: AT RISK
- 3 of 7 cases have negative sentiment
- 1 case in critical risk state
- Escalation rate: 28% (above 15% threshold)
RECOMMENDED: Schedule account review with CSM manager
Related Skills
csm/case-summarization- Summarize case details for sentiment contextcsm/chat-recommendation- Use sentiment to calibrate chat response tonecsm/email-recommendation- Adjust email tone based on sentiment findingscsm/activity-response- Generate sentiment-aware activity responsesreporting/customer-satisfaction- CSAT reporting and trend analysis
More from happy-technologies-llc/happy-platform-skills
happy-platform-skills
Reusable development patterns and automation recipes for enterprise platforms - 180+ skills across 23 categories
17scheduled-jobs
Comprehensive guide to creating and managing ServiceNow scheduled jobs - run frequencies, conditional execution, performance optimization, error handling, and debugging
4flow-generation
Generate ServiceNow Flow Designer flows from natural language descriptions including triggers, actions, conditions, subflows, approval flows, notification flows, and data manipulation flows
4application-scope
Manage scoped application development including setting application context and update set alignment
4scripted-rest-apis
Comprehensive guide to creating, securing, and testing Scripted REST APIs in ServiceNow for custom integrations and external system connectivity
4automated-testing
Comprehensive Automated Test Framework (ATF) guide for creating, managing, and executing automated tests in ServiceNow
4