Sadakat programının yazılım tarafında iki şey batırıyor: puan defterinin çift kayıt üretmesi ve izin yönetiminin İYS'den kopuk kurulması. Birincisi mutabakat kâbusu, ikincisi idari yaptırım. Kampanya kurgusu, tasarım ve isim bunların yanında kolay kısım. Bu yazı puan defterini nasıl tasarlayacağınızı, İYS'nin size ne dayattığını ve hangi kararların sonradan düzeltilemediğini anlatıyor.
Puan defteri bir tablo değil, bir muhasebe defteri
En yaygın hata, müşteri tablosuna puan_bakiye diye bir sütun eklemek. Bu sütun ilk iade işleminde, ilk çift tıklamada veya ilk zaman aşımında tutarsız hâle geliyor ve nereden bozulduğunu anlayamıyorsunuz.
Doğru yapı değişmez (append-only) hareket kaydı. Bakiye bir sütun değil, hareketlerin toplamı. Minimum alan seti:
CREATE TABLE puan_hareketleri (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
musteri_id BIGINT NOT NULL,
tip VARCHAR(20) NOT NULL, -- kazanim | harcama | iptal | duzeltme | sona_erme
miktar INT NOT NULL, -- kazanımda pozitif, harcamada negatif
kaynak_tip VARCHAR(30) NOT NULL, -- siparis | iade | kampanya | manuel
kaynak_id VARCHAR(64) NOT NULL,
idempotency_key VARCHAR(80) NOT NULL,
gecerlilik_sonu DATE NULL,
olusturan VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL,
UNIQUE KEY uk_idem (idempotency_key),
KEY ix_musteri (musteri_id, created_at)
);
idempotency_key alanındaki tekil kısıt, bu tasarımın kalbi. Anahtarı işlemin doğasından türetin: siparis:{siparis_no}:kazanim gibi. Kasa yazılımı aynı isteği ağ hatası yüzünden iki kez gönderdiğinde ikinci kayıt veritabanı seviyesinde reddediliyor; uygulama kodunda "acaba daha önce yazdım mı" kontrolü yapmak zorunda kalmıyorsunuz. Bu kontrolü uygulama katmanında yapan sistemler, eşzamanlı iki istek geldiğinde yarış koşuluna giriyor.
Bakiyeyi her okumada toplamak pahalıysa, materyalize edilmiş bir bakiye tutun ama kaynak gerçek olarak hareket tablosunu kabul edin ve gece çalışan bir mutabakat işiyle iki değeri karşılaştırın. Fark çıktığında düzelten değil, alarm üreten bir iş yazın; sessizce düzelten iş, hatanın sebebini gizliyor.
Negatif bakiyeye izin verin, ama alarm üretin. İade senaryosunda müşteri, kazandığı puanı harcadıktan sonra ürünü iade ediyor; matematiksel olarak bakiye eksiye düşüyor. Bunu engellemeye çalışan sistemler iadeyi reddetmek zorunda kalıyor. Doğru davranış: negatif bakiyeyi kaydetmek, müşteriye göstermek ve sonraki kazanımdan mahsup etmek.
Sonradan değiştirilemeyen üç karar
1. Puanın para karşılığı. "1 puan = 1 TL" gibi sabit bir kur mu, yoksa kampanyaya göre değişen bir oran mı? Sabit kur kolay anlatılıyor ama enflasyonlu bir ortamda yükümlülüğünüzü kontrol edilemez kılıyor. Değişken oran seçerseniz, her hareketin yanında o anki oranı da saklayın; sonradan hesaplamaya kalkarsanız geçmişi yeniden yazmış olursunuz.
2. Geçerlilik süresi. Puanın sona erme kuralını baştan koyun. Sonradan eklemek, müşterinin kazanılmış hakkını geriye dönük kısıtlamak anlamına geliyor ve itibar maliyeti yüksek. Sona ermeyi de bir hareket olarak yazın (tip = sona_erme), sessizce düşmeyin; müşteri "puanım nereye gitti" diye sorduğunda cevabınız olsun.
3. Kimlik. Müşteriyi telefon numarasıyla mı, e-postayla mı, kartla mı tanıyorsunuz? Üçü de değişiyor.
Kalıcı bir iç müşteri kimliği üretin ve kanal tanımlayıcılarını ona bağlayın. Aynı kişinin iki hesabını sonradan birleştirmek, puan tarihçesini birleştirmek demek; bunu düşünmeden kurulan sistemlerde birleştirme işlemi elle yapılıyor.
İYS: izin artık sizin veritabanınızda değil
Sadakat programının ticari iletişim ayağı, Ticari İletişim ve Ticari Elektronik İletiler Hakkında Yönetmelik'e tabi. Mimariyi doğrudan belirleyen maddeler:
- md. 5/2-5/3: ticari elektronik ileti göndermek isteyen gerçek ve tüzel kişiler İYS'ye kaydolur ve İYS üzerinde onayı bulunmayan alıcılara ticari elektronik ileti gönderilemez.
- md. 7/8: onay metninde olumlu irade beyanı önceden seçilmiş olarak yer alamaz. Kayıt formunda varsayılan işaretli kutu kullanamazsınız.
- md. 7/9: hizmet sağlayıcı, ileti onayını sunduğu mal ve hizmetin temini için ön şart olarak ileri süremez. "İzin vermezseniz programa üye olamazsınız" akışı bu maddeye aykırı.
- md. 7/10: onayın alındığına ilişkin ispat yükümlülüğü hizmet sağlayıcıdadır. Yani onayın alındığı zaman, kanal, metin sürümü ve IP bilgisini saklamıyorsanız ispat edemezsiniz.
- md. 9/1: ret bildirimi, bildirimin yapıldığı iletişim kanalına ilişkin onayı geçersiz kılıyor. İzin kanal bazında tutulmak zorunda; tek bir "pazarlama izni" bayrağı yeterli değil.
- md. 10: ret talebi ulaştıktan sonra üç iş günü içinde gönderim durdurulur. Kampanya kuyruğunuz bu süreden uzun bir pencerede hazırlanıyorsa, ret sonrası ileti gitmesi kaçınılmaz hâle geliyor.
- md. 13/2: onay kayıtları onayın geçerliliği sona erdiği tarihten, diğer kayıtlar kayıt tarihinden itibaren üç yıl saklanır.
İçerik tarafında da bağlayıcı kurallar var: md. 8/2 ve 8/3 uyarınca iletide tacirler için MERSİS numarası ve ticaret unvanı, esnaflar için ad soyad ve T.C. kimlik numarası yer alıyor; kısa mesaj gibi sınırlı alanlarda MERSİS numarası zorunlu. Md. 8/5 ise iletinin niteliği içerikten açıkça anlaşılmıyorsa "tanıtım", "kampanya" veya "bilgilendirme" gibi belirleyici bir ibare istiyor: SMS'te iletinin başında, e-postada konu bölümünde, sesli aramada görüşmenin başında.
İşinizi kolaylaştıran istisna md. 6'da: devam eden abonelik, üyelik veya ortaklık durumu ile tahsilat, borç hatırlatma, bilgi güncelleme, satın alma ve teslimat bildirimleri için önceden onay aranmıyor ve md. 6/5 uyarınca bu iletilerde İYS kontrolü yapılmıyor. Ama aynı fıkranın son cümlesi keskin: bu tür bildirimlerde herhangi bir mal veya hizmet özendirilemez veya bunların tanıtımı yapılamaz. "Siparişiniz kargoya verildi, ayrıca bu hafta %20 indirim var" cümlesi bu istisnayı yok ediyor.
Anlık bildirim İYS kapsamında mı?
Yönetmeliğin md. 4/1-m'deki tanımı ticari elektronik iletiyi "telefon, çağrı merkezleri, faks, otomatik arama makineleri, akıllı ses kaydedici sistemler, elektronik posta, kısa mesaj hizmeti gibi vasıtalar" kullanılarak gönderilen iletiler olarak tarif ediyor. Mobil uygulama anlık bildirimi bu sayımda açıkça yer almıyor; ancak "gibi" ifadesi sayımı kapalı bir liste olmaktan çıkarıyor.
Bu konuda bağlayıcı bir Bakanlık görüşünü doğrulayamadık, dolayısıyla "push İYS dışındadır" demiyoruz. Pratik tavsiye: izin mimarisini kanal bazında kurun ve anlık bildirimi de aynı tercih merkezine bağlayın. Böylece yorum hangi yöne giderse gitsin sisteminizi yeniden yazmak zorunda kalmazsınız. Hukuki değerlendirme için avukatınıza danışın.
KVKK tarafı: segmentasyon bir otomatik karar mı?
Sadakat programı doğası gereği profilleme yapıyor. İki madde belirleyici. Md. 5/2-c, bir sözleşmenin kurulması veya ifasıyla doğrudan doğruya ilgili olması kaydıyla veri işlemeyi açık rıza olmaksızın mümkün kılıyor; üyelik sözleşmesinin ifası için gereken puan hesabı bu kapsamda değerlendirilebiliyor. Pazarlama amaçlı profilleme ise genelde md. 5/2-f'deki meşru menfaat veya açık rıza tartışmasına giriyor.
Ürün tarafında asıl dikkat edilecek madde md. 11/1-g: ilgili kişi, işlenen verilerin münhasıran otomatik sistemler vasıtasıyla analiz edilmesi suretiyle kendisi aleyhine bir sonucun ortaya çıkmasına itiraz etme hakkına sahip. Yani bir müşteriyi algoritmayla "düşük değerli" segmentine atıp kampanya dışı bırakıyorsanız, bu karara itiraz edilebilmesi gerekiyor. Uygulama tarafındaki karşılığı: segment atamasını loglayın ve elle geçersiz kılma (override) yolu bırakın.
Efor bandı
Kapsam kurguya göre değişiyor ama bir çerçeve: hareket tabanlı puan defteri, kampanya kuralları, tercih merkezi + İYS senkronizasyonu, kasa/e-ticaret entegrasyonu ve temel raporlama içeren bir ilk sürüm tipik olarak 35-60 adam-gün bandında planlanıyor. ininia'nın fiyat modelinde adam-gün 300-400 USD; kabaca 10.500-24.000 USD. Bağlayıcı teklif değil, kapsam konuşmasına başlamak için bir aralık.
Bandı yukarı iten şey kampanya kuralı sayısı değil, entegre edilecek satış kanalı sayısı. Tek e-ticaret sitesi ile üç kanal (mağaza kasası, e-ticaret, pazaryeri) arasındaki fark, kural motorunda değil mutabakatta ortaya çıkıyor.
Başlamadan önce yazılacak tek doküman
Bir sayfa: puan hangi olayda kazanılıyor, hangi olayda iptal oluyor, iade olduğunda ne oluyor, süresi ne kadar ve kim elle müdahale edebiliyor? Bu beş sorunun yazılı cevabı yoksa, kural motoru yazmak erken.
Vergisel ve muhasebesel tarafı (puan yükümlülüğünün kaydı, kullanım anındaki belge düzeni) bu yazının kapsamı dışında; mali müşavirinizle netleştirin.
İzin ve deneyim tarafı için müşteri deneyimi dijitalleşmesi, müşteri verisi tarafı için CRM kurulum ve destek, veri güvenliği tarafı için veri ihlali yazılarına bakabilirsiniz. Perakende tarafındaki yaklaşımımız e-ticaret ve perakende sayfasında, ödeme tarafı ödeme sistemi entegrasyonları sayfasında; kaba bir bant için proje fiyat hesaplama aracını kullanabilir, kapsam için iletişim sayfasından yazabilirsiniz.
İzin, ret ve içerik kuralları 25 Eylül 2026'da Ticari İletişim ve Ticari Elektronik İletiler Hakkında Yönetmelik'in yürürlükteki metninden (RG 15/7/2015-29417; değişiklikler RG 4/1/2020-30998 ve 28/8/2020-31227) madde madde doğrulanmıştır. KVKK referansları 6698 sayılı Kanun metnindendir. Anlık bildirimin kapsam durumuna dair bağlayıcı bir Bakanlık görüşü doğrulanamamıştır. Kod örneği bir tasarım iskeletidir; kendi şemanıza uyarlanmalıdır. Adam-gün bandı ininia'nın fiyat modelinden türetilmiştir ve bağlayıcı teklif değildir.