>

>

OpenAI (ChatGPT) Ads Conversion Kurulumunda Dikkat Edilmesi Gerekenler Neler

OpenAI (ChatGPT) Ads Conversion Kurulumunda Dikkat Edilmesi Gerekenler Neler

OpenAI (ChatGPT) Ads Conversion Kurulumunda Dikkat Edilmesi Gerekenler Neler

OpenAI (ChatGPT) Ads Conversion Kurulumunda Dikkat Edilmesi Gerekenler Neler

ChatGPT reklamları artık Türkiye'de de yayında ve e-ticaret siteleri conversion takibini kurmaya başladı. Google Tag Manager üzerinden resmi OpenAI template'i ya da Stape'in template'i ile kurulum kağıt üzerinde basit görünüyor.

ChatGPT reklamları artık Türkiye'de de yayında ve e-ticaret siteleri conversion takibini kurmaya başladı. Google Tag Manager üzerinden resmi OpenAI template'i ya da Stape'in template'i ile kurulum kağıt üzerinde basit görünüyor. Ama birkaç detay atlandığında ya dönüşümler hiç gitmiyor ya da yanlış tutarlarla raporlanıyor. İşte kısaca bilmeniz gerekenler.

Kurulum iki ayrı adımdan oluşuyor: önce OpenAI Ads panelinde conversion'ları (page_viewed, items_added, checkout_started, order_created vb.) tanımlamanız, ardından bu event'leri gönderecek tag'leri Google Tag Manager üzerinden kurmanız gerekiyor. 

Hızlı Özet

  • Amount tam sayı olmalı, kuruş cinsinden. 129,99 TL için 12999 gönderilir, 129.99 değil. Yanlış birim gönderirseniz tutar 100 kat küçük şekilde görünür.

  • Çoklu ürünlü sepetlerde contents dizisini elle doldurmayın. Sepetteki ürün sayısı değişkendir, tabloya sabit satır yazmak yerine dataLayer'ı okuyup diziye çeviren bir değişken kullanın.

  • Purchase'ta transaction_id için ayrı alan yok. Sipariş numarasını Event ID alanına yazabilirsiniz.

  • Consent Mode kontrolünü tek yerde yapın. Stape template'i bunu kendi içinde hallediyor, GTM'de ayrıca "consent gerekiyor" seçmeyin — yoksa onay bekleyen event'ler kaybolur (resmi template'de bu kuyruğa alma özelliği yok).

  • Hash'leme davranışı template'e göre değişir. Resmi template hash'lemeyi kendiniz yapmanızı bekler; Stape'inki hem ham değeri hem hash'li değeri kabul eder ve ikisini ayırt eder.

Detaylara geçelim.

Amount: En Küçük Birim, Tam Sayı

OpenAI'ın pixel'i tutarı ondalıklı değil, para biriminin en küçük birimi (kuruş, cent) cinsinden tam sayı olarak bekler. 500 TL'lik bir ürün için gönderilmesi gereken değer 50000'dir.

Resmi template'de tek bir Amount alanı var ve yalnızca kuruş cinsinden tam sayı kabul ediyor. 500 yazarsanız bu 5 TL olarak, 500.00 yazarsanız hata olarak işlenir.

Stape'in template'inde ise iki ayrı Amount seçeneği var: "lowest unit" (kuruş, 50000) ve "regular unit" (normal tutar, 500). İkisinden yalnızca birini doldurmalısınız — regular unit'i seçtiyseniz düz 500 yazmanız yeterli, çevrimi template kendisi yapar.

Kurulumdan sonra GTM Preview'da tag'in gönderdiği gerçek amount değerini mutlaka kontrol edin, görmeniz gereken değer her durumda 50000 olmalı.

Sepette Birden Fazla Ürün Varsa

checkout_started ve order_created event'leri bir ürün listesi (contents) bekler. GTM de OpenAI' ın resmi template'i sabit sayıda satır sunar; sepette değişken sayıda ürün olduğu için bu tabloya elle satır girmek işe yaramaz.

Doğrusu, dataLayer'daki ürün listesini okuyup OpenAI'ın beklediği formata çeviren bir Custom JavaScript Variable yazmaktır:

