Versiyon v1 · Kazan Kazan v2 · Fiş Okut Kazan yeni

Kazan Kazan — WhatsApp Bot Mesaj Spec

Akış başından sonuna · Gerçek ekran görüntüleri + mockup'lar + key/value/trigger detayları

Akış Genel Görünümü

Her node'a tıkla, detay kartına git

Canlı
Planlanmış
Context (bot dışı)
Hata mesajı
→ Tıkla, detaya git
text yaz reject approve tekrar (LOOP) en sonunda approve API fail (otomatik) GB Yükle Kampanyalar FreeByte İşlemleri bakiye yetersiz bakiye OK API fail Detaylar Katıl tekrar yazı Menü eligible yok hepsi tamam hepsi görüldü CTA app açılır 24h + API check tamamlanmadı ✗ tamamlandı ✓ kalmadıysa GB YÜKLE AKIŞI KAMPANYA AKIŞI FREEBYTE İŞLEMLERİ AKIŞI (PLANNED) Bakiye Sorgula Kod ile Yükle Menü API hata geçerli kod geçersiz API hata welcome_body kvkk_resend_body kvkk_rejected_body freebyte_welcome_body freebyte_api_fail_body menu_body (split point) gb_load_confirm_body gb_load_insufficient_body gb_load_success_body gb_load_error_body campaign (DB) details_body join_default_body still_active_body no_eligible_body completed_all_body cycle_reset_body deeplink → app reminder_default reminder_congrats reminder_no_more phone_invalid error_api_unavailable error_deeplink error_no_info error_keyword optout (DURDUR) freebyte_menu_body freebyte_balance_body freebyte_code_prompt_body freebyte_balance_error_body freebyte_code_success_body freebyte_code_invalid_body freebyte_code_error_body

1. Karşılama & KVKK Akışı

welcome
welcome_body interactive_button
Trigger
Yeni kullanıcı bot'a ilk mesajı atar
Buton 1
welcome_button_approve → ✅ Onaylıyorum
Buton 2
welcome_button_reject → ❌ Daha sonra
🔀 Geçişler
✅ Onaylıyorumfreebyte_welcome_body
❌ Daha sonrakvkk_rejected_body
(text input)kvkk_resend_body
📝 İlk ETK + KVKK linkleri burada gösteriliyor. Hukuki zorunluluk — onaylanmadan kampanya akışı başlamaz.
kvkk resend
kvkk_resend_body interactive_button
Trigger
KVKK ekranındayken kullanıcı **butona basmadan yazı yazar** (örn "evet", "ne demek bu")
Mesaj
Devam etmek için lütfen aşağıdaki butonlardan birine tıkla 👇
Buton 1
✅ Onaylıyorum
Buton 2
❌ Onaylamıyorum
🔀 Geçişler
✅ Onaylıyorumfreebyte_welcome_body
❌ Onaylamıyorumkvkk_rejected_body
(yine yazı)kendisi (LOOP)
💡 Önerilen iyileştirme: "evet/onay/tamam" gibi anahtar kelimeleri NLP ile yakalayıp approve gibi davran.
kvkk rejected
kvkk_rejected_body interactive_button
Trigger
"❌ Daha sonra" butonu tıklandı
Buton 1
✅ Onaylıyorum
Buton 2
❌ Daha sonra
🔀 Geçişler
✅ Onaylıyorumfreebyte_welcome_body
❌ Daha sonrakendisi (LOOP)
⚠️ Sonsuz döngü riski — kullanıcı onaylamadıkça çıkış yok. Timeout/eskalasyon mekanizması yok. Yeniden tasarımda bu düşünülmeli.
KK
Kazan Kazan
çevrimiçi
Üzgünüz! 😔 Sadece Türkiye (Turkcell, Vodafone, Türk Telekom) numaraları desteklenmektedir. Neden: Geçersiz format
14:30
📐 Mockup
phone_invalid_body text
Trigger
Telefon numarası doğrulamayı geçemedi (Türkiye numarası değil veya format hatalı)
Değişken
{reason} — doğrulama hata sebebi
🔀 Geçişler
(akış bitti)END

2. FreeByte Hediye

freebyte welcome
📸 Bu SS'te FreeByte mesajından hemen sonra ilk kampanya da görünüyor (akış otomatik).
freebyte_welcome_body text
Trigger
KVKK onaylandı → FreeByte API success
Yan etki
Operatörden ayrıca SMS gönderilir
🔀 Geçişler
(otomatik)menu_body (PLANNED)
KK
Kazan Kazan
çevrimiçi
Anlayışın için teşekkürler! 🎁 1000 FreeByte'ın kısa süre içinde hesabına yüklenecek.
14:32
📐 Mockup
freebyte_api_fail_body PLANNED
Durum
⚠️ Şu an FreeByte API fail olduğunda hiç mesaj gitmiyor — UX boşluğu
Trigger
FreeByte API çağrısı başarısız (timeout, 5xx, vb.)
🔀 Geçişler
(otomatik)menu_body (PLANNED)
💡 Yeni yazımda eklenmeli — kullanıcı sessizlikte kalmamalı, "kısa süre içinde yüklenecek" şeklinde pozitif fallback ver.

3. Kampanya Gösterimi

campaign pepsi
📸 Pepsi kampanyası örneği — başka kampanya örneği için aşağıya bak.
campaign (image + body + buttons) hybrid (DB-driven)
Trigger
FreeByte sonrası ilk gösterim, veya "Sonraki", veya keyword routing
Sıralama
DB: campaigns.priorityen yüksek priority önce gösterilir, "Sonraki" deyince bir alt priority'ye geçer
Eligibility
Campaign API'den kontrol edilir — sadece eligible olanlar listede kalır, görülen kampanyalar atlanır
Görsel
DB: campaigns.image_url
Body
DB: campaigns.body_text
Buton 1
DB: button_1_text + button_1_id (örn "Kampanyaya Katıl")
Buton 2
DB: button_2_text + button_2_id (örn "Detayları Gör")
Buton 3
campaign_next → "Sonraki" (hardcoded)
Buton 4
campaign_menu → "Menü" (hardcoded, her kampanyada — menüye dönüş)
🔀 Geçişler
Sonrakipriority sırasıyla bir alttaki kampanya
Menümenu_body
⚠️ WhatsApp limiti: Interactive Button mesajları max 3 buton destekler. 4 buton (Katıl/Detaylar/Sonraki/Menü) için List Message kullanılması gerekir.
📌 Priority mantığı: İlk girişte en yüksek priority değerine sahip kampanya gösterilir (örn Pepsi=priority 10, Koçtaş=8). Kullanıcı "Sonraki" deyince bir alt priority'deki kampanyaya geçer. Eligible olmayan veya görülmüş olanlar atlanır. Tüm priority'ler bitince cycle_reset_body gönderilir, baştan başlanır (sadece katılınmamış olanlar arasından).
KK
Kazan Kazan
çevrimiçi
[Kampanya detayları — örn Pepsi için:]\n\n• Promosyonlu Pepsi ürünü satın al\n• Şişe kapağındaki kodu uygulamaya gir\n• Anında 100 MB hediye kazan!\n\nKatılım koşulları: ...
14:42
✅ Kampanyaya Katıl
⏭️ Sonraki
🏠 Menü
📐 Mockup
campaign_details_body hybrid (DB-driven)
Trigger
Kampanya kartında "Detayları Gör" butonuna tıklandı
İçerik
DB: campaigns.campaign_detailsher kampanyaya özel detay metni
Buton 1
Katıl (DB: button_1)
Buton 2
campaign_next → Sonraki
Buton 3
campaign_menu → Menü
📌 Detaylar mesajından sonra Detaylar butonu tekrar gösterilmez — kullanıcı zaten detayları görmüş durumda.
campaign join cta
campaign_join_default_body + CTA hybrid
Trigger
"Kampanyaya Katıl" butonuna tıklandı
Hangi kampanya?
O an gösterilen kampanya — yani priority sırasında bulunduğu yerdeki kampanya. İlk girişte en yüksek priority (örn Pepsi), "Sonraki" deyip ilerlemişse o priority'deki kampanya.
Body
DB'de campaigns.deeplink_message varsa o kullanılır.\nYoksa fallback metni: "Harika seçim! 🎉\n{campaign.name} kampanyasına katılmak için aşağıdaki butona tıkla 👇"
CTA Buton
campaign_join_cta_button → "Kampanyaya Git" (hardcoded, tüm kampanyalar için ortak)
URL
DB: campaigns.deeplink_url — o kampanyaya özel link
Yan etki
24 saat sonra reminder zamanlanır (eğer kullanıcı kampanyayı tamamlamazsa reminder_default_body tetiklenir)
🔀 Geçişler
Kampanyaya Gitapp/web deeplink
(24 saat bekle)reminder_default_body
📌 Önemli: Bu mesaj her kampanya için aynı yapıdadır ama içerik (kampanya adı, deeplink URL) o anki priority'deki kampanyadan dinamik gelir. Tek mesaj template'i, çoklu kampanya kullanımı.
cycle reset
campaign_cycle_reset_body text
Trigger
Tüm eligible kampanyaları gördükten sonra "Sonraki" deyince — katılmadıklarından başa dönüyor
Mesaj
🔄 Tüm kampanyaları gördün. Katılmadığın kampanyalardan tekrar başlıyoruz!
🔀 Geçişler
KK
Kazan Kazan
çevrimiçi
Üzgünüz! 😔 Şu an için katılabileceğin aktif bir kampanya bulunmuyor. Yeni kampanyalar yakında gelecek, takipte kal! 🎁
14:40
📐 Mockup
campaign_no_eligible_body text
Trigger
Kullanıcı için hiç eligible kampanya yok (API'den boş döndü)
KK
Kazan Kazan
çevrimiçi
Tebrikler! 🎉 Tüm kampanyalara katıldın veya şu an için katılabileceğin kampanya bulunmuyor. Yeni kampanyalar yakında gelecek, takipte kal! ❤️
14:45
📐 Mockup
campaign_completed_all_body text
Trigger
Kullanıcı tüm kampanyaları tamamladı
KK
Kazan Kazan
çevrimiçi
Merhaba! 👋 Henüz Pepsi kampanyasına katılmamış görünüyorsun. Ücretsiz GB kazanmak istemez misin? 🎁
15:00
📐 Mockup
campaign_still_active_body hybrid
Trigger
Kullanıcı katıldığı kampanyayı tamamlamadan tekrar bot'a yazar
Değişken
{campaign.name}

4. Hatırlatıcılar (24 saat sonra)

📌 Yeni mantık: Kullanıcı "Katıl" tıkladıktan 24 saat sonra Campaign API'ye check atılır — kampanyayı tamamladı mı?
KK
Kazan Kazan
çevrimiçi
Harika! 🎉 Pepsi kampanyasını tamamlamış görünüyorsun! Ödülün hesabına tanımlandı 🚀
15:30
📐 Mockup
reminder_congrats_body hybrid
Trigger
24 saat sonra Campaign API check → tamamlandı
Değişken
{campaign.name}
Sonraki adım
Otomatik sıradaki priority kampanya gönderilir (kullanıcı yine "Katıl/Detaylar/Sonraki" seçenekleriyle karşılaşır)
🔀 Geçişler
(kampanya kalmadıysa)reminder_no_more_body
KK
Kazan Kazan
çevrimiçi
Merhaba! 👋 Daha önce Pepsi kampanyasına katılmak istemiştin ama henüz ödülünü almamış görünüyorsun 🎁. Ücretsiz GB fırsatını kaçırmadan hemen devam et 🎁
15:30
📐 Mockup
reminder_default_body hybrid
Trigger
24 saat sonra Campaign API check → tamamlanmadı
Değişken
{campaign.name}
Sonraki adım
AYNI kampanya yeniden gönderilir (image + body + butonlar) — kullanıcıdan tekrar "Katıl/Detaylar/Sonraki" aksiyonu istenir
Timing
Production'da CAMPAIGN_REMINDER_DELAY_MINUTES=1380 (23 saat) — WhatsApp 24h penceresi içinde kalmak için
🔀 Geçişler
⚠️ Quiet hours yok — gece 03:00'da bile gönderilir. Yeniden tasarımda quiet hours eklenebilir.
KK
Kazan Kazan
çevrimiçi
Şu an için başka aktif kampanya bulunmuyor. Yeni kampanyalar geldiğinde seni haberdar edeceğiz! ❤️
15:32
📐 Mockup
reminder_no_more_body text (terminal)
Trigger
Congrats sonrası sıradaki priority kampanya aranır, eligible kampanya kalmadıysa
State
Terminal — bu mesajdan sonra reminder döngüsü biter, kullanıcı yeni kampanya gelene kadar bekler

5. Hata Mesajları

KK
Kazan Kazan
çevrimiçi
Şu anda kampanya bilgilerini kontrol ederken geçici bir sorun yaşıyoruz. 🙏 Lütfen birkaç dakika sonra tekrar yaz.
15:35
📐 Mockup
error_campaign_api_unavailable text
Trigger
Campaign API down — kampanya eligibility kontrolünde hata
KK
Kazan Kazan
çevrimiçi
Üzgünüz, kampanya bilgisi bulunamadı. 😔 Lütfen tekrar dene veya destek ekibiyle iletişime geç!
15:37
📐 Mockup
error_campaign_no_info text
Trigger
Kampanya bilgisi DB'de bulunamadı (silinmiş veya yanlış ID)
KK
Kazan Kazan
çevrimiçi
Kampanya yönlendirmesinde geçici bir sorun oluştu. 🙏 Lütfen biraz sonra tekrar yaz.
15:38
📐 Mockup
error_campaign_keyword text
Trigger
Kullanıcı kampanya keyword'ü yazdı ama Campaign API hata verdi (timeout, 5xx)

6. Opt-out

KK
Kazan Kazan
çevrimiçi
Anladık, artık size mesaj göndermeyeceğiz. Tekrar mesaj almak için bize yazabilirsiniz.
15:40
📐 Mockup
optout_confirmation_body text
Trigger
Kullanıcı "STOP", "DURDUR", "İPTAL", "UNSUBSCRIBE" gibi keyword yazar

8. GB Yükle Akışı

KK
Kazan Kazan
çevrimiçi
1 GB için 1000 FreeByte hesabından düşülecek. Onaylıyor musun?
16:05
✅ Onaylıyorum
❌ İptal
📐 Mockup (PLANNED)
gb_load_confirm_body interactive_button
Trigger
Menüde "📲 GB Yükle" tıklandı
🔀 Geçişler
✅ Onaylıyorum (bakiye OK)gb_load_success_body
✅ Onaylıyorum (yetersiz)gb_load_insufficient_body
❌ İptalmenu_body
KK
Kazan Kazan
çevrimiçi
Üzgünüz 😔 FreeByte bakiyen yetersiz. Kampanyalara katılarak FreeByte kazanabilirsin! 🎁
16:06
🎁 Kampanyalar
🏠 Menü
📐 Mockup (PLANNED)
gb_load_insufficient_body interactive_button
Trigger
GB Yükle onaylandı + FreeByte bakiyesi < 1000
Buton 1
campaign_menu → 🎁 Kampanyalar (bakiye kazanma döngüsü)
Buton 2
menu_button → 🏠 Menü
🔀 Geçişler
🎁 Kampanyalarcampaign
🏠 Menümenu_body
📌 Dead-end olmaması için sonuç ekranına buton eklendi — kullanıcı bakiye yetersizken kampanyalara yönlendirilir.
KK
Kazan Kazan
çevrimiçi
Yükleme sırasında bir hata oluştu. 😔 Lütfen birkaç dakika sonra tekrar dene.
16:07
🔄 Tekrar Dene
🏠 Menü
📐 Mockup (PLANNED)
gb_load_error_body interactive_button
Trigger
FreeByte API GB yükleme hatası
Buton 1
gb_load_retry → 🔄 Tekrar Dene
Buton 2
menu_button → 🏠 Menü
🔀 Geçişler
🔄 Tekrar Denegb_load_confirm_body
🏠 Menümenu_body
KK
Kazan Kazan
çevrimiçi
Tebrikler! 🎉 1 GB hattına başarıyla yüklendi! Keyifli kullanımlar! 😊
16:08
💎 FreeByte İşlemleri
🏠 Menü
📐 Mockup (PLANNED)
gb_load_success_body interactive_button
Trigger
FreeByte API → GB load success
Yan etki
SMS doğrulama mesajı (operatör tarafından)
Buton 1
menu_button_freebyte_ops → 💎 FreeByte İşlemleri
Buton 2
menu_button → 🏠 Menü
🔀 Geçişler
💎 FreeByte İşlemlerifreebyte_menu_body
🏠 Menümenu_body

9. FreeByte İşlemleri PLANNED

📌 Model: FreeByte bir cüzdan bakiyesidir. Kazanım: kampanya katılımı + uniq kod. Harcama: GB Yükle (FreeByte → GB) ve ileride diğer dijital varlıklar. Bu alt menü, ana menüde 3 buton sınırı dolduğu için bakiye ve kod aksiyonlarını toplar.
KK
Kazan Kazan
çevrimiçi
💎 FreeByte İşlemleri Ne yapmak istersin?
16:10
💰 Bakiye Sorgula
🎟️ Kod ile Yükle
🏠 Menü
📐 Mockup (PLANNED)
freebyte_menu_body PLANNED
Trigger
Ana menüde "💎 FreeByte İşlemleri" tıklandı
Buton 1
fb_ops_balance → 💰 Bakiye Sorgula
Buton 2
fb_ops_code → 🎟️ Kod ile Yükle (etiket max 20 karakter — "Kod ile Yükle" kullanıldı)
Buton 3
menu_button → 🏠 Menü (üst menüye dön)
🔀 Geçişler
💰 Bakiye Sorgulafreebyte_balance_body
🎟️ Kod ile Yüklefreebyte_code_prompt_body
🏠 Menümenu_body
📌 List Message kullanılmıyor — bu yüzden 3 buton sınırına uygun olarak tasarlandı. GB Yükle bu alt menüde değil, ana menüde (FreeByte harcama aksiyonu).
KK
Kazan Kazan
çevrimiçi
💎 Güncel FreeByte bakiyen: {balance} FreeByte
16:11
📲 GB Yükle
🏠 Menü
📐 Mockup (PLANNED)
freebyte_balance_body PLANNED
Trigger
FreeByte İşlemleri menüsünde "💰 Bakiye Sorgula" tıklandı
Kaynak
app API: GET balance — bakiye anlık çekilir. ⚠️ Performans kritik, API optimizasyonu gerekebilir (cache/response süresi).
Değişken
{balance} — kullanıcının güncel FreeByte bakiyesi
Buton 1
menu_button_gb_load → 📲 GB Yükle
Buton 2
menu_button → 🏠 Menü
🔀 Geçişler
📲 GB Yüklegb_load_confirm_body
🏠 Menümenu_body
KK
Kazan Kazan
çevrimiçi
Bakiyeni kontrol ederken geçici bir sorun oluştu. 🙏 Lütfen birkaç dakika sonra tekrar dene.
16:11
🔄 Tekrar Dene
🏠 Menü
📐 Mockup (PLANNED)
freebyte_balance_error_body PLANNED
Trigger
Bakiye API çağrısı başarısız (timeout, 5xx)
🔀 Geçişler
🔄 Tekrar Denefreebyte_balance_body
🏠 Menümenu_body
KK
Kazan Kazan
çevrimiçi
🎟️ FreeByte kodunu yaz, bakiyene ekleyelim 👇 (Örn: ABC123XYZ)
16:12
📐 Mockup (PLANNED)
freebyte_code_prompt_body PLANNED
Trigger
FreeByte İşlemleri menüsünde "🎟️ Kod ile Yükle" tıklandı
Girdi
Kullanıcı serbest metin olarak kodu yazar (buton değil, text input)
🔀 Geçişler
geçersiz/kullanılmışfreebyte_code_invalid_body
📌 Güvenlik: Kod doğrulama atomik claim ile (yarış koşulu yok), kod tekil ve bir kez kullanılır. Promosyon kodu havuzuyla aynı mantık — yeni altyapı gerekmiyor. Kullanıcı başına rate-limit (kod deneme spam'ine karşı).
KK
Kazan Kazan
çevrimiçi
Tebrikler! 🎉 {amount} FreeByte bakiyene eklendi! Güncel bakiyen: {balance} FreeByte
16:13
📲 GB Yükle
🏠 Menü
📐 Mockup (PLANNED)
freebyte_code_success_body PLANNED
Trigger
Geçerli kod girildi → FreeByte yükleme başarılı
Değişken
{amount} — kodun yüklediği FreeByte miktarı · {balance} — yeni güncel bakiye
🔀 Geçişler
📲 GB Yüklegb_load_confirm_body
🏠 Menümenu_body
KK
Kazan Kazan
çevrimiçi
Bu kod geçersiz veya daha önce kullanılmış. 😔 Kodunu kontrol edip tekrar deneyebilirsin.
16:13
🔄 Tekrar Dene
🏠 Menü
📐 Mockup (PLANNED)
freebyte_code_invalid_body PLANNED
Trigger
Girilen kod bulunamadı, süresi dolmuş veya zaten kullanılmış
🔀 Geçişler
🔄 Tekrar Denefreebyte_code_prompt_body
🏠 Menümenu_body
KK
Kazan Kazan
çevrimiçi
Kodu işlerken geçici bir sorun oluştu. 🙏 Lütfen birkaç dakika sonra tekrar dene.
16:13
🔄 Tekrar Dene
🏠 Menü
📐 Mockup (PLANNED)
freebyte_code_error_body PLANNED
Trigger
Kod doğrulama API çağrısı başarısız (timeout, 5xx)
🔀 Geçişler
🔄 Tekrar Denefreebyte_code_prompt_body
🏠 Menümenu_body