skills/csm/sentiment-analysis/SKILL.md
Analyze customer sentiment across CSM cases, communications, and interactions to track sentiment progression, identify escalation patterns, and flag at-risk cases
npx skillsauth add happy-technologies-llc/happy-servicenow-skills csm-sentiment-analysisInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides a systematic approach to analyzing customer sentiment across CSM case communications and interactions. It helps you:
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.
sn_customerservice_agent, sn_customerservice_manager, or csm_adminsn_customerservice_case, interaction, sys_journal_field, sys_email, customer_account, csm_consumer, and sn_customerservice_sla tablesFetch 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
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
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
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
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
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
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:
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 | 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 |
| 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 |
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.
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.
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.
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.
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
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
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 analysistesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions