Vitrin Olayları
Mağaza vitrini ziyaretçinin alışveriş adımlarını standart olaylar olarak yayınlar: ürün görüntüleme, sepete ekleme, ödemeye geçme, sipariş tamamlama. Piksel ve analitik uygulamaları sayfanın HTML'inden veri okumak yerine bu olaylara abone olur.
- Veri sunucudan gelir. Ürün kimliği, varyant, fiyat ve para birimi mağazanın sunucuda ürettiği değerlerdir. Tema değişse de olay aynı kalır.
- Şema sabittir. OS2 ve V5 vitrinlerinde aynı olay aynı alanlarla gelir.
- Rıza katmanda uygulanır. Ziyaretçi bir çerez kategorisine izin vermediyse o kategoriyle abone olan uygulamaya olay gitmez.
Abone olma
Olay katmanı <head>'de, uygulama script'lerinden önce yüklenir. Embed script'iniz çalıştığında window.tsoft.analytics hazırdır.
window.tsoft.analytics.subscribe('product_added_to_cart', (event) => {
const { item } = event.data;
fbq('track', 'AddToCart', {
content_ids: [item.product_code],
value: item.price_with_vat * item.quantity,
currency: item.currency,
}, { eventID: event.id });
}, { consent: 'marketing' });
| Parametre | Açıklama |
|---|---|
name | Olay adı ya da tüm olaylar için all_events |
fn | Olay nesnesiyle çağrılır. Her abone kendi kopyasını alır |
options.consent | analytics, marketing ya da functional. Verilmezse marketing sayılır |
options.consentMode | Yalnız Google Consent Mode'a uyan etiketler için true (aşağıda) |
subscribe aboneliği kaldıran bir fonksiyon döner.
Sayfa yüklendikten sonra abone olursanız o sayfada daha önce yayınlanmış olaylar da size sırayla iletilir. page_viewed ya da product_viewed olayını kaçırmazsınız. Bilinmeyen bir olay adına abonelik reddedilir ve konsola uyarı düşer.
Rıza
Abonenin consent beyanı, mağazanın çerez uyarısındaki kategoriyle eşleştirilir.
| Durum | Davranış |
|---|---|
| Mağazada çerez uyarısı kapalı | Tüm olaylar iletilir |
| Uyarı açık, ziyaretçi karar vermedi | Olaylar bekletilir, iletilmez |
| Ziyaretçi kategoriye izin verdi | Bekleyen olaylar o anda, sonrakiler yayınlandıkça iletilir |
| Ziyaretçi kategoriyi reddetti | Olay iletilmez. Sayfa kapanınca bekleyenler atılır |
Her olay, aboneye iletildiği andaki rıza durumunu consent alanında taşır:
{ "consent": { "functional": true, "analytics": true, "marketing": false } }
Google Consent Mode
gtag ve Google Tag Manager rıza yokken çerez yazmadan çalışabilir: Google olayı çerezsiz pinge çevirir ve dönüşümü modeller ("gelişmiş" Consent Mode). Bu etiketler consentMode: true ile abone olabilir.
Çerezsiz pingler IP adresi ve tarayıcı bilgisi taşıyabilir; KVKK açısından kişisel veri sayılıp sayılmadıkları tartışmalıdır. Bu yüzden consentMode'u varsayılan olarak açmayın: mağazaya bir ayar olarak sunun, varsayılanı kapalı olsun. Karar veri sorumlusu olan mağazanındır.
window.tsoft.analytics.subscribe('checkout_completed', sendPurchase, { consent: 'analytics', consentMode: true });
| Vitrin | consentMode: true aboneye |
|---|---|
| OS2 | Rıza yokken de olay iletilir. Vitrin, hiçbir etiket yüklenmeden Google'a "rıza yok" sinyalini verir. Olaydaki consent alanı false gelir |
| V5 | Etkisi yoktur; rıza kuralı aynen uygulanır. V5 vitrini Google'a rıza sinyalini her mağazada garanti etmiyor |
Rıza sonradan verilirse istisnayla iletilmiş olay tekrar gönderilmez.
consentMode: true yalnız Google Consent Mode sinyaline uyan etiketler içindir. Meta, TikTok gibi rıza sinyali almayan bir platforma rızasız olay göndermek KVKK'ya aykırıdır.Olay nesnesi
{
"id": "6f1c2b0e-8a4d-4f7e-9b1a-2c3d4e5f6a7b",
"name": "product_added_to_cart",
"timestamp": "2026-11-10T12:00:00.000Z",
"context": {
"page_type": "product",
"url": "https://magaza.com/kupa",
"language": "tr",
"currency": "TRY",
"storefront": "os2"
},
"data": { "item": { … } }
}
| Alan | Açıklama |
|---|---|
id | Olay kimliği. Sunucu taraflı API'lerle tekilleştirmede kullanın (aşağıda) |
context.page_type | home, product, category, brand, search, cart, order … |
context.currency | Ziyaretçinin seçtiği para birimi, ISO 4217 (TRY, USD, EUR) |
context.storefront | os2 ya da v5 |
Olay kimliği ve tekilleştirme
Meta Conversions API, TikTok Events API gibi sunucu taraflı gönderimlerde aynı dönüşüm hem tarayıcıdan hem sunucudan gelir. Platform ikisini olay kimliğiyle birleştirir.
| Olay | Kimlik |
|---|---|
checkout_completed | order_<sipariş numarası>. Sunucunuz sipariş webhook'undan aynı kimliği üretebilir |
product_added_to_cart | Sunucunun sepete ekleme yanıtında ürettiği UUID |
| Diğerleri | Tarayıcıda üretilen UUID |
Ürün satırı
Ürün içeren her olay aynı satır şemasını kullanır.
| Alan | Tür | Açıklama |
|---|---|---|
product_id | string | Ürün kimliği |
product_code | string | null | Web servis ürün kodu |
variant_id | string | null | Varyant kimliği. Varyantsız üründe null |
variant_code | string | null | Web servis varyant kodu |
name | string | Ürün adı |
brand | string | null | Marka |
category | string | null | Son kategori |
category_path | string | null | Ev > Mutfak > Kupalar |
price_with_vat | number | null | KDV dahil birim fiyat |
price_without_vat | number | null | KDV hariç birim fiyat |
vat_rate | number | null | KDV oranı, yüzde (20) |
currency | string | Fiyatların para birimi, ISO 4217 |
quantity | number | Adet. Sepet olaylarında eklenen ya da çıkarılan adet |
url | string | null | Ürün adresi (varsa) |
image | string | null | Görsel adresi (varsa) |
Mağaza ürünün fiyatını göstermiyorsa fiyat alanları null gelir. Değer hiçbir zaman sayfadaki metinden tahmin edilmez.
Olay kataloğu
page_viewed
Her sayfa açılışında bir kez. data boştur; sayfa bilgisi context'tedir.
product_viewed
Ürün sayfası açıldığında.
{ "product": { "product_id": "101", "variant_id": "7", "price_with_vat": 120, "price_without_vat": 100, "vat_rate": 20, "currency": "TRY", "quantity": 1, … } }
collection_viewed
Kategori ya da marka sayfası açıldığında. items, sayfadaki ilk 50 üründür.
{
"collection": { "id": "3", "name": "Mutfak", "path": "Ev > Mutfak", "type": "category" },
"items": [ { … }, { … } ]
}
type: category ya da brand. Markada path null gelir.
collection_items_loaded
Listede "daha fazla göster" ya da sonsuz kaydırmayla yeni ürünler yüklendiğinde. position_offset, yeni ürünlerden önce listede kaç ürün olduğudur; ürün konumunu sayfalar boyunca kesintisiz vermek için kullanın.
{
"collection": { "id": "3", "name": "Mutfak", "path": "Ev > Mutfak", "type": "category" },
"position_offset": 24,
"items": [ { … } ]
}
Arama sonuçlarında collection null gelir.
search_submitted
Arama sonuç sayfası açıldığında. query sunucunun aldığı arama terimidir.
{ "query": "kupa", "items": [ { … } ] }
product_added_to_cart
Ürün sepete eklendiğinde ya da sepetteki adet artırıldığında. item.quantity eklenen adettir.
{ "item": { "product_id": "101", "variant_id": "7", "quantity": 2, "price_with_vat": 120, … } }
Birden fazla ürün birlikte eklendiğinde her ürün için ayrı olay gelir.
product_removed_from_cart
Ürün sepetten silindiğinde ya da adedi azaltıldığında. item.quantity çıkarılan adettir. "Sepeti boşalt" için olay yayınlanmaz.
product_added_to_wishlist
Ürün favorilere ya da bir alışveriş listesine eklendiğinde.
{ "item": { "product_id": "101", "price_with_vat": 120, "quantity": 1, … } }
cart_viewed
Sepet sayfası açıldığında bir kez. Sepetin tamamını taşır.
{
"cart": {
"total_with_vat": 240,
"total_without_vat": 200,
"currency": "TRY",
"items": [ { … } ]
}
}
checkout_started
Ödeme sayfası açıldığında bir kez. Tutarlar sipariş özetinden gelir.
{
"checkout": {
"total_with_vat": 250,
"total_without_vat": 208.33,
"currency": "TRY",
"items": [ { … } ]
}
}
checkout_shipping_info_submitted
Ziyaretçi adres ve kargo seçimini bitirip ödeme adımına geçtiğinde, bir kez. checkout alanı checkout_started ile aynı şemadadır.
payment_info_submitted
Ziyaretçi ödemeyi gönderdiğinde, ödeme isteğinden hemen önce.
{
"checkout": { … },
"payment_method": { "id": "-2", "name": "Kredi Kartı" }
}
name mağazanın dilindeki ödeme yöntemi adıdır.
checkout_completed
Sipariş onay sayfasında bir kez. Sayfa yenilenirse tekrar yayınlanmaz.
{
"order": {
"id": "TS-1001",
"total_with_vat": 270,
"total_without_vat": 225,
"vat": 45,
"shipping": 20,
"coupon": null,
"currency": "TRY",
"items": [ { … } ]
}
}
Tutarlar siparişin para birimindedir. Cari hesapla ödenen siparişlerde onay sayfasında ürün bilgisi olmadığı için olay yayınlanmaz.
customer_logged_in, customer_registered
Üye girişi ve yeni üye kaydı başarılı olduğunda. Misafir alışverişe devam etmek giriş sayılmaz.
{ "customer": { "id": "55", "group": "Bayi" } }
Olay yalnız üye kimliğini ve grubunu taşır; e-posta, ad ve telefon olaya girmez.
form_submitted
Mağazanın uygulama formlarından biri başarıyla gönderildiğinde (yalnız OS2). Form alanları kişisel veri taşıyabileceği için olaya girmez.
{ "form": { "type": "app_form" } }
Piksel uygulamaları
T-Soft'un kendi piksel uygulamaları bu katmana taşınıyor. Google gtag (GA4 + Ads) 2.0.0 sürümünden itibaren tüm olaylarını buradan üretir. Varsayılan katıdır: rıza yoksa olay gitmez. Mağaza "Gelişmiş Consent Mode" ayarını açarsa OS2'de consentMode: true ile abone olur.
| Vitrin olayı | GA4 olayı |
|---|---|
product_viewed | view_item |
collection_viewed | view_item_list |
search_submitted | search |
product_added_to_cart | add_to_cart |
product_removed_from_cart | remove_from_cart |
checkout_started | begin_checkout |
checkout_completed | purchase ve Google Ads dönüşümü |
collection_items_loaded | view_item_list |
cart_viewed | view_cart |
checkout_shipping_info_submitted | add_shipping_info |
payment_info_submitted | add_payment_info |
customer_logged_in, customer_registered | login, sign_up |
product_added_to_wishlist | add_to_wishlist |
form_submitted | form_submit ve Google Ads dönüşümü |
Sıradaki taşımalar: Meta Piksel, Google Tag Manager, TikTok Pixel.
analytics, reklam platformu olaylarını marketing rızasıyla dinleyin. consentMode'u yalnız Google etiketlerinde açın.