> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mmmytics.com/llms.txt
> Use this file to discover all available pages before exploring further.

# L5 — Budget Optimizer

> Senaryo simülasyonu — same-budget optimization, +/- bütçe scenarios, channel mix override, compare runs.

# L5 — Budget Optimizer

`/dashboard/budget` adresinde **bütçe karar destek** istasyonu. Saturation + ROI + adstock'u dikkate alarak optimum allocation'ı hesaplar.

## Ne Yapar?

* **Senaryo oluşturma** — 3 mod (same-budget / +/- %X / channel mix override)
* **Compare** — 2+ senaryo yan yana karşılaştırma (M8/M16/M17)
* **Saturation-aware** — fazla yüklenen kanalları otomatik azaltır
* **Constraint support** — "TV bütçesi sabit" gibi kuralları respekt eder
* **Risk paneli** — multi-run baseline mismatch uyarısı (M16)

## Senaryo Modları

<Tabs>
  <Tab title="Same Total Budget">
    **Toplam bütçe değişmez, allocation yeniden dağıtılır.**

    Use case: "Bu yılki 5M TL'yi nasıl daha verimli kullanırım?"

    Optimizer:

    1. Her kanalın saturation curve + ROI'sını dikkate alır
    2. Marjinal getiri eşit olana kadar yeniden dağıtır
    3. Beklenen KPI lift'i hesaplar

    Output:

    ```
    Toplam: 5,050,000 TL (sabit)

    Mevcut → Optimized
    TV:        29% → 35% (+6pp)
    Google:    24% → 21% (-3pp)
    Meta:      19% → 22% (+3pp)
    YouTube:   17% → 16% (-1pp)
    OOH:       9%  → 5%  (-4pp)
    Print:     2%  → 1%  (-1pp)

    Beklenen KPI Lift: +14.2%
    ```
  </Tab>

  <Tab title="Budget +/- %X">
    **Toplam bütçe değişir** (yeni iş yılı, kriz, yeni runaway):

    Use case: "Bütçe %20 azaltılırsa hangi kanaldan kesmem lazım?"

    Mantık:

    * Bütçe artarsa: yetersiz alanlara öncelik (saturation altındaki kanallar)
    * Bütçe azalırsa: doygun alanlardan kes (ROI \< 1 olanlar dahil)

    Output:

    ```
    Senaryo: Bütçe -%20 (4,040,000 TL)

    Mevcut → Reduced
    TV:        1.45M → 1.20M (-17%)   ← saturated, easier to cut
    Google:    1.20M → 1.15M (-4%)    ← yüksek ROI, az kes
    Meta:      0.95M → 0.85M (-10%)
    YouTube:   0.85M → 0.65M (-23%)
    OOH:       0.48M → 0.10M (-79%)   ← negative ROI, sıfırla
    Print:     0.12M → 0.05M (-58%)

    Beklenen KPI Lift: -8.3% (bütçe -20% rağmen)
    ```
  </Tab>

  <Tab title="Channel Mix Override">
    **Bazı kanallar sabit, gerisi optimize.**

    Use case: "TV taahhüt ettim sabit kalsın, gerisini yeniden dağıt."

    Constraints UI:

    * Lock: TV → 1,500,000 TL (sabit)
    * Lock: Print → 0 TL (kapatma)
    * Optimize: kalan kanalar

    Optimizer kalan bütçe alan için aynı algoritmayı çalıştırır.
  </Tab>
</Tabs>

## Compare View (M8/M16/M17)

2+ senaryo yan yana:

```
┌──────────────────┬─────────────┬──────────────┬─────────────┐
│ Channel          │ Baseline    │ Optimized    │ Reduced -20%│
├──────────────────┼─────────────┼──────────────┼─────────────┤
│ TV               │ 1,450,000   │ 1,768,000    │ 1,200,000   │
│ Google Ads       │ 1,200,000   │ 1,061,000    │ 1,150,000   │
│ Meta Ads         │ 950,000     │ 1,111,000    │ 850,000     │
│ YouTube          │ 850,000     │ 808,000      │ 650,000     │
│ OOH              │ 480,000     │ 252,000      │ 100,000     │
│ Print            │ 120,000     │ 50,000       │ 50,000      │
├──────────────────┼─────────────┼──────────────┼─────────────┤
│ Total            │ 5,050,000   │ 5,050,000    │ 4,000,000   │
│ Expected KPI     │ 8,500       │ 9,710        │ 7,793       │
│ Lift vs Base     │ -           │ +14.2%       │ -8.3%       │
└──────────────────┴─────────────┴──────────────┴─────────────┘
```

### Multi-run Baseline Uyarısı (M16)

Compare'da farklı **model run**'larından senaryo eklerseniz:

```
⚠️ Mixed Baseline Warning
Senaryo 1 (Optimized) → Run #15 (R-hat 1.02, MAPE 14%)
Senaryo 2 (Reduced)   → Run #14 (R-hat 1.04, MAPE 18%)

Bu senaryolar farklı model run'larından geliyor. Sonuçları doğrudan
karşılaştırmak yanıltıcı olabilir. Aynı run'dan senaryolar üretmek
önerilir (Run #15'te tekrar oluştur).
```

### Channel Union (M17)

Run'lar arasında kanal listesi farklıysa **union view**:

* Run #15'te Affiliate vardı, Run #14'te yoktu → tabloda hücre `—` gösterilir
* Null-safe render — ekran patlamaz

## Saturation-Aware Constraints

Optimizer'ın **otomatik kuralları**:

1. **Hiçbir kanal toplam bütçenin %50'sini geçemez** (concentration risk)
2. **Saturation point'in %150 üstüne çıkamaz** (diminishing return aşımı)
3. **ROI \< 0.5 olan kanal sıfırlanır** (negatif kanal)
4. **Manuel constraint priority** (lock'lar önce uygulanır)

## API Endpoint'leri (Programmatic)

```bash theme={null}
# Senaryo oluştur
curl -X POST https://api.mmmytics.com/api/v1/budget/scenarios \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "model_run_id": "<run-uuid>",
    "scenario_type": "same_budget_optimize",
    "constraints": {"TV": {"min": 1000000, "max": 2000000}}
  }'

# Compare 2 scenario
curl -X POST https://api.mmmytics.com/api/v1/budget/scenarios/compare \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "scenario_ids": ["<uuid-1>", "<uuid-2>", "<uuid-3>"]
  }'
```

[API Reference](https://api.mmmytics.com/docs)

## Sonraki Adım

Optimum allocation hazır mı? Şimdi **executive özet** zamanı:

[L7 Reports →](/docs/mintlify/6-istasyon/l7-reports)
