Lewati ke isi

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_interestowner_source = program_match. Kalau user ganti program di percakapan berikutnya, cluster otomatis pindah.
  • Jika intent want_register ter-deteksi + contact sudah captured → owner_source upgrade ke register_intent, cluster di-lock (owner_locked_at = NOW()). Perubahan program_match di 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):

  1. Frustrated user → counselor — fires saat sentiment = frustrated (priority: high)
  2. Long conversation no resolution — fires saat message count > 15 dan stage masih inquiry (priority: medium)
  3. Hot lead notification — fires saat lead_score ≥ 80 (notify-only, tidak escalate)

Rule pertama dan kedua: action = escalateconversations.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_source jadi manual, 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