E-Ticarette Sadakat Programları ve Abonelik Modeli Entegrasyon Rehberi
Modern web trendleri odaklı sadakat ve abonelik mimarisi kurulum rehberi. DB şeması, webhook akışı ve entegrasyon adımları içerir.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
1. Mimari Temel: Sadakat ve Abonelik Motoru
Abonelik tekrarlayan gelir (MRR) üretir. Sadakat programı müşteri terk oranını (churn) düşürür. Modern web mimarisinde iki sistemi tek veri modelinde birleştirmek gerekir.
Veritabanı Şeması Tasarımı
İlişkisel DB (PostgreSQL) üzerinde asgari tablo yapısı:
- users: Kimlik, bakiye, tier_id
- subscriptions: user_id, plan_id, status, current_period_end
- loyalty_transactions: user_id, points, type (earn/burn), reference_id
- loyalty_tiers: id, name, min_points, multiplier
2. Adım Adım Entegrasyon Süreci
Adım 1: Webhook Tabanlı Abonelik Akışı
Ödeme sağlayıcı (Stripe, iyzico) ödeme aldığında webhook tetikler. Webhook işleyici abonelik durumunu günceller, sadakat puanı yazar.
Webhook endpoint idempotency anahtarı içermeli. Mükerrer istek bakiye hatası üretir.
Adım 2: Puan Kazanım / Harcama Motoru
Kural motoru saf fonksiyon olmalı. Örnek pseudocode / mantık:
function applyReward(user, orderAmount):
tier = getTier(user.totalPoints)
earned = orderAmount * tier.multiplier
DB.loyalty_transactions.insert(user.id, earned, 'earn')
DB.users.incrementPoints(user.id, earned)Adım 3: Abonelik Arayüzü ve Modern Web Trendleri
Kullanıcı portalı SSR/SSG hibrit yapı (Next.js/Remix) ile çalışmalı. Müşteri abonelik dondurma, plan yükseltme ve puan ile ödeme adımlarını tek ekranda yönetir.
3. Dijital Ajans ve Mühendislik İpuçları
- YAGNI: Başlangıçta karmaşık kural motoru kurma. Sabit çarpan (1 TL = 1 Puan) ile başla.
- Native Araçlar: Cron yerine DB tabanlı scheduler (pg_cron) veya event broker (Redis Streams) kullan.
- Churn Engelleme: Kart son kullanma tarihi yaklaşınca otomatik e-posta ve dunning yönetimi ekle.
4. Doğrulama ve Test
Webhook başarısızlığı durumunda exponential backoff ile retry stratejisi doğrulanmalı. Puan bakiyesi eksiye düşemez constraint'i DB seviyesinde (`CHECK (points >= 0)`) tanımlanmalı.