Proje: Okul Database · Hub: Okul Database — Tables
leads Tablosu
Lead lifecycle’ı baştan sona izleyen ana satış tablosu.
Tam Kolon Listesi
| Kolon | Tip | Nullable | Default | Açıklama |
|---|---|---|---|---|
id | increments | NO | — | PK |
user_id | unsignedInt | YES | NULL | Atanan temsilci → users.id |
first_name | varchar(255) | YES | NULL | Velinin adı |
last_name | varchar(255) | YES | NULL | Velinin soyadı |
email | varchar(255) | YES | NULL | (INDEX) |
phone | varchar(20) | YES | NULL | (INDEX) |
school_id | unsignedInt | YES | NULL | Hedef okul → schools.id (INDEX) |
campus_id | unsignedInt | YES | NULL | Hedef kampüs → campuses.id |
customer_id | unsignedInt | YES | NULL | Okulun müşterisi → customers.id |
pipeline_id | int | YES | NULL | Pipedrive pipeline ID |
stage_id | int | YES | NULL | Pipedrive stage ID — değerler için ref-lead-stages |
deal_id | int | YES | NULL | Pipedrive deal ID |
offer_id | int | YES | NULL | → school_offers.id (form kaynağı) |
lead_pool_form_id | int | YES | NULL | → lead_pool_forms.id |
approved_type | string(50) | YES | NULL | Manuel onay tipi |
approved_status_id | int | YES | NULL | Onay durumu → configs (offer_approved_status) |
school_answered_deal_status | int | YES | NULL | Okul cevap durumu → configs (school_answered_deal_status) |
deal_cause_of_reason | int | YES | NULL | Anlaşmazlık nedeni → configs (deal_cause_of_reason) |
source | varchar(100) | YES | NULL | Lead kaynağı (organic, paid, vs.) |
source_action | varchar(100) | YES | NULL | Alt kaynak aksiyonu (2026-04-02 eklendi, önce NULL) |
is_test | tinyInt | YES | NULL | 1 = test lead — analizden hariç tut! |
customer_viewed_at | timestamp | YES | NULL | Müşterinin lead’i ilk gördüğü an (NULL = henüz görülmedi) |
created_at | timestamp | NO | CURRENT_TIMESTAMP | |
updated_at | timestamp | YES | NULL | |
deleted_at | timestamp | YES | NULL | Soft delete |
Indexes
| Index | Tip | Kolonlar |
|---|---|---|
| PRIMARY | PK | id |
leads_user_id_foreign | INDEX | user_id |
leads_school_id_foreign | INDEX | school_id |
leads_email_index | INDEX | email |
leads_phone_index | INDEX | phone |
leads_created_deleted | INDEX | (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ı
- Test lead’leri hariç tut:
is_test = 0 OR is_test IS NULL - source_action 2026-04-02 öncesi NULL — tarih bazlı filtrele
- Conversion = stage_id = 11 (Kayıt) veya
school_answered_deal_status = 2453 - Response time =
customer_viewed_at - created_at(NULL = hiç görülmedi) - Çö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;Related
- ref-lead-stages — Tüm stage_id değerleri ve anlamları
- ref-interaction-values — school_answered_deal_status, deal_cause_of_reason
- domain-leads-sales — Lead domain genel bakış
- table-schools — Okul bağlantısı