T-SOFT/Uygulama Geliştirme/Vitrin Olayları

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.

embed/v1/content.js
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' });
ParametreAçıklama
nameOlay adı ya da tüm olaylar için all_events
fnOlay nesnesiyle çağrılır. Her abone kendi kopyasını alır
options.consentanalytics, marketing ya da functional. Verilmezse marketing sayılır
options.consentModeYalnı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.

DurumDavranış
Mağazada çerez uyarısı kapalıTüm olaylar iletilir
Uyarı açık, ziyaretçi karar vermediOlaylar bekletilir, iletilmez
Ziyaretçi kategoriye izin verdiBekleyen olaylar o anda, sonrakiler yayınlandıkça iletilir
Ziyaretçi kategoriyi reddettiOlay 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 } }

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 });
VitrinconsentMode: true aboneye
OS2Rıza yokken de olay iletilir. Vitrin, hiçbir etiket yüklenmeden Google'a "rıza yok" sinyalini verir. Olaydaki consent alanı false gelir
V5Etkisi 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": { … } }
}
AlanAçıklama
idOlay kimliği. Sunucu taraflı API'lerle tekilleştirmede kullanın (aşağıda)
context.page_typehome, product, category, brand, search, cart, order …
context.currencyZiyaretçinin seçtiği para birimi, ISO 4217 (TRY, USD, EUR)
context.storefrontos2 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.

OlayKimlik
checkout_completedorder_<sipariş numarası>. Sunucunuz sipariş webhook'undan aynı kimliği üretebilir
product_added_to_cartSunucunun sepete ekleme yanıtında ürettiği UUID
DiğerleriTarayıcıda üretilen UUID

Ürün satırı

Ürün içeren her olay aynı satır şemasını kullanır.

AlanTürAçıklama
product_idstringÜrün kimliği
product_codestring | nullWeb servis ürün kodu
variant_idstring | nullVaryant kimliği. Varyantsız üründe null
variant_codestring | nullWeb servis varyant kodu
namestringÜrün adı
brandstring | nullMarka
categorystring | nullSon kategori
category_pathstring | nullEv > Mutfak > Kupalar
price_with_vatnumber | nullKDV dahil birim fiyat
price_without_vatnumber | nullKDV hariç birim fiyat
vat_ratenumber | nullKDV oranı, yüzde (20)
currencystringFiyatların para birimi, ISO 4217
quantitynumberAdet. Sepet olaylarında eklenen ya da çıkarılan adet
urlstring | nullÜrün adresi (varsa)
imagestring | nullGö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_viewedview_item
collection_viewedview_item_list
search_submittedsearch
product_added_to_cartadd_to_cart
product_removed_from_cartremove_from_cart
checkout_startedbegin_checkout
checkout_completedpurchase ve Google Ads dönüşümü
collection_items_loadedview_item_list
cart_viewedview_cart
checkout_shipping_info_submittedadd_shipping_info
payment_info_submittedadd_payment_info
customer_logged_in, customer_registeredlogin, sign_up
product_added_to_wishlistadd_to_wishlist
form_submittedform_submit ve Google Ads dönüşümü

Sıradaki taşımalar: Meta Piksel, Google Tag Manager, TikTok Pixel.

Kendi piksel uygulamanızı yazıyorsanız GA4 olaylarını analytics, reklam platformu olaylarını marketing rızasıyla dinleyin. consentMode'u yalnız Google etiketlerinde açın.