Skip to Content
KampanyalarKampanya Raporları (ROI & A/B)

Kampanya Raporları

Kampanya bittiğinde asıl soru “kaç kişi arandı” değil — “bu kampanya işe yaradı mı?” Kampanya raporları tam bunu gösterir: 420 çağrının kaçı gerçek görüşmeye döndü, görüşmeler ne kadar sürdü, kaç randevu açıldı ve aramalar hangi sonuçla kapandı. İki rapor var — sonuç raporu her kampanyada çalışır; A/B raporu ise iki varyantı istatistiksel olarak karşılaştırıp “hangisi gerçekten kazandı, yoksa bu fark rastlantı mı?” sorusunu cevaplar.

İki rapor, iki soru

RaporCevapladığı soruUç nokta
Sonuç raporuKampanya kaç dakika harcadı, ne getirdi? Kaç görüşme, kaç randevu, hangi sonuçlar?GET /api/campaigns/{id}/roi
A/B raporuA ve B varyantından hangisi kazandı — ve bu istatistiksel olarak anlamlı mı?GET /api/campaigns/{id}/ab-report

Her iki rapor da panelde ilgili kampanyanın detay ekranından açılır; oturum (giriş) yetkisiyle çalışır ve sadece kendi kampanyalarını gösterir. Başka bir hesabın kampanyası 404 döner.

Dakika özeti her planda gelir — ödediğin şey dakika olduğu için minutes bloğunun plan kapısı yoktur. Dönüşüm, süre ve sonuç dağılımı (summary + outcomes) gelişmiş raporlamadır (Pro ve üzeri): ücretsiz planda bu iki blok yerine reportLocked: { "code": "premium_required", "feature": "advanced_analytics" } döner. A/B raporu tamamen Pro ve üzeri; ücretsiz planda 403 + aynı code ile kapanır. Pro planında bile sonuç dağılımı, randevu sayısı ve duygu metrikleri AI Çağrı Analizi’ne dayanır; asistanında çağrı analizi kapalıysa bu alanlar boş/sıfır görünebilir.

Sonuç raporu

Rapor, kampanyaya ait tüm çağrıları okur; her çağrının durumunu, süresini ve AI analizini toplar, sonra tek bir tabloya indirger. (Uç noktanın adı tarihsel nedenle roi kaldı.)

Kampanya çağrıları biter ↓ Her çağrının durumu, süresi ve AI analizi okunur ↓ Dakikalar defterden (usage hareketleri) toplanır ↓ Toplanır: dakika + görüşme + sonuç + randevu + SMS ↓ Sonuç raporu: dakika özeti + özet metrikler + sonuç dağılımı

Dakika özeti

minutes bloğu, kampanyanın hesabından ne kadar dakika götürdüğünü gösterir. Bu sayılar çağrı süresinden yeniden hesaplanmaz; dakika defterindeki usage hareketlerinden okunur — yani bakiyenden fiilen düşen dakikanın aynısıdır.

AlanNe anlatır
minutes.totalKampanyanın tüm çağrılarında düşen toplam dakika.
minutes.avgPerCallÇağrı başına ortalama dakika (2 ondalık). Payda totalCalls — hiç bağlanmamış denemeler de içinde.

Hiç dakika düşülmemiş çağrılar (çok kısa ya da başarısız) toplama girmez. Dakikanın ne zaman düştüğü: Dakika Nasıl Düşülür?

Özet metrikler

Raporun summary bölümü, kampanyanın tek bakışta özetidir (gelişmiş raporlama — Pro ve üzeri):

AlanNe anlatır
totalCallsKampanyada denenen toplam çağrı (başarılı + başarısız hepsi).
completedCallsDurumu completed olan, yani karşı tarafın açtığı çağrılar.
successfulCallsTamamlanmış ve 30 saniyeden uzun süren çağrılar. 30 saniyenin altı meşgul/hatalı sayılır.
conversionRatesuccessfulCalls ÷ totalCalls × 100. Yani tüm denemelerin yüzde kaçı gerçek görüşmeye döndü (sadece açılanların değil).
avgDurationTamamlanan çağrılara bölünmüş toplam görüşme süresi (saniye).
appointmentsBookedAI analizinde başarıyla tamamlanmış booking (randevu) aksiyonlarının sayısı.
smsSentAI analizinde başarıyla gönderilmiş sms aksiyonlarının sayısı.

Dönüşüm oranı beklediğinden düşük mü? Payda totalCalls — meşgul, cevapsız ve 30 saniyeden kısa çağrılar da bu paydanın içinde. Yani “arananların yüzde kaçı ile konuşabildik” sorusunun cevabı. Cevapsız çağrılar çoksa oran düşer; bu bir hata değil, gerçeğin ta kendisi. Cevaplanma oranını ayrı görmek için completedCalls / totalCalls’a bak.

