Kullanıcılar, alias'lar ve abonelikler
Pushizo kimlik modeli — end user, external_id ve özel alias'lar, abonelikler (cihaz, e-posta, telefon), tag/özellik/deltas, anonim → kimlikli birleştirme, olaylar ve public API uçları.
Pushizo'da kullanıcı (usr_…) sizin son kullanıcınızdır; bir kullanıcının birden fazla aboneliği (sub_…) olabilir: iOS/Android/Huawei cihaz token'ı, tarayıcı aboneliği, e-posta adresi, telefon numarası, WhatsApp/RCS numarası. Kullanıcı alias'larla adreslenir: external_id (sizin kimliğiniz), hs_id (Pushizo kimliği) ve crm_id gibi özel etiketler.
Kullanıcı usr_01J… ── alias: external_id=user_42, crm_id=C-9 ── tags {plan: pro}, properties {city: İzmir}
├─ sub_… ios_push (token, cihaz, dil, saat dilimi, izin)
├─ sub_… web_push (endpoint + keys)
├─ sub_… email ayse@example.com
└─ sub_… sms +905321234567Anonimden kimlikliye
İstemci SDK'sı açılışta anonim bir kullanıcı ve cihaz aboneliği oluşturur. login(externalId) çağrıldığında abonelik external_id'li kullanıcıya bağlanır; kullanıcı yoksa anonim kayıt kimlik kazanır, varsa anonim kullanıcı mevcut olana birleştirilir (tag/özellik/tercih birleşir, user.merged webhook'u çıkar). logout() cihazı yeni bir anonim kullanıcıya ayırır. Birden fazla cihaz aynı external_id ile login olunca tek kullanıcıda toplanır.
App ayarında identity verification zorunluysa login yalnızca sunucunuzun ürettiği identity_hash = HMAC-SHA256(sdk_secret, external_id) ya da ES256 JWT ile kabul edilir (JWT identity verification).
Tag, özellik, deltas
| Veri | Tür | Kullanım |
|---|---|---|
tags | Record<string, string> (merge-patch; null siler) | Segment koşulları, Liquid ({{ user.tags.plan }}) |
properties | Record<string, string | number | boolean> (merge-patch) | Tiplenmiş alanlar, segment karşılaştırmaları |
deltas | { session_count?, session_time?, purchases?[] } | OneSignal uyumlu sayaçlar (yalnızca PATCH) |
language | ISO 639-1 | Dil haritalı içerik seçimi (contents.tr) |
timezone | IANA | Saat dilimine göre teslimat |
location | enlem/boylam (rıza ile) | Yarıçap segmentleri (konum) |
Tag anahtarı en fazla 64, değeri 500 karakterdir; kullanıcı başına tag sayısı plan kotasına tabidir.
Public API
| İşlem | Uç | Kapsam |
|---|---|---|
| Oluştur/güncelle (upsert) | POST /v1/apps/{app_id}/users { identity: { external_id, … }, tags, properties, subscriptions[] } — Idempotency-Key desteklenir | users:write |
| Alias ile oku | GET /v1/apps/{app_id}/users/by/{label}/{value} (external_id, hs_id ya da özel etiket) | users:read |
| Tag/özellik/deltas | PATCH /v1/apps/{app_id}/users/by/{label}/{value} | users:write |
| Alias ekle / kaldır | PATCH …/identity { identity: { crm_id: "C-9" } }, DELETE …/identity/{alias_label} | users:write |
| Tüm kimlikler | GET …/identity | users:read |
| Abonelik ekle | POST …/subscriptions { channel, token, device?, opt_in? } | users:write |
| Abonelik oku/güncelle/sil | `GET | PATCH |
| Sahip ata | POST …/subscriptions/{id}/owner { external_id } | users:write |
| Liste / arama | GET /v1/apps/{app_id}/users?q=&tag=&last_active_after=&sort=; POST …/users/search (segment tanımı) | users:read |
| Dışa aktar (KVKK) | GET …/export → profil, alias, abonelik, son olaylar | users:read |
| Sil (KVKK) | DELETE /v1/apps/{app_id}/users/by/{label}/{value} → abonelikler silinir, olaylar anonimleşir | users:write |
| Olay gönder | POST /v1/apps/{app_id}/events { events: [{ external_id, name, properties?, value?, timestamp? }] } | events:write |
Tüm alanlar, yanıt şemaları ve 8 dilde örnekler: API → Kullanıcılar ve abonelikler, olay tanımları. Dashboard: Kitle → Kullanıcılar (arama, segment filtresi, kullanıcı detayı: abonelikler, zaman çizelgesi, bildirim kutusu, tercihler).
Abonelik durumları
active (gönderilebilir), pending (izin bekliyor), unsubscribed (opt-out, STOP, tek tık), invalid (sağlayıcı reddetti: 410, bounce). invalid abonelikler yeniden kayıtta active olur; unsubscribed yalnızca kullanıcı eylemi (optIn, START, tercih) ya da PATCH ile opt_in: true ile açılır. Durum değişimleri subscription.created|unsubscribed|invalidated webhook'larını üretir.
Olaylar ve dönüşüm
Pushizo.Session.sendEvent('purchase', { sku: 'A1' }, 49.9) ya da POST /v1/apps/{app_id}/events. Olay tanımları (GET /v1/apps/{app_id}/events/definitions) ad, ilk/son görülme ve 30 günlük sayımı tutar; PATCH …/definitions/{name} ile is_conversion işaretlenen olaylar mesaj tıklamasından sonraki pencerede dönüşüm olarak atfedilir (direct_click / influenced). Olaylar segment koşullarını, journey ve in-app tetiklerini besler.
Toplu içe/dışa aktarma
CSV ile toplu kullanıcı/abonelik yükleme (csv_users) ve OneSignal player CSV'si (onesignal_players) için dışa/içe aktarma; içe aktarma webhook üretmez.
Bildirim kutusu (inbox)
Uygulama içi bildirim kutusu — add_to_inbox ile mesaj ekleme, geçerlilik süresi, SDK ve public API uçları, okundu/arşiv durumları.
Segmentler
Dinamik ve statik segmentler, koşul AST'si (all/any/none), alan ve operatör listesi, davranış ve konum koşulları, önizleme/tahmin uçları ve kampanya kullanımı.