Proje: Okul Database · Hub: Okul Database — Tables

leads Tablosu

Lead lifecycle’ı baştan sona izleyen ana satış tablosu.


Tam Kolon Listesi

KolonTipNullableDefaultAçıklama
idincrementsNOPK
user_idunsignedIntYESNULLAtanan temsilci → users.id
first_namevarchar(255)YESNULLVelinin adı
last_namevarchar(255)YESNULLVelinin soyadı
emailvarchar(255)YESNULL(INDEX)
phonevarchar(20)YESNULL(INDEX)
school_idunsignedIntYESNULLHedef okul → schools.id (INDEX)
campus_idunsignedIntYESNULLHedef kampüs → campuses.id
customer_idunsignedIntYESNULLOkulun müşterisi → customers.id
pipeline_idintYESNULLPipedrive pipeline ID
stage_idintYESNULLPipedrive stage ID — değerler için ref-lead-stages
deal_idintYESNULLPipedrive deal ID
offer_idintYESNULLschool_offers.id (form kaynağı)
lead_pool_form_idintYESNULLlead_pool_forms.id
approved_typestring(50)YESNULLManuel onay tipi
approved_status_idintYESNULLOnay durumu → configs (offer_approved_status)
school_answered_deal_statusintYESNULLOkul cevap durumu → configs (school_answered_deal_status)
deal_cause_of_reasonintYESNULLAnlaşmazlık nedeni → configs (deal_cause_of_reason)
sourcevarchar(100)YESNULLLead kaynağı (organic, paid, vs.)
source_actionvarchar(100)YESNULLAlt kaynak aksiyonu (2026-04-02 eklendi, önce NULL)
is_testtinyIntYESNULL1 = test lead — analizden hariç tut!
customer_viewed_attimestampYESNULLMüşterinin lead’i ilk gördüğü an (NULL = henüz görülmedi)
created_attimestampNOCURRENT_TIMESTAMP
updated_attimestampYESNULL
deleted_attimestampYESNULLSoft delete

Indexes

IndexTipKolonlar
PRIMARYPKid
leads_user_id_foreignINDEXuser_id
leads_school_id_foreignINDEXschool_id
leads_email_indexINDEXemail
leads_phone_indexINDEXphone
leads_created_deletedINDEX(created_at, deleted_at)

Lead Yaşam Döngüsü

1. Oluşma:
   school_offers (form dolduruldu) → leads kaydı oluşur
   VEYA
   lead_pool_forms → leads kaydı oluşur

2. İlk Durum:
   stage_id = 1 (Yeni Kullanıcı)
   approved_status_id = 1 (Bekliyor)

3. Onay Süreci:
   approved_status_id:
     1  = Bekliyor
     2  = Pipedrive Eklendi (geçerlendi)
     3  = Gereksiz (çöp)
     4  = Manuel Eklendi (geçerlendi)
     5  = Kopya Form (çöp)
     6  = Diğer
     7  = Lead (geçerlendi)

4. Pipeline Akışı (Pipedrive stage_id):
   stage_id = 1  → Yeni Kullanıcı
   stage_id = 6  → Yönlendirildi Takip (okula iletildi)
   stage_id = 11 → Kayıt (başarılı!)
   stage_id = 14 → Ret
   stage_id = 19 → Kaybedilen
   → Tüm değerler için: [[ref-lead-stages]]

5. Okul Cevap Durumu (school_answered_deal_status):
   2453 = Kayıt gerçekleşti ✓
   2454 = Düşünme aşamasında
   2455 = Yüz yüze görüşüldü
   2456 = Telefonla görüşüldü
   2457 = Anlaşma gerçekleşmedi ✗
   2459 = Ulaşılamadı ✗
   2460 = Randevu verildi
   2461 = Bursluluk için görüşüldü
   2462 = Bursluluk Kaydı Alındı

6. Anlaşmazlık Nedeni (deal_cause_of_reason — 2493-2507 arası):
   2493 = Fiyat Yüksekliği
   2494 = Yaş Grubu Uymaması
   2495 = Lokasyonun Uygun Olmaması
   2496 = Okul Geri Dönüş Yapmadı
   2497 = Okul İlgisiz Davrandı
   2498 = Yaz Okulu Olmaması
   2499 = Hafta sonu Eğitim Olmaması
   2500 = Oyun Grubu Olmaması
   2501 = Diğer
   2502 = Fiziksel Şartlar
   2503 = Saatlerin Uygun Olmaması
   2504 = Yarım Gün Olmaması
   2505 = Pandemi
   2506 = Servis Olmaması
   2507 = Kontenjan Dolu

Kritik Analiz Kuralları

  1. Test lead’leri hariç tut: is_test = 0 OR is_test IS NULL
  2. source_action 2026-04-02 öncesi NULL — tarih bazlı filtrele
  3. Conversion = stage_id = 11 (Kayıt) veya school_answered_deal_status = 2453
  4. Response time = customer_viewed_at - created_at (NULL = hiç görülmedi)
  5. Çöp lead’ler = approved_status_id IN (3,5) — analizden çıkar

Hazır Sorgu Kalıpları

-- Temiz lead sayısı (temel filtre)
SELECT COUNT(*) FROM leads
WHERE deleted_at IS NULL
  AND (is_test = 0 OR is_test IS NULL);
 
-- Aylık conversion rate (Kayıt / Toplam lead)
SELECT DATE_FORMAT(created_at, '%Y-%m') as ay,
       COUNT(*) as toplam,
       SUM(CASE WHEN stage_id = 11 THEN 1 ELSE 0 END) as kayit,
       ROUND(100.0 * SUM(CASE WHEN stage_id = 11 THEN 1 ELSE 0 END) / COUNT(*), 2) as pct
FROM leads
WHERE deleted_at IS NULL AND (is_test = 0 OR is_test IS NULL)
GROUP BY DATE_FORMAT(created_at, '%Y-%m')
ORDER BY ay;
 
-- Müşteri tepki süresi (saat cinsinden) — okul başına
SELECT l.school_id, sf.name, sf.city_name,
       COUNT(*) as lead_sayisi,
       AVG(TIMESTAMPDIFF(HOUR, l.created_at, l.customer_viewed_at)) as ort_tepki_saati,
       SUM(CASE WHEN l.customer_viewed_at IS NULL THEN 1 ELSE 0 END) as hic_gorulen
FROM leads l
JOIN school_filters sf ON sf.school_id = l.school_id AND sf.deleted_at IS NULL
WHERE l.deleted_at IS NULL AND (l.is_test = 0 OR l.is_test IS NULL)
  AND l.approved_status_id IN (2, 4, 7)  -- geçerli leadler
GROUP BY l.school_id, sf.name, sf.city_name
HAVING lead_sayisi >= 5
ORDER BY ort_tepki_saati ASC;
 
-- Kaynak bazlı funnel
SELECT source,
       COUNT(*) as toplam,
       SUM(CASE WHEN approved_status_id IN (2,4,7) THEN 1 ELSE 0 END) as gecerli,
       SUM(CASE WHEN stage_id = 11 THEN 1 ELSE 0 END) as kayit
FROM leads
WHERE deleted_at IS NULL AND (is_test = 0 OR is_test IS NULL)
GROUP BY source
ORDER BY toplam DESC;