CS Otomatis WA dengan Sentiment Analysis
Setup CS otomatis WhatsApp dengan sentiment analysis. Detect customer mood, prioritize angry customers, personalize response!
Detect mood customer sebelum terlambat!
Sentiment analysis memungkinkan bot mengenali emosi customer dan respond appropriately - prioritaskan yang marah, apresiasi yang senang.
Apa itu Sentiment Analysis?
🧠 DEFINISI:
Sentiment Analysis = AI yang menganalisis
teks untuk mendeteksi emosi/mood
INPUT: "Kok lama banget sih pesanannya!"
OUTPUT: Sentiment = NEGATIF (frustrated)
INPUT: "Wah bagus banget barangnya!"
OUTPUT: Sentiment = POSITIF (happy)
INPUT: "Kapan ya barang sampai?"
OUTPUT: Sentiment = NETRAL (inquiry)Manfaat Sentiment Analysis
📊 BENEFITS:
1. PRIORITIZE URGENT
• Customer marah → Eskalasi cepat
• Customer frustrated → Extra attention
2. PERSONALIZE RESPONSE
• Positif → Apresiasi & upsell
• Negatif → Empati & solusi
• Netral → Standard response
3. PREVENT ESCALATION
• Detect frustration early
• Intervene sebelum marah
4. MEASURE SATISFACTION
• Track sentiment trend
• Identify problem areasSentiment Categories
😊 POSITIF:
- "Bagus banget!"
- "Terima kasih, puas!"
- "Recommended seller!"
- "Fast response, mantap!"
😐 NETRAL:
- "Kapan barang sampai?"
- "Ada warna lain?"
- "Berapa harganya?"
- "Bisa COD tidak?"
😠 NEGATIF:
- "Lama banget!"
- "Kok belum sampai sih!"
- "Barangnya rusak!"
- "Mengecewakan!"
🚨 URGENT/CRISIS:
- "Mau refund!"
- "Saya akan report!"
- "Penipuan!"
- Kata-kata kasarResponse by Sentiment
Positive Response:
😊 DETECTED: POSITIF
Customer: "Wah barangnya bagus banget,
sesuai ekspektasi! Packing juga rapi.
Puas deh belanja di sini!"
BOT RESPONSE:
━━━━━━━━━━━━━━━━━━━━
Waaah, senangnya dengar kakak puas! 🥰
Terima kasih banyak untuk feedback-nya!
Ini bikin tim kami makin semangat! 💪
Btw, kalau kakak suka [PRODUK],
mungkin tertarik juga dengan [PRODUK LAIN]?
🎁 Special untuk kakak:
Diskon 15% untuk next order!
Kode: THANKYOU15
Ditunggu order berikutnya ya! 💕
━━━━━━━━━━━━━━━━━━━━
ACTION:
✅ Tag sebagai happy customer
✅ Request review
✅ Offer cross-sellNeutral Response:
😐 DETECTED: NETRAL
Customer: "Kapan ya pesanan saya sampai?
Order kemarin sore."
BOT RESPONSE:
━━━━━━━━━━━━━━━━━━━━
Hai Kak! 👋
Untuk cek status pesanan, boleh
kirim nomor ordernya?
Contoh: INV/20260217/xxx
Nanti kami bantu cek statusnya ya! 📦
━━━━━━━━━━━━━━━━━━━━
ACTION:
✅ Standard inquiry handling
✅ No escalation neededNegative Response:
😠 DETECTED: NEGATIF
Customer: "Udah seminggu barang belum
sampai! Gimana sih ini, payah!"
BOT RESPONSE:
━━━━━━━━━━━━━━━━━━━━
Mohon maaf banget Kak! 🙏
Kami paham kakak pasti kecewa.
Ini bukan pengalaman yang seharusnya.
Boleh kirim nomor order?
Tim kami akan PRIORITASKAN pengecekan
dan kabari update dalam 30 menit!
Sekali lagi mohon maaf ya kak 😔
━━━━━━━━━━━━━━━━━━━━
ACTION:
⚠️ Flag sebagai priority
⚠️ Notify CS team
⚠️ Follow up dalam 30 menitUrgent/Crisis Response:
🚨 DETECTED: URGENT/CRISIS
Customer: "INI PENIPUAN! BARANG GAK
SESUAI, MAU REFUND SEKARANG!
KALAU GAK SAYA REPORT!"
BOT RESPONSE:
━━━━━━━━━━━━━━━━━━━━
Kak, mohon maaf atas situasi ini! 🙏
Kami sangat serius menangani
keluhan kakak.
SUPERVISOR kami akan LANGSUNG
menghubungi dalam 15 MENIT.
Mohon jangan khawatir,
kami akan pastikan masalah ini
terselesaikan dengan baik.
Sambil menunggu, boleh kirim:
- Foto produk yang diterima
- Nomor order
Terima kasih atas kesabarannya 🙏
━━━━━━━━━━━━━━━━━━━━
ACTION:
🚨 IMMEDIATE ESCALATION
🚨 Alert supervisor
🚨 Log crisis ticket
🚨 15-minute SLAImplementation
Sentiment Detection:
javascript
const Sentiment = require('sentiment');
const sentiment = new Sentiment();
// Indonesian word additions
const indonesianWords = {
'bagus': 3,
'mantap': 3,
'puas': 3,
'recommended': 3,
'kecewa': -3,
'payah': -4,
'lama': -2,
'rusak': -3,
'penipuan': -5,
'refund': -2,
'marah': -4,
'report': -3
};
sentiment.registerLanguage('id', {
labels: indonesianWords
});
function analyzeSentiment(text) {
const result = sentiment.analyze(text, { language: 'id' });
let category;
if (result.score >= 3) {
category = 'positive';
} else if (result.score <= -3) {
category = 'negative';
} else if (result.score <= -5 || hasUrgentKeywords(text)) {
category = 'urgent';
} else {
category = 'neutral';
}
return {
score: result.score,
category,
words: result.words
};
}
function hasUrgentKeywords(text) {
const urgentKeywords = [
'penipuan', 'report', 'polisi', 'refund sekarang',
'tipu', 'bohong', 'lawyer', 'hukum'
];
return urgentKeywords.some(keyword =>
text.toLowerCase().includes(keyword)
);
}Response Router:
javascript
async function handleWithSentiment(phone, message) {
const sentiment = analyzeSentiment(message);
// Log sentiment
await db.conversations.updateOne(
{ phone },
{
$push: {
sentimentHistory: {
message,
sentiment: sentiment.category,
score: sentiment.score,
timestamp: new Date()
}
}
}
);
// Route based on sentiment
switch (sentiment.category) {
case 'urgent':
await escalateImmediately(phone, message);
return getUrgentResponse(message);
case 'negative':
await flagForFollowUp(phone, 'high');
await notifyCS(phone, sentiment);
return getNegativeResponse(message);
case 'positive':
await tagAsHappyCustomer(phone);
return getPositiveResponse(message);
default:
return getNeutralResponse(message);
}
}Escalation Logic:
javascript
async function escalateImmediately(phone, message) {
// Create urgent ticket
const ticket = await db.tickets.insert({
phone,
message,
priority: 'urgent',
status: 'escalated',
sla: 15, // 15 minutes
createdAt: new Date()
});
// Alert all available supervisors
const supervisors = await db.staff.find({
role: 'supervisor',
status: 'online'
});
for (const supervisor of supervisors) {
await sendAlert(supervisor.phone, {
type: 'URGENT_ESCALATION',
ticket: ticket.id,
customer: phone,
message: message.substring(0, 100)
});
}
// Set auto-reminder if not resolved
setTimeout(async () => {
const updatedTicket = await db.tickets.findById(ticket.id);
if (updatedTicket.status === 'escalated') {
await sendSLABreachAlert(ticket);
}
}, 15 * 60 * 1000); // 15 minutes
}Sentiment Dashboard
📊 SENTIMENT DASHBOARD
Today's Sentiment Distribution:
━━━━━━━━━━━━━━━━━━━━
😊 Positive: 45% ████████████░░░░░░░░
😐 Neutral: 38% ██████████░░░░░░░░░░
😠 Negative: 15% ████░░░░░░░░░░░░░░░░
🚨 Urgent: 2% █░░░░░░░░░░░░░░░░░░░
Trend (vs Yesterday):
- Positive: ↑ +5%
- Negative: ↓ -3%
⚠️ Active Urgent Cases: 2
━━━━━━━━━━━━━━━━━━━━
#TKT-001 - Refund demand (10 min ago)
#TKT-002 - Product complaint (25 min ago)
Top Negative Keywords Today:
1. "lama" (15x)
2. "belum sampai" (12x)
3. "rusak" (5x)
→ Possible issue: Shipping delaysBest Practices
DO ✅
- Respond sesuai sentiment
- Prioritize negative/urgent
- Escalate early, not late
- Track sentiment trends
- Learn from negative feedback
- Appreciate positive customersDON'T ❌
- Same response for all sentiment
- Ignore negative signals
- Delay escalation
- Argue with angry customers
- Dismiss concerns
- Over-promise to angry customersFAQ
Seberapa akurat sentiment analysis?
80-90% untuk cases jelas. Sarcasm dan bahasa campuran lebih challenging.
Perlu AI atau cukup keyword?
Keyword untuk basic, AI untuk lebih akurat. Kombinasi keduanya ideal.
Bagaimana handle false positive?
Human review untuk cases yang di-escalate. Feedback loop untuk improve model.
Kesimpulan
Sentiment-aware CS = Better experience!
| Without Sentiment | With Sentiment |
|---|---|
| Same response all | Contextual response |
| Miss angry signals | Early detection |
| Reactive | Proactive |
| Generic | Personalized |