Event Streams: webhook gövde şablonu ve olay filtresi
Event Streams, giden webhook'ların (docs/webhooks.md) gövdesini alıcının beklediği biçime dönüştürmenizi ve yalnızca ilgilendiğiniz olayları almanızı sağlar (ADR-0030). Dashboard'da Geliştirici → Webhooks → endpoint…
Event Streams, giden webhook'ların (docs/webhooks.md) gövdesini alıcının beklediği biçime
dönüştürmenizi ve yalnızca ilgilendiğiniz olayları almanızı sağlar
(docs/adr/0030-event-streams-ve-veri-ambari.md). Dashboard'da Geliştirici → Webhooks → endpoint formu →
Event Streams bölümünden veya API'de body_template, body_content_type, filters alanlarıyla ayarlanır.
Gövde şablonu (Liquid)
Şablon boşsa standart gövde gönderilir. Şablonda olay event adıyla kullanılır:
| Alan | Örnek |
|---|---|
event.id | whe_01J… (alıcı tarafında tekilleştirme) |
event.type | delivery.clicked |
event.created_at | 2026-10-15T09:30:00.000Z |
event.app_id | app_01J… |
event.data | Olay türüne özgü veri (bkz. webhook olay kataloğu) |
application/json (varsayılan): değişken çıktıları otomatik olarak JSON dize içeriği olarak kaçışlanır, bu yüzden
tırnak içinde güvenle kullanılır. Bir nesneyi olduğu gibi gömmek için json ve raw filtrelerini birlikte kullanın.
Çıktı geçerli JSON olmalıdır.
{
"text": "{{ event.type }} — kampanya {{ event.data.campaign_id }}",
"user": "{{ event.data.user.external_id }}",
"event": {{ event | json | raw }}
}text/plain: kaçış yapılmaz, çıktı olduğu gibi gönderilir (Content-Type: text/plain; charset=utf-8).
{{ event.type }} {{ event.data.delivery_id }} {{ event.created_at }}Kurallar:
- Şablon en fazla 64 KB, render çıktısı en fazla 1 MB.
include/render/layoutetiketleri ve bilinmeyen filtreler kullanılamaz; render süresi ve belleği sınırlıdır. - Batch modunda (yüksek hacimli
delivery.*olayları) şablon her olay için ayrı render edilir: JSON türünde sonuçlar bir dizi ([…, …]), metin türünde satırlar olarak gönderilir. - İmza (
Pushizo-Signature) gönderilen gövde üzerinden hesaplanır; doğrulama değişmez. - Şablon hatası (render hatası, geçersiz JSON, aşırı büyük çıktı) teslimde istek gönderilmeden kalıcı hata olarak
kaydedilir (
template_invalid_json: …gibi açık hata metni, teslim geçmişinde görünür). Şablonu düzeltip Yeniden gönder ile tekrar iletebilirsiniz. Kayıt sırasında sözdizimi hatası olan şablon reddedilir.
Olay filtresi
Filtre yoksa abone olunan tüm olaylar gönderilir. Koşullar all (hepsi) veya any (herhangi biri) ile birleşir;
en fazla 20 koşul.
| Alan | Açıklama |
|---|---|
event_type | Olay türü |
app_id | App kimliği |
campaign_id | Kampanya (data.campaign_id, data.message.campaign_id veya data.campaign.id) |
message_id | Mesaj (data.message_id veya data.message.id) |
channel | Kanal (data.channel veya data.subscription.channel) |
event_name | Özel olay adı (event.received, conversion.created) |
journey_id | Journey |
user_external_id | Kullanıcının external_id'si |
data.<yol> | Gövdedeki herhangi bir alan (en fazla 5 segment), ör. data.event.properties.plan |
Operatörler: eq, neq, in, not_in (değer listesi), starts_with, contains (metinde alt dize, dizide eleman),
exists, not_exists. Karşılaştırma metin olarak yapılır (120 ile "120" eşittir).
{
"match": "all",
"conditions": [
{ "field": "campaign_id", "op": "eq", "value": "cmp_01JABC…" },
{ "field": "channel", "op": "in", "value": ["ios_push", "android_push"] }
]
}Filtre olay üretildiği anda uygulanır: eşleşmeyen olaylar için teslim kaydı oluşmaz. Filtreyi sonradan
değiştirirseniz henüz gönderilmemiş eşleşmeyen teslimler filtered_out hatasıyla kapatılır. event.received için
mevcut olay adı filtresi (event_filters.event_names) zorunlu olmaya devam eder ve Event Streams filtresiyle birlikte
uygulanır.
Önizleme
Kaydetmeden önce sonucu görün; istek gönderilmez:
curl -X POST "$API/v1/apps/$APP_ID/webhooks/preview" -H "Authorization: Bearer $HS_KEY" -H 'content-type: application/json' -d '{
"event_type": "delivery.clicked",
"data": { "campaign_id": "cmp_01JABC…", "channel": "ios_push" },
"body_template": "{\"text\": \"{{ event.type }}\"}",
"filters": { "match": "all", "conditions": [{ "field": "campaign_id", "op": "eq", "value": "cmp_01JABC…" }] }
}'Yanıt: matched (filtreden geçer mi), failed_conditions, body (render çıktısı), content_type ve hata varsa
error.code (render_error, invalid_json, body_too_large). data verilmezse olay türünün örnek verisi kullanılır.
JWT ile kimlik doğrulama (SDK identity verification)
Kullanıcı kimliğinizi (external_id) SDK'ya verirken başkasının kimliğine bürünülmesini önlemek için kanıt istenir. İki yöntem vardır ve app ayarında seçilir (ADR-0023 §9):
Veri ambarına dışa aktarım
Pushizo; teslimat, olay, dönüşüm, kullanıcı ve abonelik verilerini düzenli olarak kendi veri ambarınıza aktarır: BigQuery, Snowflake veya S3 (Parquet). İlk çalıştırma geçmiş verinin tamamını, sonrakiler yalnızca yeni ve…