> ## 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.

# Multi-brand Portföy

> Phase 24 — Birden fazla markayı tek hesaptan yönetin. CEO/CMO tüm brand'lere, Agency yalnızca atananlara erişir.

# Multi-brand Portföy

`v0.7.65` (Phase 24) ile gelen **multi-brand portföy** desteği, birden fazla markaya sahip organizasyonların ve dijital ajansların tek hesaptan tüm markalarını yönetmesine olanak tanır. Aktif marka bağlamı dropdown selector ile değiştirilir; veri yüklemeleri, model run'ları ve raporlar seçili marka altına kaydedilir.

## Genel Bakış

<CardGroup cols={2}>
  <Card title="Tek hesap, çoklu marka" icon="layer-group">
    Aynı Clerk hesabıyla organizasyonunuzdaki tüm markalara erişin. Her marka için ayrı DQS, ayrı model run'ları, ayrı raporlar.
  </Card>

  <Card title="Rol bazlı erişim" icon="user-shield">
    `CEO`/`CMO` org'daki tüm brand'leri görür. `Agency` yalnızca `assigned_brand_ids` array'inde belirtilen markalara erişir.
  </Card>

  <Card title="Cross-org isolation" icon="lock">
    PostgreSQL **RLS (Row Level Security)** garantilenir. Bir markanın verisi başka markaya sızmaz; cross-org leak fiziksel olarak imkansız.
  </Card>

  <Card title="Backward compatible" icon="check-circle">
    Tek markalı organizasyonlarda dropdown **gizlenir** (`brands.length > 1` koşulu). Mevcut single-brand kullanıcılar değişiklik hissetmez.
  </Card>
</CardGroup>

## Roller ve Erişim

| Rol              | Erişim Kapsamı                                  | Brand Listesi               |
| ---------------- | ----------------------------------------------- | --------------------------- |
| `CEO`            | Org içindeki **tüm** brand'ler                  | `created_at DESC` sırasında |
| `CMO`            | Org içindeki **tüm** brand'ler                  | `created_at DESC` sırasında |
| `Analytics`      | Org içindeki **tüm** brand'ler (read-only)      | `created_at DESC` sırasında |
| `Agency`         | Yalnızca `users.assigned_brand_ids` içindekiler | Atanan brand'ler            |
| `platform_admin` | **Tüm org'lardaki** tüm brand'ler               | Cross-org full access       |

<Warning>
  `Agency` rolündeki kullanıcı `assigned_brand_ids` dışında bir brand'e erişmeye çalışırsa `403 BRAND_ACCESS_FORBIDDEN_403` hatası alır. Platform Admin atamayı `users.assigned_brand_ids` array'ine brand UUID ekleyerek yapar.
</Warning>

## Marka Seçici Nasıl Kullanılır?

<Steps>
  <Step title="Settings sayfasına gidin">
    Sol menüden **Settings** → **Benchmark Override** sekmesi.
  </Step>

  <Step title="Marka seçici dropdown'u">
    `brands.length > 1` ise dropdown otomatik render edilir. Liste `CEO`/`CMO` için org'daki tüm brand'leri, `Agency` için yalnızca atananları gösterir.
  </Step>

  <Step title="Marka seçin">
    Aktif marka bağlamı değiştirilir. UI state `selectedBrandId` ile güncellenir, ardından bağımlı veriler (override'lar, benchmark'lar) refetch edilir.
  </Step>

  <Step title="İşleminizi yapın">
    Seçili marka bağlamında veri yükleyin, model çalıştırın, rapor üretin. Tüm aksiyonlar **o marka altına** kaydedilir.
  </Step>
</Steps>

<Tip>
  Marka seçici yalnızca **Settings → Benchmark Override** tab'ında render edilir. Diğer sayfalarda (`/dashboard`, `/dashboard/channels`, `/dashboard/reports`) aktif marka bağlamı **`useOrgContext()` hook'undan** okunur ve URL query parametresi (`?brand=<uuid>`) ile değiştirilebilir.
</Tip>

## `GET /api/v1/brands` Endpoint

Frontend marka listesini bu endpoint'ten alır:

```bash theme={null}
curl https://api.mmmytics.com/api/v1/brands \
  -H "Authorization: Bearer $CLERK_JWT"
```

**Response (CEO/CMO):**

```json theme={null}
{
  "success": true,
  "data": [
    {
      "id": "brand-uuid-1",
      "name": "Marka A",
      "sector_template": "automotive",
      "created_at": "2026-01-15T10:00:00Z"
    },
    {
      "id": "brand-uuid-2",
      "name": "Marka B",
      "sector_template": "fmcg",
      "created_at": "2026-02-20T14:30:00Z"
    }
  ]
}
```

**Response (Agency):**

`assigned_brand_ids` ile filtrelenmiş subset döner. `platform_admin` rolü cross-org tüm brand'leri görür.

## Cross-org Isolation (PostgreSQL RLS)

MMMytics tüm tablolarda **Row Level Security (RLS)** aktif:

* `brands.organization_id = current_user_org_id()` RLS policy
* `model_runs.brand_id IN (SELECT id FROM brands WHERE ...)` cascade
* `reports.run_id` üzerinden brand isolation

<Note>
  RLS database seviyesinde uygulanır — application bug olsa bile cross-org leak imkansız. Auditor'a karşı bu garanti SOC 2 / ISO 27001 kapsamında dokümante edilmiştir. Detay: [Güvenlik](/security).
</Note>

## Sorun Giderme

### Dropdown görünmüyor

**Sebep:** Organizasyonda yalnızca 1 brand var (`brands.length === 1`).

**Çözüm:** Backward compat — single-brand org'larda dropdown gizlenir, ekstra UI yüklemez. Yeni brand eklemek için **Platform Admin**'den talep edin.

### "Failed to load brands" hatası

**Sebep:** `GET /api/v1/brands` 401 (JWT expired) veya 500 (backend).

**Çözüm:**

1. Logout + login (Clerk JWT yenilenir)
2. `status.mmmytics.com` kontrol (backend down mı)
3. Hala devam → `destek@mmmytics.com`

### Agency olarak müşteri brand'ime erişemiyorum

**Sebep:** `users.assigned_brand_ids` array'ine ilgili brand UUID eklenmemiş.

**Çözüm:** Platform Admin'den assignment iste — `destek@mmmytics.com` üzerinden hangi brand'lere erişim gerektiğini bildirin. Admin atamayı yaptıktan sonra logout + login.

## Sonraki Adım

<CardGroup cols={2}>
  <Card title="Per-Brand Benchmark Override" icon="sliders" href="/settings/benchmark-overrides">
    Marka-spesifik KPI eşik değerleri tanımlayın
  </Card>

  <Card title="L7 Reports" icon="file-pdf" href="/6-istasyon/l7-reports">
    Marka bazında CEO Brief PDF üretin
  </Card>
</CardGroup>