Sonuç dağılımı

outcomes nesnesi, her çağrının AI analizinden çıkan outcome (sonuç) etiketini sayar. Böylece “132 kişi ilgilendi, 40 kişi reddetti, 102 kişi açmadı” gibi bir dağılım görürsün. Etiket üretilmemiş çağrılar unknown altında toplanır. Sık görülen etiketler:

EtiketAnlamı
interestedİlgilendi (pipeline’da “değerlendiriyor”a taşınır).
appointment_scheduledRandevu oluştu (“karar aşaması”).
callback_scheduledTekrar aranma sözü verildi.
information_providedBilgi verildi, net karar yok.
rejectedReddetti (“kaybedildi”).
no_answerAçmadı.
unknownAI analizi bir etiket üretmedi.

Örnek yanıt

{ "campaign": { "id": "1842", "name": "Ağustos Sıcak Lead'ler", "status": "completed", "createdAt": "2026-08-01T09:00:00.000Z" }, "minutes": { "total": 947, "avgPerCall": 2.25 }, "summary": { "totalCalls": 420, "completedCalls": 318, "successfulCalls": 205, "conversionRate": 49, "avgDuration": 138, "appointmentsBooked": 37, "smsSent": 88 }, "outcomes": { "interested": 132, "appointment_scheduled": 37, "callback_scheduled": 41, "information_provided": 27, "rejected": 40, "no_answer": 102, "unknown": 41 } }

(Örnek kısaltılmıştır: raporun panelde gösterilen alanları yer alır.)

Bu örnekte 420 denemenin 318’i açılmış, 205’i gerçek görüşmeye dönmüş (yüzde 49) ve 37 randevu çıkmış — kabaca her 11 aramada bir randevu. Kampanya bunun için hesabından 947 dakika götürmüş, yani randevu başına kabaca 26 dakika. Karar verirken bu iki sayıyı birlikte oku.

📸 [Ekran görüntüsü: Kampanya detayı → Sonuç sekmesi, özet kartları + sonuç dağılımı grafiği]

A/B raporu

İki farklı açılış cümlesi mi deniyorsun? İki farklı asistan mı? A/B testi kampanyanın çağrılarını iki gruba (A ve B) böler; bu rapor da iki grubu yan yana koyar. Ama en kritik kısmı sadece “hangisi daha yüksek” demez — bu farkın rastlantı olup olmadığını ölçer.

Rapor yalnızca kampanyada A/B testi açıksa (abTestEnabled) çalışır; kapalıysa 400 döner. Her varyant için şu metrikler hesaplanır:

MetrikAçıklama
totalCallsO varyanttaki çağrı sayısı.
completedCallsAçılan (tamamlanan) çağrılar.
successfulCallsTamamlanmış ve en az 30 saniye süren çağrılar.
conversionRatesuccessfulCalls ÷ totalCalls × 100.
avgDurationOrtalama görüşme süresi (saniye).
billedMinutes / avgBilledMinutesPerCallVaryantın defterden okunan toplam ve çağrı başına ortalama faturalanan dakikası.
sentimentPositive / sentimentNegativeAI analizinin “olumlu” / “olumsuz” işaretlediği görüşme sayısı.

Rapor ayrıca splitRatio (A ve B arasındaki trafik dağılımı), winner (dönüşüm oranı yüksek olan varyant ya da tie) ve recommendation (öneri metni) döndürür.

İstatistiksel anlamlılık

Diyelim A yüzde 43, B yüzde 62 dönüştü. B daha iyi görünüyor — ama sadece 8 çağrıya bakıyorsan bu fark tamamen şans eseri olabilir. İstatistiksel anlamlılık işte bunu ayıklar: gözlemlediğin farkın gerçek mi yoksa gürültü mü olduğunu söyler.

Rapor bunu bir iki-oran z-testi ile yapar:

En az 30 çağrı şartı

Anlamlılık hesabı yalnızca her iki varyant da en az 30 çağrıya ulaştığında yapılır (minSampleSize: 30). Altındaysa sonuç statisticallySignificant: false kalır ve “daha fazla veri gerekli” önerisi döner. Bu, küçük örneklemle yanlış karar vermeni engeller.

Ortak oran ve standart hata

İki varyantın başarılı çağrıları birleştirilerek ortak bir dönüşüm oranı (pooled rate) bulunur; buradan farkın standart hatası (se) hesaplanır. Basitçe: “iki oran arasındaki fark, tesadüfle ne kadar oynayabilirdi?”

z değeri ve yüzde 95 güven

