PushizoDocs
Güvenlik & uyum

White-label: marka, özel alan adı ve bayi hesabı

Pushizo'yu kendi markanızla sunun: panelde ve sistem e-postalarında ürün adınız, logonuz ve renkleriniz; kendi alan adlarınızda panel, izleme bağlantıları, tercih merkezi ve durum sayfası; ajanslar için alt müşteri…

Pushizo'yu kendi markanızla sunun: panelde ve sistem e-postalarında ürün adınız, logonuz ve renkleriniz; kendi alan adlarınızda panel, izleme bağlantıları, tercih merkezi ve durum sayfası; ajanslar için alt müşteri yönetimi ve toplu faturalama. Kararlar: docs/adr/0032-hucre-mimarisi-white-label-bayi.md.

ÖzellikPlan
Marka (ad, logo, renkler, destek e-postası) ve özel alan adlarıGrowth ve Enterprise (white_label)
"Powered by Pushizo" ibaresini gizlemeEnterprise (hide_powered_by)
Bayi hesabı (alt organizasyonlar, toplu döküm)Enterprise (reseller)

1. Marka

Organizasyon → Marka sayfasından ya da API ile:

PUT /internal/v1/orgs/:orgId/branding
{ "product_name": "Acme Push", "primary_color": "#112233", "secondary_color": "#445566",
  "support_email": "destek@acme.com", "hide_powered_by": true }
```text

- Renkler `#RRGGBB`; alanı kaldırmak için `null` gönderin. `GET` yanıtındaki `effective` alanı plan özellikleri ve
  (alt organizasyonda) bayi markası uygulanmış hâlidir.
- **Logo**: `PUT /internal/v1/orgs/:orgId/branding/logo` (multipart `file`) — PNG, JPEG veya WebP, en çok 512 KB. Dosya
  türü içerikten doğrulanır; SVG kabul edilmez (betik taşıyabilir). Logo `GET /branding/v1/logos/:orgId/:dosya`
  adresinden sunulur; yeni logo yüklenince eskisi silinir. Harici bir `https` adresi de `logo_url` ile verilebilir.
- **Sistem e-postaları** (davet, kullanım/deneme uyarıları, kanal ve webhook sağlık bildirimleri, veri ambarı hataları;
  parola sıfırlama ve e-posta doğrulama ise istek markalı panel alan adından geldiyse) markanızla gider: ürün adı, logo, birincil renk, destek adresi; bağlantılar
  etkin panel alan adınıza yönelir. "Powered by Pushizo" yalnızca planınız izin veriyor ve gizlemeyi seçtiyseniz
  kaldırılır.
- Alt organizasyonun kendi markası yoksa bayinin markası kullanılır.

## 2. Özel alan adları

Desteklenen türler:

| Tür | Ne sunulur |
|-----|-----------|
| `dashboard` | Markalı panel (giriş, kayıt ve tüm ekranlar) |
| `tracking` | Açılma/tıklama izleme, abonelikten çıkış ve tercih bağlantıları (`/t/…`) |
| `preference_center` | Abonelik tercih merkezi ve abonelikten çıkış (`/t/p`, `/t/u`) |
| `status_page` | Durum sayfası (`/status`, `/status.json`) |

Ekleme: **Organizasyon → Özel alan adları → Ekle** veya

```http
POST /internal/v1/orgs/:orgId/custom-domains
{ "kind": "dashboard", "hostname": "panel.acme.com" }
→ 201 { "id": "cdm_…", "status": "pending",
        "verification": { "txt_name": "_pushizo-challenge.panel.acme.com", "txt_value": "hs-verify=…",
                          "cname_target": "edge.eu.pushizo.com" } }
```text

DNS'e iki kayıt ekleyin:

| Kayıt | Ad | Değer |
|-------|----|-------|
| TXT | `_pushizo-challenge.panel.acme.com` | `hs-verify=…` (yanıttaki `txt_value`) |
| CNAME | `panel.acme.com` | yanıttaki `cname_target` |

Durumlar: `pending` → (TXT doğrulandı) `verified` → (CNAME de doğru) `active`. Kontrol 5 dakikada bir otomatik yapılır;
beklemek istemezseniz `POST …/custom-domains/:id/verify`. 72 saat içinde doğrulanamayan veya TXT kaydı silinen alan adı
`failed` olur (yeniden doğrulama süreyi yeniden başlatır). `last_error`: `txt_missing`, `txt_mismatch`, `cname_missing`,
`cname_mismatch`, `dns_error`.

- TLS sertifikası, alan adı `active` olduktan sonra ilk istekte otomatik alınır (ACME); ek işlem gerekmez.
- Bir alan adı tüm bölgelerde tek bir organizasyona ait olabilir (başka organizasyonda kayıtlıysa 409). Organizasyon
  başına en çok 20 alan adı; IP adresi, tek etiketli ad, port ve platformun kendi alan adları kullanılamaz.
- Güvenlik: bir türün alan adında yalnızca o türün yolları açılır; izleme/tercih merkezi bağlantısı yalnızca alan
  adının organizasyonuna (veya bayinin alt organizasyonlarına) aitse çalışır. Markalı panelde yapılan oturumlu
  değişiklikler yalnızca o alan adının organizasyonu (ve bayinin alt organizasyonları) için kabul edilir.
- Bölge taşımasından sonra CNAME'i yeni bölgenin hedefine güncelleyin ([Veri yerleşimi](/docs/security/data-residency)).

## 3. Bayi hesabı

Bayi (Enterprise + `reseller`) alt organizasyonlar oluşturur ve yönetir. Alt organizasyonlar ayrı kiracılardır; verileri
birbirinden ve bayiden yalıtılmıştır. Tek seviye desteklenir (alt organizasyon bayi olamaz).

| İşlem | Uç (yetki `org.manage`) |
|-------|-------------------------|
| Alt organizasyonları listele / oluştur | `GET` / `POST /internal/v1/orgs/:orgId/reseller/children` (`name`, isteğe bağlı `slug`, `plan_code`) |
| Askıya al / sürdür | `POST …/children/:childId/suspend` (`reason`), `POST …/children/:childId/resume` |
| Destek erişimi al / bırak | `POST` / `DELETE …/children/:childId/support-access` (`role`: `admin` \| `viewer`) |
| Aylık döküm (yetki `billing.manage`) | `GET …/reseller/statement?month=YYYY-AA` |

- Yeni alt organizasyonun sahibi işlemi yapan bayi üyesidir; varsayılan plan `starter`, deneme süresi yoktur. Bayi alt
  organizasyona **kendi planından yüksek bir plan atayamaz** (400, `details.max_plan_code`).
- Askıya alma: bayi yalnızca kendi koyduğu askıyı (`reseller:` önekli neden) kaldırabilir; platformun koyduğu askılar
  destek ekibine aittir.
- Destek erişimi alt organizasyonda geri alınabilir bir üyeliktir ve hem bayinin hem alt organizasyonun denetim kaydına
  yazılır.
- Faturalama bayi üzerinden toplu yapılır: alt organizasyonun kendi ödeme akışı yoktur (`409 reseller_managed`). Döküm
  her alt organizasyon için plan bedeli ve kullanımı (gönderilen mesaj, olay, API isteği; ayın en yüksek aktif abone ve
  MAU değeri) ile toplamları verir.
- Alt organizasyonlar bayiyle aynı veri bölgesinde oluşturulur; bayi hiyerarşisindeki bir organizasyon tek başına başka
  bölgeye taşınamaz.

Bu sayfada