function () {

  try {

    var ec = {{DLV - ecommerce}} || {};

    var items = ec.items || [];

    var cur = ec.currency;

    var out = [];

    for (var i = 0; i < items.length; i++) {

      var it = items[i];

      out.push({

        id: String(it.item_id),

        name: it.item_name,

        content_type: 'product',

        quantity: Math.round(it.quantity) || 1,

        amount: Math.round(it.price * 100),

        currency: cur

      });

    }

    return out;

  } catch (e) {

    return [];

  }

}

Bu değişken sepette 1 ürün de olsa 10 ürün de olsa aynı şekilde çalışır, ürün sayısı değiştikçe elle müdahale gerekmez. Örneğin sepette 2 ürün varsa çıktı şöyle olur:

[

  { id: "1001", name: "Kahve Makinesi", content_type: "product", quantity: 1, amount: 89900, currency: "TRY" },

  { id: "1002", name: "Kahve Değirmeni", content_type: "product", quantity: 2, amount: 34900, currency: "TRY" }

]

Purchase'ta Sipariş Numarasını Nereye Yazmalıyız?

OpenAI'ın şemasında ayrı bir transaction_id alanı yok. Bunun yerine sipariş numarasını Event ID alanına yazabilirsiniz. Bu alan aslında deduplikasyon içindir, ama sipariş numarası zaten benzersiz olduğu için amaca birebir uyar. İleride sunucu tarafında Conversions API kurarsanız aynı Event ID'yi orada da kullanarak tarayıcı ve sunucu event'lerinin çift sayılmasını önlersiniz.

Consent Mode: Tek kontrol yeter ama her template aynı değil

Sitede Google Consent Mode varsa, onay kontrolünü iki yerde birden yapmayın. Ancak iki template'in bu konudaki davranışı aynı değil.

Stape'in template'i ad_storage sinyaline kendi içinde bakıyor. Onay yokken pixel'i yüklemiyor ama event'leri sayfa belleğinde bir kuyrukta bekletiyor; onay geldiği anda kuyruktakileri otomatik gönderiyor. Bunu sağlayan "Enable Google Consent Mode support" adında ayrı bir kutu var, açtığınızda bu kuyruğa alma mekanizması devreye giriyor.

Resmi template'de böyle bir kuyruğa alma mekanizması yok. Bu template yalnızca GTM'in kendi native consent kontrolüne (Advanced Settings > Consent Settings, "Require additional consent for tag to fire") güveniyor. Bu kontrol ya var ya yok mantığıyla çalışır: onay yoksa tag'in kendisi hiç tetiklenmez, onay geldiğinde de o anda kaçırılan event geri gelmez — kuyruğa alma ya da yeniden gönderme yapılmaz. Yani bir kullanıcı onay banner'ına tıklamadan sepete ürün eklerse, bu event kalıcı olarak kaybolur.

Bu fark pratikte şu anlama geliyor: consent banner'ına geç tepki veren kullanıcı oranınız yüksekse (mobilde bu oran genelde daha yüksektir), Stape'in template'ini kullanmak veri kaybını azaltma açısından avantajlı olabilir. Resmi template'i kullanmaya devam edecekseniz, GTM'in kendi Consent Settings bölümünde "Require additional consent → ad_storage" seçmeniz gerekir; aksi halde onay olmadan da tag çalışıp veri gönderebilir.

Email ve External ID'yi Hash'leme

Resmi OpenAI template'i kullanıcı verisini önceden hash'lenmiş olarak bekler, kendisi hash'lemez. Elle hash'lemeniz gerekiyorsa GTM'in normal Custom JavaScript Variable'ı harici kütüphane yükleyemediği için kendi kendine yeten bir SHA-256 fonksiyonu gerekir:

