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.
| Özellik | Plan |
|---|---|
| Marka (ad, logo, renkler, destek e-postası) ve özel alan adları | Growth ve Enterprise (white_label) |
| "Powered by Pushizo" ibaresini gizleme | Enterprise (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.Bot koruması (Cloudflare Turnstile)
Kayıt, parola sıfırlama ve doğrulama e-postası yeniden gönderimini Cloudflare Turnstile ile koruma — ortam değişkenleri, dashboard davranışı, API hataları, CSP ve devre dışı durum.
Güvenlik gözden geçirmesi — OWASP ASVS 4.0 (Seviye 2) kontrol listesi (Faz 14)
Tarih: 2026-10-13. Kapsam: API (apps/api), worker, dashboard, SDK uçları, veri katmanı. Her madde kodda doğrulanmış kanıta (dosya/test) bağlanır; "kısmi"/"açık" maddeler go-live öncesi GO_LIVE_CHECKLIST.md ile izlenir.…