Lead skorlama: 0-100 puan sistemini nasıl kurduk
LeadsUp'ın heuristic + AI hibrit lead scoring motorunun engineering hikayesi. Hangi sinyaller hangi puanları getiriyor, niye monotonic, threshold neden 70.
Altai Engineering
Platform Engineering
Problem
Bir emlak ofisi günde ~80 WhatsApp mesajı alıyor. Bunların kabaca 3'ü gerçek alıcı, kalanı meraklı/fiyat sorgulayan/zaman geçiren trafik. Satıcı temsilcileri 8 saatlerini ortalama bir leadle harcayıp gerçek alıcıyı kaçırıyor.
Hipotez: Her konuşmaya 0-100 arası bir "alım niyeti skoru" verebilirsek, ekibin zamanını otomatik triajlayabiliriz. Yüksek skorlu lead → öncelikli, düşük → nurture listesi.
Sinyaller — niye bu altısı
İki ay süren manuel etiketleme + retrospective analiz sonucu 6 sinyal'in conversion ile en güçlü korelasyona sahip olduğunu bulduk:
| Sinyal | Puan | Detection |
|---|---|---|
| Bütçe net | +20 | update_user_profile tool'unda budget_min veya budget_max set |
| Lokasyon net | +15 | preferred_districts array dolu |
| Görme isteği | +30 | schedule_viewing tool çağırıldı VEYA "randevu", "görmek istiyorum" keyword |
| Engagement | +10 | 3+ inbound message |
| Satın alma sinyali | +20 | "kapora", "hemen alırım", "anlaştık" gibi keyword |
| İlan detayı sorgu | +5 | get_listing_details tool çağırıldı |
Toplam: 100 puan.
Niye 70 threshold
Retrospective dataset (8.000 lead, 6 ay):
- Skor 0-30 → conversion %2 (cold)
- Skor 30-70 → conversion %8 (warm, nurture)
- Skor 70-100 → conversion %34 (hot, immediate handoff)
70 puanda 9.3 kat conversion uplift. Eşik bu olarak sabitlendi.
Monotonik niye?
İlk versiyon her mesajda skoru yeniden hesaplıyordu. Sorun: müşteri "merhaba" derken skor 100, sonra "şaka şaka" deyince 0 düşüyordu. Score volatility = satıcı görevden yığılma.
Çözüm: Skor sadece artar, hiç düşmez. Bot her mesajdan sonra:
const finalScore = Math.max(score, input.currentScore);
Bu, hot lead'in soğumasını engelliyor. Sonraki mesajlarda yeni sinyal yakalanmasa bile threshold üstünde kalıyor → satıcı atanmış kalıyor.
Crossed threshold event'i
70'i aşma anında audit log + Slack alarm:
const crossedThreshold = input.currentScore < 70 && finalScore >= 70;
if (crossedThreshold) {
await appendAudit({ tenantId, eventType: "high_lead_detected", ... });
}
Bu event Slack #sales channel'a düşüyor: "Sıcak lead — Ahmet Yılmaz, ₺3M bütçe, Kadıköy, görme istemiş. Konuşmaya git →"
Satıcı 30 saniye içinde devralıyor.
Sinyaller hangi senaryoda?
Real-world test data (anonimleştirilmiş):
Senaryo 1: "Merhaba, Kadıköy'de 2+1 daire var mı?"
- Lokasyon (+15), Engagement (1 msg, 0). Toplam: 15.
Senaryo 2: "Kadıköy'de 4 milyona kadar 2+1 ararım, hafta sonu görebilir miyim?"
- Bütçe (+20), Lokasyon (+15), Görme isteği (+30), Engagement (1 msg, 0). Toplam: 65 (sınırda).
Senaryo 3: Yukarıdakinden 5 mesaj sonra "Karadağ'dakini görebilir miyim, kapora yatırabilirim"
- Bütçe + Lokasyon + Görme + Engagement (5+) + Satın alma sinyali = 95. Hot.
False positive'ler
Halüsinasyon guard ile entegrasyon: bot bir fiyat söylerse → DB'den doğrula → eşleşmiyorsa lead skoru otomatik düşmez ama "guard tripped" işareti event'e eklenir, satıcı bu lead'i daha dikkatli inceler.
Lead skoru false positive %12 (1.000 hot lead'de 120'si "soğuk çıktı"). Sektör ortalaması %25-30; biz sektör altındayız.
Sektör-bazlı varyantlar
8 sektör için ayrı sinyal seti (portal/content/sektor/*.ts):
- Emlak: budget + location + viewing (yukarıdaki)
- E-ticaret: cart_added + checkout_viewed + repeat_visitor
- Sağlık: appointment_requested + symptom_described + insurance_match
- Eğitim: price_asked + installment_inquiry + parent_consent
- vb.
Her şablon lead-score.ts'i extend ediyor. Tenant ilk onboarding'de seçtiği sektöre göre default sinyal seti yüklü.
İleriye dönük: AI-driven sinyal
Şu an heuristic. v7'de Claude Haiku 4.5 ile intent classifier ekleyeceğiz: konuşmayı okuyup "alıcı/araştırmacı/spam" kategorize edecek. Heuristic skoru +AI sınıflandırması = blended score.
Ama heuristic'i de tutuyoruz; AI black box, retrospektif explain edilemez. Heuristic transparant ve audit'lenebilir — KVKK compliance + satıcı güveni açısından kritik.
Try it
/dashboard/leads sayfasında her konuşmanın skor + sinyal breakdown'unu görüyorsunuz. 70+ skor otomatik "hot lead" filter'a düşer. Sandbox modunda gerçek dataset olmadan test edebilirsin.
İlgili yazılar
Halüsinasyon koruması: bot uydurmadan nasıl konuşur
LLM tabanlı bot'lar fiyat, stok, randevu saati uydurma riski taşır. LeadsUp'ın post-processing guard'ı bu riski sıfıra indiren bir doğrulama katmanı.
OkuTürkiye'de WhatsApp pazarlama compliance — 2026 saha rehberi
ETK (Elektronik Ticaret Kanunu) onay, IYS kayıt, KVKK aydınlatma, Meta opt-in kuralları. WhatsApp broadcast yaparken bilmeniz gereken 7 kanun + pratik notlar.
OkuWhatsApp Business API 2026 Türkiye rehberi
WhatsApp Business API başvuru, Meta Business Manager kurulumu, BSP seçimi, template onayı ve 24 saat penceresi — Türk işletmeleri için adım adım.
Oku