Sentiment Analysis

SkillDev tools

Analyze customer sentiment across CSM cases, communications, and interactions to track sentiment progression, identify escalation patterns, and flag at-risk cases

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Sentiment Analysis skill

What this skill tells your AI

The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/csm/sentiment-analysis/SKILL.md and read by ahel’s review.

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, or csm_admin
  • Access: Read access to sn_customerservice_case, interaction, sys_journal_field, sys_email, customer_account, csm_consumer, and sn_customerservice_sla tables
  • 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-Get-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 IndicatorsNeutral IndicatorsPositive Indicators
frustrated, unacceptablefollowing up, checking inthank you, appreciate
disappointed, angryany update, statusexcellent, great job
escalate, managerwhen will, timelineresolved, working now
unresolved, still brokencan you confirmhelpful, impressed
worst, terrible, awfulneed more inforecommend, satisfied
cancel, legal, lawsuitplease adviseabove and beyond
wasting my timelooking forwardquick response
incompetent, uselessper our discussionkeep up the good work

Risk Factor Scoring:

FactorScoreCondition
SLA Breached+3Any SLA in breached state
Escalation Active+2Escalation level > 0
Reopen Count > 0+2Case has been reopened
Reassignment Count > 3+1Multiple team handoffs
Negative Email Tone+2Per negative email detected
High Priority (P1/P2)+1Priority is 1 or 2
Multiple Cases Open+1Customer has > 2 open cases
Case Age > 7 days+1Case 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

ToolWhen to Use
SN-Natural-Language-SearchSearch for cases by sentiment-related keywords or descriptions
SN-Query-TableRetrieve communications, case history, SLA data
SN-Get-RecordFetch individual case or account records

REST API Reference

EndpointMethodPurpose
/api/now/table/sn_customerservice_caseGETCase details and history
/api/now/table/sys_journal_fieldGETCustomer comments and work notes
/api/now/table/sys_emailGETEmail communications
/api/now/table/interactionGETChat and phone interactions
/api/now/table/interaction_entryGETChat transcript messages
/api/now/table/sn_customerservice_slaGETSLA compliance data
/api/now/table/customer_accountGETAccount tier and health
/api/now/table/csm_consumerGETConsumer 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 context
  • csm/chat-recommendation - Use sentiment to calibrate chat response tone
  • csm/email-recommendation - Adjust email tone based on sentiment findings
  • csm/activity-response - Generate sentiment-aware activity responses
  • reporting/survey-analysis - CSAT reporting and trend analysis

Signals

GitHub stars
37
Forks
13
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
csm-sentiment-analysis
Source
github.com/happy-technologies-llc/happy-platform-skills