📚 Subscription Sistemi

KOMPLE KILAVUZ

Tüm Bilgiler Tek Sayfada - Settings, Kullanıcı Durumları, Device Hierarchy

📅 2025-12-05 🎯 Basit & Net ✅ Production Ready

📑 İçindekiler

1️⃣ Settings (2 Ayar)

1

auth_subscription

Ücretli Üyelik Sistemi (Ana Anahtar)

Setting ID

211

Type

select

Values

0 / 1

Muzibu

1 (AKTİF)

📋 Ne Yapar?

  • 1 (Açık): Subscription modülü aktif, trial otomatik başlar, premium kontrolleri çalışır
  • 0 (Kapalı): Subscription modülü tamamen kapalı, herkes sınırsız kullanır

💡 Önemli:

Bu ayar 1 ise → Trial da otomatik aktif! Ayrı trial_enabled ayarı YOK!

2

auth_device_limit

Cihaz Limit Kontrolü (Global Fallback)

Setting ID

212

Type

number

Default

1

Önerilen

1-3 arası

📋 Ne Yapar?

  • 📱 Global Fallback: User ve Plan'da device_limit yoksa bu değer kullanılır
  • 🔢 Hierarşi: User → Plan → Setting (son çare)

💡 Detay:

Detaylı hiyerarşi için Device Limit Hierarchy bölümüne bak

2️⃣ Hardcode Değerler (Settings'e GİRMEYEN)

🎵

30 Saniye Preview

Abonelik yoksa/biterse müzik 30 saniye çalışır

const PREVIEW_DURATION = 30; // saniye

✅ Neden Hardcode?

Bu değer değişmeyecek, ayar olarak yönetmeye gerek yok

⏱️

7 Gün Trial

Trial süresi → Trial plan'ın cycle'ından alınır

$trialPlan = SubscriptionPlan::where('is_trial', true)->first();
$days = $trialPlan->billing_cycles['7-gunluk']['duration_days'];

💡 DRY Prensibi:

Plan zaten bu bilgiyi tutuyor, duplicate etme!

🚀

Trial Otomatik Başlar

Kayıt → Trial subscription oluştur

// Kayıt sonrası
if (setting('auth_subscription')) {
  SubscriptionService::createTrialForUser($user);
}

✅ Friction Azalt:

Kullanıcı seçim yapmasın, direkt trial ver → Conversion artır!

3️⃣ Kullanıcı Durumları (4 Durum)

👤

GUEST (Misafir)

Kayıt olmamış kullanıcı

Dinleme:

30 saniye

CTA:

"Sınırsız dinlemek için üye ol!"

🆓

TRIAL (Deneme Üyesi)

Yeni kayıt, 7 gün deneme

Dinleme:

Sınırsız (7 gün)

CTA:

"X gün kaldı, Premium'a geç!"

👑

PREMIUM (Ücretli Üye)

Ödeme yapmış, aktif abonelik

Dinleme:

Sınırsız (Ömür boyu)

CTA:

"Premium üyesiniz, keyifle dinleyin!"

EXPIRED (Süresi Bitmiş)

Trial/Premium bitti

Dinleme:

30 saniye

CTA:

"Aboneliğiniz sona erdi! HEMEN YENİLE!"

📊 Hızlı Özet

Durum Dinleme Süre CTA
👤 GUEST 30 saniye - Üye ol
🆓 TRIAL Sınırsız 7 gün Premium geç
👑 PREMIUM Sınırsız Ömür boyu Keyifle dinle
⏰ EXPIRED 30 saniye - HEMEN YENİLE

4️⃣ Device Limit Hierarchy

🎯 3 Katmanlı Fallback

1️⃣ user.device_limit
En öncelikli (VIP, Test, Ban)
2️⃣ plan.device_limit
Plan'ın default'u (Normal akış)
3️⃣ auth_device_limit
Global fallback (Son çare)

💻 Kod İmplementasyonu

public function getDeviceLimit(User $user): int
{
  // 1. User override (özel durumlar)
  if ($user->device_limit !== null) {
    return $user->device_limit;
  }

  // 2. Plan default (normal akış)
  $sub = $user->activeSubscription();
  if ($sub && $sub->plan->device_limit) {
    return $sub->plan->device_limit;
  }

  // 3. Global fallback
  return setting('auth_device_limit', 1);
}

📝 Örnek Senaryolar

Normal Kullanıcı

user.device_limit: NULL

plan.device_limit: 3

SONUÇ: 3 cihaz

VIP Kullanıcı

user.device_limit: 5

plan.device_limit: 3 (ignored)

SONUÇ: 5 cihaz

Aboneliği Olmayan

user.device_limit: NULL

plan.device_limit: NULL

SONUÇ: 1 cihaz (setting)

Problematic User

user.device_limit: 1 (BAN)

plan.device_limit: 5 (ignored)

SONUÇ: 1 cihaz (kısıtlı)

⚡ Hızlı Özet

✅ Settings (2 Adet)

  • 1. auth_subscription (0/1) - Ana anahtar
  • 2. auth_device_limit (number) - Global fallback

🔧 Hardcode (3 Adet)

  • 1. 30 saniye - Preview süresi
  • 2. 7 gün - Trial süresi (plan'dan)
  • 3. Otomatik - Trial başlatma

👥 Kullanıcı (4 Durum)

  • 👤 GUEST - 30 saniye
  • 🆓 TRIAL - 7 gün sınırsız
  • 👑 PREMIUM - Ömür boyu
  • EXPIRED - 30 saniye

📱 Device Hierarchy

  • 1️⃣ user.device_limit - Öncelikli
  • 2️⃣ plan.device_limit - Normal
  • 3️⃣ auth_device_limit - Fallback