function() {

    return sha256( {{value}} ); //replace value with right variable

    function sha256(r){if(r){r=r.toString();for(var $,_,o=Math.pow,f=o(2,32),t="length",a="",n=[],h=8*r[t],i=sha256.h=sha256.h||[],c=sha256.k=sha256.k||[],e=c[t],s={},u=2;e<64;u++)if(!s[u]){for($=0;$<313;$+=u)s[$]=u;i[e]=o(u,.5)*f|0,c[e++]=o(u,1/3)*f|0}for(r+="\x80";r[t]%64-56;)r+="\0";for($=0;$<r[t];$++){if((_=r.charCodeAt($))>>8)return;n[$>>2]|=_<<(3-$)%4*8}for(_=0,n[n[t]]=h/f|0,n[n[t]]=h;_<n[t];){var v=n.slice(_,_+=16),g=i;for($=0,i=i.slice(0,8);$<64;$++){var l=v[$-15],k=v[$-2],x=i[0],S=i[4],d=i[7]+(A(S,6)^A(S,11)^A(S,25))+(S&i[5]^~S&i[6])+c[$]+(v[$]=$<16?v[$]:v[$-16]+(A(l,7)^A(l,18)^l>>>3)+v[$-7]+(A(k,17)^A(k,19)^k>>>10)|0),p=(A(x,2)^A(x,13)^A(x,22))+(x&i[1]^x&i[2]^i[1]&i[2]);(i=[d+p|0].concat(i))[4]=i[4]+d|0}for($=0;$<8;$++)i[$]=i[$]+g[$]|0}for($=0;$<8;$++)for(_=3;_+1;_--){var w=i[$]>>8*_&255;a+=(w<16?0:"")+w.toString(16)}return a}function A(r,$){return r>>>$|r<<32-$}}

}

{{value}} yerine hash'lenecek gerçek değişkeni koyun. Hash'lemeden önce e-postayı küçük harfe çevirip boşlukları silmeyi unutmayın — aksi halde Ali@Ornek.com ile ali@ornek.com farklı hash üretir ve OpenAI eşleştiremez. Email ve External ID için ayrı ayrı değişken oluşturmanız gerekir.

Stape'in template'i burada daha esnek: alana ham değeri (ali@ornek.com) verirseniz template kendisi normalize edip hash'ler; hash'lenmiş değeri (64 karakterlik hex string) verirseniz template bunu tanıyıp dokunmadan olduğu gibi gönderir. Yani hangisini gönderdiğinize kendisi karar veriyor, ikisi de sorunsuz kabul ediliyor. Tek şart, siz hash'liyorsanız normalize etme adımını (küçük harf, boşluk temizleme) hash'lemeden önce kendinizin yapmış olması — template zaten hash'lenmiş bir değeri geriye çevirip normalize edemez.

Son Kontrol

Yayınlamadan önce GTM Preview'da tag'in başarıyla çalıştığını, tarayıcı konsolunda (tag'deki debug seçeneğini geçici açarak) gönderilen amount ve contents değerlerini, son olarak OpenAI Ads Manager'ın Event Stream ekranından event'in ulaştığını kontrol edin. Email ve External ID alanlarının panelde [REDACTED] görünmesi normaldir, bu bir hata değil — veri gitmiştir, panel gizlilik amacıyla maskeler.

Related Post

Related Post

Jul 8, 2026

/

Yazar

Yanlış boyutu yanlış metrikle eşleştirmek ise raporlarınızda yanıltıcı veriler görmenize veya bütçenizi yanlış kanallara yatırmanıza neden olabilir.

Jul 2, 2026

/

Yazar

In this article, we will examine how to create segments in GA4 Explore reports, the Sequence feature within User/Session segments, its differences from standard conditions, and common mistakes.

Jun 5, 2026

/

Yazar

Bu yazıda, Custom HTML tag’lerinin hangi durumlarda kullanıldığını, container’ın neden dolduğunu ve dolmadan önce alınabilecek mimari önlemleri ele alacağız.

Jul 8, 2026

/

Yazar

Yanlış boyutu yanlış metrikle eşleştirmek ise raporlarınızda yanıltıcı veriler görmenize veya bütçenizi yanlış kanallara yatırmanıza neden olabilir.

Jul 2, 2026

/

Yazar

In this article, we will examine how to create segments in GA4 Explore reports, the Sequence feature within User/Session segments, its differences from standard conditions, and common mistakes.