İki dönüşüm oranı arasındaki fark, standart hataya bölünerek bir z değeri elde edilir. Bu değer eşik olan 1.96’yı aşarsa fark yüzde 95 güvenle anlamlı kabul edilir (p < 0.05). Yani “bu farkın şans eseri olma ihtimali yüzde 5’ten az”.

“Kazanan” görünmesi yeterli değil. winner alanı her zaman doludur (dönüşümü yüksek olan varyant), ama statisticallySignificant false ise bu kazananı kalıcı bir karar için kullanma. Örneklem 30’un altındaysa ya da fark küçükse, “kazanan” bir sonraki gün rahatlıkla yer değiştirebilir. Kararı anlamlılık true olduğunda ver.

Örnek yanıt

{ "campaign": { "id": "1907", "name": "Eylül Deneme — Açılış Cümlesi" }, "splitRatio": 50, "variantA": { "variant": "A", "totalCalls": 140, "completedCalls": 108, "successfulCalls": 60, "conversionRate": 43, "avgDuration": 127, "billedMinutes": 284, "avgBilledMinutesPerCall": 2.03, "sentimentPositive": 52, "sentimentNegative": 18 }, "variantB": { "variant": "B", "totalCalls": 145, "completedCalls": 121, "successfulCalls": 90, "conversionRate": 62, "avgDuration": 148, "billedMinutes": 341, "avgBilledMinutesPerCall": 2.35, "sentimentPositive": 78, "sentimentNegative": 9 }, "winner": "B", "statisticallySignificant": true, "minSampleSize": 30, "recommendation": "Variant B is the winner with statistical significance (p<0.05)." }

Burada B varyantı yüzde 62 dönüşümle, hem daha çok olumlu duygu (78) hem de anlamlı bir farkla kazanmış. Artık B’yi tüm kampanyaya güvenle yayabilirsin.

📸 [Ekran görüntüsü: A/B raporu — A ve B kartları yan yana, “İstatistiksel olarak anlamlı” rozeti]

Metrikleri doğru okumak

  • “Başarılı” = tamamlanmış + 30 saniye. Açılıp hemen kapanan çağrı başarı sayılmaz. Bu yüzden başarı sayısı, açılma sayısından her zaman düşüktür — bu doğru davranıştır.
  • Dönüşüm oranı tüm denemeler üzerinden hesaplanır, sadece açılanlar üzerinden değil. Cevapsız çağrı çoksa oran düşük görünür; asistanın performansı değil, listenin ulaşılabilirliği zayıf olabilir.
  • Ortalama süreyi (avgDuration) dönüşümle birlikte oku. Uzun görüşme her zaman iyi değildir: dönüşüm artmadan süre uzuyorsa asistan gereğinden fazla konuşuyor olabilir — prompt ile kısaltılır. (Bkz. Prompt Yazma Rehberi)
  • A/B’de sabırlı ol. 30 çağrıya ulaşmadan “kazanan” ilan etme. Anlamlılık rozeti çıkana kadar test açık kalsın.

KVKK notu

Raporlar özet sayı gösterse de, altlarındaki çağrılar kayıt, transkript ve AI analizi içerir — bunlar kişisel veridir. Raporlara yalnızca kampanyanın sahibi (oturum yetkisiyle) erişebilir; başka bir hesabın kampanyası 404 döner. Aradığın kişi görüşmede “aramayın / verimi silin” derse, asistan onu otomatik olarak arama listesinden çıkarır ve sonraki kampanyalara dahil etmez.

Sorun giderme

BelirtiOlası neden / çözüm
Sonuç raporu tamamen sıfırKampanyada henüz çağrı yok ya da çağrılar başladı ama tamamlanmadı.
Sonuç dağılımı / randevu / duygu boşAI Çağrı Analizi kapalı. Dakika özeti yine de dolu olur.
summary / outcomes yerine reportLocked döndüPlan gelişmiş raporlamayı içermiyor; minutes bloğu yine gelir.
appointmentsBooked 0 ama randevu aldınızAsistana booking aksiyonu bağlı değil ya da AI analizi randevuyu yakalamadı.
A/B raporu 403 hatasıGelişmiş raporlama Pro ve üzeri planlarda; yanıttaki code: "premium_required" bunu söyler.
A/B raporu 400 hatasıKampanyada A/B testi açık değil. A/B testini etkinleştir.
statisticallySignificant hep falseBir varyant henüz 30 çağrıya ulaşmadı; testi açık tut.
Kazanan var ama anlamlılık yokFark rastlantı olabilir; örneklem büyüyene kadar karar verme.
Dönüşüm oranı çok düşükÇoğu çağrı 30 saniyenin altında (meşgul/cevapsız). Listeyi ve arama saatlerini gözden geçir.

İlgili