Escalation — Routing & Team Ownership
Tujuan
Halaman ini menjelaskan cara kerja Escalation Routing di HUPH: model ownership cluster, kapan escalation terjadi, bagaimana notifikasi di-route ke counselor yang tepat, dan cara reassign cluster. Target pembaca: counselor, marketing staff, dan admin yang mengatur alokasi team.
Prasyarat
- Login dengan role yang sesuai (counselor cluster, marketing_staff, marketing_admin, atau admin)
- Paham Leads pipeline dan Inbox
5 Cluster dan Tim Counselor
HUPH mengorganisir prodi UPH ke 5 cluster akademik:
| Cluster Code | Cluster Name |
|---|---|
| CASS | College of Arts & Social Sciences |
| CBT | College of Business & Technology |
| CHS | College of Health Sciences |
| CIST | College of Information Science & Technology |
| CNE | College of Nursing & Education |
Setiap cluster punya counselor dengan role marketing_counselor dan
cluster code sendiri. Selain counselor per-cluster, ada dua role
global: marketing_staff dan marketing_admin yang menerima semua
notifikasi.
Model Ownership (Hybrid-lite)
Setiap lead punya cluster_id dan owner_source yang menentukan
siapa yang "memiliki" lead itu. Tiga owner_source:
| owner_source | Arti | Prioritas |
|---|---|---|
| program_match | Auto — dari program yang disebut user | Paling lemah (fluid) |
| register_intent | Auto — dari intent "want_register" di chat | Kuat (locks) |
| manual | Admin override via UI | Paling kuat (always wins) |
Truth table:
- Lead baru masuk → cluster di-resolve dari
program_interest→owner_source = program_match. Kalau user ganti program di percakapan berikutnya, cluster otomatis pindah. - Jika intent
want_registerter-deteksi + contact sudah captured →owner_sourceupgrade keregister_intent, cluster di-lock (owner_locked_at = NOW()). Perubahanprogram_matchdi masa depan tidak akan flip cluster lagi. - Admin klik Reassign di UI →
owner_source = manual+ lock. Ini final — hanya admin lain yang bisa ubah.
Kapan Escalation Terjadi
Ada 3 seeded escalation rules (bisa ditambah di /admin/settings/
escalation-rules):
- Frustrated user → counselor — fires saat sentiment = frustrated (priority: high)
- Long conversation no resolution — fires saat message count > 15 dan stage masih inquiry (priority: medium)
- Hot lead notification — fires saat lead_score ≥ 80 (notify-only, tidak escalate)
Rule pertama dan kedua: action = escalate → conversations.status
flip ke escalated, bot pause, notifikasi dikirim ke cluster
counselor + global recipients.
Rule ketiga: action = notify → status TIDAK berubah, hanya notifikasi
fire (bot tetap lanjut).
Dua Jenis Notifikasi
| Kind | Judul | Kapan |
|---|---|---|
| escalation | "Escalation: |
Rule escalate fires |
| notify | "Lead panas: |
Rule notify fires |
Langkah-langkah
1. Lihat notifikasi masuk
Notifikasi muncul di bell icon di header admin dashboard. Klik untuk buka panel yang menampilkan list escalation + hot lead. Baris baru muncul realtime via Socket.io (tanpa refresh).
┌─────────────────────────────────────────────┐
│ 🔔 3 new │
│ │
│ ⚠ Escalation: Minta bantuan manusia │
│ Cluster CBT • 2 menit lalu │
│ │
│ 🔥 Lead panas: Rudi H. │
│ Score 85 — Teknik Informatika • 5m lalu │
│ │
│ ⚠ Escalation: Complaint │
│ Cluster CASS • 15m lalu │
└─────────────────────────────────────────────┘
2. Scope notifikasi per role
Siapa dapat notifikasi apa?
- marketing_counselor (cluster X) → hanya escalation untuk cluster X + hot lead untuk cluster X
- marketing_staff → semua escalation dan hot lead (global)
- marketing_admin → semua (global)
Kalau cluster_id NULL (legacy/unresolvable lead), notifikasi hanya ke marketing_staff + marketing_admin.
3. Reassign cluster dari detail lead
Kadang counselor dari cluster A realize lead seharusnya milik cluster
B (mis. user sebut "tertarik Bisnis" tapi cluster resolver salah
match). Dari halaman detail lead /admin/leads-v2/[id]:
- Lihat cluster badge + owner_source label di header ("Otomatis via program" / "Otomatis via daftar" / "Manual oleh admin")
- Klik dropdown Reassign → pilih cluster baru (5 clusters + "Lepas/unassign")
- ConfirmDialog muncul ("Apakah Anda yakin?") → konfirmasi
owner_sourcejadimanual,owner_locked_at=NOW— lock final
Perubahan propagate ke conversations.cluster_id via trigger — conver-
sation yang terkait langsung pindah ke room Socket.io cluster baru.
4. Filter leads per cluster
Di /admin/leads-v2, filter chip row pertama menampilkan cluster
counts: CASS(10) CBT(11) CHS(4) CIST(0) CNE(0) unassigned(3). Klik
satu untuk filter. Counselor dari cluster X akan melihat badge
counts yang sama tapi hanya bisa akses cluster X-nya sendiri (setelah
Phase 1.5 RBAC aktif).
5. Counselor dashboard view
Setiap counselor punya halaman /admin/counselor-dashboard (Phase
1.6) yang menampilkan:
- Hanya lead dari cluster counselor
- Queue escalation pending yang butuh action
- KPI counselor: conversion rate, response time, leads contacted
- Shortcut ke inbox dengan filter cluster
Contoh kasus
User chat "saya mau daftar" — cluster locked. Rudi chat via WA, awalnya tanya program Animasi (cluster CASS), lalu kasih nama+phone dan bilang "saya mau daftar". Flow: pre-pass upsert → cluster CASS + program_match. Post-dispatch register_intent detected + contact captured → upsert kedua → cluster stays CASS tapi owner_source upgrade ke register_intent, locked. Jika Rudi nanti menyebut program CBT, cluster tidak akan flip.
Admin reassign dari CBT ke CHS. Marketing admin lihat di detail lead bahwa lead "Budi Santoso" di-cluster CBT karena menyebut "Bisnis", padahal sebenarnya intent Budi adalah "Kedokteran" (CHS). Admin klik Reassign → CHS → confirm. Lead sekarang CHS + manual. Counselor CHS dapat notifikasi baru di queue-nya; counselor CBT tidak lagi punya akses.
Troubleshooting
Counselor tidak dapat notifikasi walaupun lead di-cluster mereka.
Gejala: lead CBT escalated tapi counselor CBT tidak melihat bell
icon update. Penyebab: cluster_id di conversations NULL (propaga-
tion trigger tidak jalan), atau counselor belum login saat event
fire. Solusi: klik detail lead di list → verifikasi cluster badge →
kalau NULL, reassign manual. Kalau sudah benar, refresh dashboard.
Cluster salah assignment untuk program yang seharusnya jelas.
Gejala: user sebut "Teknik Informatika" tapi di-cluster CASS (harusnya
CIST). Penyebab: cluster_programs mapping di DB incomplete — program
name tidak match exact atau prefix. Solusi: admin reassign manual;
lapor dev team untuk update cluster_programs table.
Notifikasi duplicate dari 2 rule fires. Gejala: user frustrated +
long conversation → 2 notifikasi untuk event yang sama. Penyebab:
dedup sudah aktif per April 2026 dengan window 30 detik (composite
index (user_id, event_key, created_at)), tapi jika event_key
tidak ter-set dengan benar oleh rule engine, notifikasi bisa tetap
double. Solusi: lapor ke dev team dengan timestamp dan cluster ID —
mereka akan cek apakah event_key normalization ada di rule yang
fire. Commit referensi: 8ce2c28 fix(notifications): dedup
rapid-fire fanout within 30s window.
"Unauthorized" saat buka detail lead dari cluster lain. Gejala: counselor CBT klik lead cluster CASS dari link di notifikasi → error 403. Penyebab: RBAC Phase 1.5 aktif — counselor hanya boleh akses cluster sendiri. Solusi: hubungi admin untuk assignment atau reassign.
Lihat juga
- Inbox — Take Over flow yang men-trigger escalation
- Leads pipeline — cluster filter dan detail lead
- Troubleshooting — masalah lain di dashboard