[{"data":1,"prerenderedAt":1027},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ftr\u002Fmarketing\u002Fserver-side-conversions-meta-capiyi-sifirdan-dogru-kurmak":13},{"i18nKey":4,"paths":5},"marketing-001-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fmarketing\u002Fserver-side-conversions-meta-capi-richtig-einrichten","\u002Fen\u002Fmarketing\u002Fserver-side-conversions-setting-up-meta-capi-correctly","\u002Fes\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero","\u002Ffr\u002Fmarketing\u002Fconfigurer-api-conversions-meta-capi-zero-a-heros","\u002Fit\u002Fmarketing\u002Fconfigurare-conversion-api-meta-da-zero","\u002Fru\u002Fmarketing\u002Fserver-side-conversions-meta-capi-sglm-setup","\u002Ftr\u002Fmarketing\u002Fserver-side-conversions-meta-capiyi-sifirdan-dogru-kurmak",{"_path":12,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":1021,"_id":1022,"_source":1023,"_file":1024,"_stem":1025,"_extension":1026},"marketing",false,"","Server-Side Conversions: Meta CAPI'yi Sıfırdan Doğru Kurmak","sGTM + Conversion API mimarisi, event match quality, deduplication stratejileri ve first-party data pipeline'ını iOS 17 sonrası attribution için kurma kılavuzu.","2026-05-07",[21,22,23,24,25],"conversion-api","server-side-gtm","attribution","meta-ads","first-party-data",8,"Roibase",{"type":29,"children":30,"toc":1012},"root",[31,39,46,92,144,150,155,160,245,291,297,338,499,512,663,698,704,723,728,776,795,800,806,811,829,835,856,875,881,921,939,957,967,993,1006],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","iOS 14.5'ten bu yana browser-based pixel'in ölçüm gücü %40-60 düştü. Meta'nın 2025 Q4 verilerine göre CAPI kullanmayan advertiser'ların ortalama Event Match Quality skoru 3.8\u002F10'un altında. Bu da demek oluyor ki algoritmanın optimize edebileceği sinyal sayısı yetersiz. Cookie-less dünyanın ilk fazını browser-side tracker'lar kaybetti. İkinci faz — server-side mimarinin doğru kurulduğu veya üstünkörü atıldığı faz — şu an devam ediyor. Meta Conversion API'yi sGTM üzerinden düzgün kurmak artık opsiyonel değil, performans pazarlamasının altyapı seviyesinde zorunlu.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"pixel-ve-capi-arasındaki-fark-neden-kritik",[44],{"type":37,"value":45},"Pixel ve CAPI arasındaki fark neden kritik",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74,76,82,84,90],{"type":37,"value":50},"Meta Pixel browser'da çalışır. Kullanıcının rızasına bağlıdır, bot traffic'i filtreleyemez, network latency'den etkilenir. CAPI ise sunucudan direkt Meta'ya HTTP POST gönderir. İki farkı var: timing ve veri kalitesi. Pixel ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"PageView",{"type":37,"value":59}," event'ini kullanıcı sayfayı yükleyince atar; CAPI aynı eventi checkout tamamlandıktan sonra backend'den gönderebilir. Bu zaman farkı deduplication'ın temelini oluşturur — iki kaynaktan gelen aynı eventi Meta'nın birleştirmesi gerekiyor. İkinci fark: CAPI'de user identifier'ları sen kontrol edersin. ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"em",{"type":37,"value":67}," (email hash), ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"ph",{"type":37,"value":75}," (telefon hash), ",{"type":32,"tag":52,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"fbc",{"type":37,"value":83}," (Facebook click ID), ",{"type":32,"tag":52,"props":85,"children":87},{"className":86},[],[88],{"type":37,"value":89},"fbp",{"type":37,"value":91}," (browser ID) parametrelerini doğru hash'leyip göndermezsen Event Match Quality düşer. Düşük EMQ demek algoritmanın hangi kullanıcının hangi eventi tetiklediğini %100 anlamadığı demek. Bu da bid optimization'ı köreltiyor. Meta'nın 2024 whitepaper'ında CAPI+Pixel birlikte kullanıldığında ROAS'ta ortalama %13 artış gözlemlendi (n=4200 advertiser, 60 gün window). Fakat bu iyileşme sadece deduplication doğru kurulduğunda gerçekleşiyor.",{"type":32,"tag":33,"props":93,"children":94},{},[95,97,103,105,111,113,119,121,127,129,135,137,142],{"type":37,"value":96},"Pixel'i kapatıp sadece CAPI'ye geçmek de hata. Çünkü browser pixel ",{"type":32,"tag":52,"props":98,"children":100},{"className":99},[],[101],{"type":37,"value":102},"ViewContent",{"type":37,"value":104},", ",{"type":32,"tag":52,"props":106,"children":108},{"className":107},[],[109],{"type":37,"value":110},"AddToCart",{"type":37,"value":112}," gibi ara event'leri real-time toplar; CAPI genelde sadece ",{"type":32,"tag":52,"props":114,"children":116},{"className":115},[],[117],{"type":37,"value":118},"Purchase",{"type":37,"value":120}," için kullanılır. Orta yolu bulmak gerekiyor: pixel'i lightweight tutup, kritik conversion'ları CAPI ile duplicate göndermek. Burada deduplication parametreleri devreye girer. Meta'nın sistemi ",{"type":32,"tag":52,"props":122,"children":124},{"className":123},[],[125],{"type":37,"value":126},"event_id",{"type":37,"value":128}," ve ",{"type":32,"tag":52,"props":130,"children":132},{"className":131},[],[133],{"type":37,"value":134},"event_time",{"type":37,"value":136}," kombinasyonuna bakarak aynı olayı iki kez saymaktan kaçınır. Ama bu parametreleri hem pixel hem CAPI'ye tam olarak aynı şekilde vermezsen dedup çalışmaz. Çoğu implementasyon burada patlar: frontend'de ",{"type":32,"tag":52,"props":138,"children":140},{"className":139},[],[141],{"type":37,"value":126},{"type":37,"value":143}," UUID ile üretilir, backend'de başka bir ID ile gönderilir. Sonuç: iki ayrı event olarak algılanır, ROAS raporlarında şişme başlar.",{"type":32,"tag":40,"props":145,"children":147},{"id":146},"sgtm-altyapısını-kurma-adımları",[148],{"type":37,"value":149},"sGTM altyapısını kurma adımları",{"type":32,"tag":33,"props":151,"children":152},{},[153],{"type":37,"value":154},"Server-side Google Tag Manager olmadan CAPI kurulumu yapılabilir — doğrudan backend'den Meta'ya POST atabilirsin. Ama bu yaklaşım scaling'de sorun çıkarır. Birden fazla destination (Google Ads Enhanced Conversions, TikTok Events API, Snapchat CAPI) eklediğinde her biri için ayrı endpoint yazmak gerekir. sGTM bir abstraction layer sağlar: tek bir server container tüm tagging ihtiyacını karşılar. Google Cloud Run veya App Engine üzerinde host edilir. Client-side GTM container'dan gelen HTTP request'leri yakalar, server-side tag'leri tetikler, ardından Meta, Google, TikTok'a paralel POST gönderir.",{"type":32,"tag":33,"props":156,"children":157},{},[158],{"type":37,"value":159},"Kurulum akışı şöyle:",{"type":32,"tag":161,"props":162,"children":163},"ol",{},[164,184,210,220],{"type":32,"tag":165,"props":166,"children":167},"li",{},[168,174,176,182],{"type":32,"tag":169,"props":170,"children":171},"strong",{},[172],{"type":37,"value":173},"Cloud Run instance oluştur:",{"type":37,"value":175}," ",{"type":32,"tag":52,"props":177,"children":179},{"className":178},[],[180],{"type":37,"value":181},"gcloud run deploy gtm-server --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable --platform=managed --region=europe-west1",{"type":37,"value":183},". Bu komut Google'ın resmi sGTM image'ını deploy eder.",{"type":32,"tag":165,"props":185,"children":186},{},[187,192,194,200,202,208],{"type":32,"tag":169,"props":188,"children":189},{},[190],{"type":37,"value":191},"Tagging Server URL'i al:",{"type":37,"value":193}," Deploy tamamlanınca ",{"type":32,"tag":52,"props":195,"children":197},{"className":196},[],[198],{"type":37,"value":199},"https:\u002F\u002Fgtm-server-xxxxx-ew.a.run.app",{"type":37,"value":201}," gibi bir URL alırsın. Bu URL'i client-side GTM'de ",{"type":32,"tag":52,"props":203,"children":205},{"className":204},[],[206],{"type":37,"value":207},"serverContainerUrl",{"type":37,"value":209}," parametresine yazacaksın.",{"type":32,"tag":165,"props":211,"children":212},{},[213,218],{"type":32,"tag":169,"props":214,"children":215},{},[216],{"type":37,"value":217},"Client-side GTM'de GA4 tag'ini değiştir:",{"type":37,"value":219}," Normalde GA4 eventi doğrudan Google'a gider. Transport URL olarak sGTM URL'ini set edersen GA4 verileri önce senin sunucuna, oradan Google'a gider. Bu aynı zamanda IP anonymization ve user-agent normalization'ı sunucuda yapma imkanı verir.",{"type":32,"tag":165,"props":221,"children":222},{},[223,228,230,236,237,243],{"type":32,"tag":169,"props":224,"children":225},{},[226],{"type":37,"value":227},"sGTM container'ında Meta CAPI tag'i ekle:",{"type":37,"value":229}," \"Meta Conversions API\" template'ini kullan. ",{"type":32,"tag":52,"props":231,"children":233},{"className":232},[],[234],{"type":37,"value":235},"Pixel ID",{"type":37,"value":128},{"type":32,"tag":52,"props":238,"children":240},{"className":239},[],[241],{"type":37,"value":242},"Access Token",{"type":37,"value":244}," gir. Access Token'ı Events Manager > Settings > Conversions API'den alırsın. Burada test event'i göndererek bağlantıyı doğrulayabilirsin.",{"type":32,"tag":33,"props":246,"children":247},{},[248,250,256,258,264,266,271,273,278,280,289],{"type":37,"value":249},"sGTM'nin bir avantajı: aynı request içinde hem GA4 hem CAPI'ye event gönderilebilir. Client-side bir ",{"type":32,"tag":52,"props":251,"children":253},{"className":252},[],[254],{"type":37,"value":255},"dataLayer.push",{"type":37,"value":257}," ile tetiklenen trigger, server-side iki farklı tag'i tetikler. Bu sayede backend'de iki ayrı API call yazmana gerek kalmaz. Fakat burada da dikkat edilmesi gereken nokta var: GA4'ten gelen ",{"type":32,"tag":52,"props":259,"children":261},{"className":260},[],[262],{"type":37,"value":263},"client_id",{"type":37,"value":265}," ile Meta'nın istediği ",{"type":32,"tag":52,"props":267,"children":269},{"className":268},[],[270],{"type":37,"value":89},{"type":37,"value":272}," aynı değil. Bu yüzden sGTM container'ında bir transformation variable oluşturman gerekir — ",{"type":32,"tag":52,"props":274,"children":276},{"className":275},[],[277],{"type":37,"value":89},{"type":37,"value":279}," cookie'sini alıp CAPI tag'ine map etmen lazım. Bu mapping için ",{"type":32,"tag":281,"props":282,"children":286},"a",{"href":283,"rel":284},"https:\u002F\u002Fwww.roibase.com.tr\u002Ftr\u002Fppc",[285],"nofollow",[287],{"type":37,"value":288},"first-party veri mimarisi",{"type":37,"value":290}," gerekiyor; yoksa identifier'lar senkronize olmaz, EMQ düşer.",{"type":32,"tag":40,"props":292,"children":294},{"id":293},"event-match-qualityyi-yükseltmek",[295],{"type":37,"value":296},"Event Match Quality'yi yükseltmek",{"type":32,"tag":33,"props":298,"children":299},{},[300,302,307,309,314,316,322,324,329,331,336],{"type":37,"value":301},"EMQ Meta'nın \"bu eventi hangi kullanıcıya atayabilirim\" sorusuna verdiği güven skoru. Maksimum 10. 8'in üstü mükemmel, 6'nın altı sorunlu. EMQ'yu yükselten şey doğru identifier kombinasyonu. Meta'nın dökümanına göre öncelik sırası: ",{"type":32,"tag":52,"props":303,"children":305},{"className":304},[],[306],{"type":37,"value":65},{"type":37,"value":308}," (email) > ",{"type":32,"tag":52,"props":310,"children":312},{"className":311},[],[313],{"type":37,"value":73},{"type":37,"value":315}," (telefon) > ",{"type":32,"tag":52,"props":317,"children":319},{"className":318},[],[320],{"type":37,"value":321},"external_id",{"type":37,"value":323}," (CRM ID) > ",{"type":32,"tag":52,"props":325,"children":327},{"className":326},[],[328],{"type":37,"value":81},{"type":37,"value":330}," > ",{"type":32,"tag":52,"props":332,"children":334},{"className":333},[],[335],{"type":37,"value":89},{"type":37,"value":337},". Email ve telefonu SHA-256 ile hash'leyip küçük harfe çevir, boşluk bırakma. Örnek:",{"type":32,"tag":339,"props":340,"children":344},"pre",{"className":341,"code":342,"language":343,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Yanlış hash\nconst email = \" John@Example.com \";\nconst hash = sha256(email); \u002F\u002F Boşluklar ve büyük harf sorun\n\n\u002F\u002F Doğru hash\nconst email = \"john@example.com\";\nconst hash = sha256(email); \u002F\u002F SHA-256: a665a...\n","javascript",[345],{"type":32,"tag":52,"props":346,"children":347},{"__ignoreMap":16},[348,360,393,426,436,445,470],{"type":32,"tag":349,"props":350,"children":353},"span",{"class":351,"line":352},"line",1,[354],{"type":32,"tag":349,"props":355,"children":357},{"style":356},"--shiki-default:#6A737D",[358],{"type":37,"value":359},"\u002F\u002F Yanlış hash\n",{"type":32,"tag":349,"props":361,"children":363},{"class":351,"line":362},2,[364,370,376,381,387],{"type":32,"tag":349,"props":365,"children":367},{"style":366},"--shiki-default:#F97583",[368],{"type":37,"value":369},"const",{"type":32,"tag":349,"props":371,"children":373},{"style":372},"--shiki-default:#79B8FF",[374],{"type":37,"value":375}," email",{"type":32,"tag":349,"props":377,"children":378},{"style":366},[379],{"type":37,"value":380}," =",{"type":32,"tag":349,"props":382,"children":384},{"style":383},"--shiki-default:#9ECBFF",[385],{"type":37,"value":386}," \" John@Example.com \"",{"type":32,"tag":349,"props":388,"children":390},{"style":389},"--shiki-default:#E1E4E8",[391],{"type":37,"value":392},";\n",{"type":32,"tag":349,"props":394,"children":396},{"class":351,"line":395},3,[397,401,406,410,416,421],{"type":32,"tag":349,"props":398,"children":399},{"style":366},[400],{"type":37,"value":369},{"type":32,"tag":349,"props":402,"children":403},{"style":372},[404],{"type":37,"value":405}," hash",{"type":32,"tag":349,"props":407,"children":408},{"style":366},[409],{"type":37,"value":380},{"type":32,"tag":349,"props":411,"children":413},{"style":412},"--shiki-default:#B392F0",[414],{"type":37,"value":415}," sha256",{"type":32,"tag":349,"props":417,"children":418},{"style":389},[419],{"type":37,"value":420},"(email); ",{"type":32,"tag":349,"props":422,"children":423},{"style":356},[424],{"type":37,"value":425},"\u002F\u002F Boşluklar ve büyük harf sorun\n",{"type":32,"tag":349,"props":427,"children":429},{"class":351,"line":428},4,[430],{"type":32,"tag":349,"props":431,"children":433},{"emptyLinePlaceholder":432},true,[434],{"type":37,"value":435},"\n",{"type":32,"tag":349,"props":437,"children":439},{"class":351,"line":438},5,[440],{"type":32,"tag":349,"props":441,"children":442},{"style":356},[443],{"type":37,"value":444},"\u002F\u002F Doğru hash\n",{"type":32,"tag":349,"props":446,"children":448},{"class":351,"line":447},6,[449,453,457,461,466],{"type":32,"tag":349,"props":450,"children":451},{"style":366},[452],{"type":37,"value":369},{"type":32,"tag":349,"props":454,"children":455},{"style":372},[456],{"type":37,"value":375},{"type":32,"tag":349,"props":458,"children":459},{"style":366},[460],{"type":37,"value":380},{"type":32,"tag":349,"props":462,"children":463},{"style":383},[464],{"type":37,"value":465}," \"john@example.com\"",{"type":32,"tag":349,"props":467,"children":468},{"style":389},[469],{"type":37,"value":392},{"type":32,"tag":349,"props":471,"children":473},{"class":351,"line":472},7,[474,478,482,486,490,494],{"type":32,"tag":349,"props":475,"children":476},{"style":366},[477],{"type":37,"value":369},{"type":32,"tag":349,"props":479,"children":480},{"style":372},[481],{"type":37,"value":405},{"type":32,"tag":349,"props":483,"children":484},{"style":366},[485],{"type":37,"value":380},{"type":32,"tag":349,"props":487,"children":488},{"style":412},[489],{"type":37,"value":415},{"type":32,"tag":349,"props":491,"children":492},{"style":389},[493],{"type":37,"value":420},{"type":32,"tag":349,"props":495,"children":496},{"style":356},[497],{"type":37,"value":498},"\u002F\u002F SHA-256: a665a...\n",{"type":32,"tag":33,"props":500,"children":501},{},[502,504,510],{"type":37,"value":503},"CAPI request'inde ",{"type":32,"tag":52,"props":505,"children":507},{"className":506},[],[508],{"type":37,"value":509},"user_data",{"type":37,"value":511}," objesi şu şekilde olmalı:",{"type":32,"tag":339,"props":513,"children":517},{"className":514,"code":515,"language":516,"meta":16,"style":16},"language-json shiki shiki-themes github-dark","{\n  \"em\": [\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"],\n  \"ph\": [\"sha256_telefon_hash\"],\n  \"fbc\": \"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\",\n  \"fbp\": \"fb.1.1558571054389.1098115397\",\n  \"client_ip_address\": \"93.184.216.34\",\n  \"client_user_agent\": \"Mozilla\u002F5.0...\"\n}\n","json",[518],{"type":32,"tag":52,"props":519,"children":520},{"__ignoreMap":16},[521,529,552,573,596,617,638,655],{"type":32,"tag":349,"props":522,"children":523},{"class":351,"line":352},[524],{"type":32,"tag":349,"props":525,"children":526},{"style":389},[527],{"type":37,"value":528},"{\n",{"type":32,"tag":349,"props":530,"children":531},{"class":351,"line":362},[532,537,542,547],{"type":32,"tag":349,"props":533,"children":534},{"style":372},[535],{"type":37,"value":536},"  \"em\"",{"type":32,"tag":349,"props":538,"children":539},{"style":389},[540],{"type":37,"value":541},": [",{"type":32,"tag":349,"props":543,"children":544},{"style":383},[545],{"type":37,"value":546},"\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"",{"type":32,"tag":349,"props":548,"children":549},{"style":389},[550],{"type":37,"value":551},"],\n",{"type":32,"tag":349,"props":553,"children":554},{"class":351,"line":395},[555,560,564,569],{"type":32,"tag":349,"props":556,"children":557},{"style":372},[558],{"type":37,"value":559},"  \"ph\"",{"type":32,"tag":349,"props":561,"children":562},{"style":389},[563],{"type":37,"value":541},{"type":32,"tag":349,"props":565,"children":566},{"style":383},[567],{"type":37,"value":568},"\"sha256_telefon_hash\"",{"type":32,"tag":349,"props":570,"children":571},{"style":389},[572],{"type":37,"value":551},{"type":32,"tag":349,"props":574,"children":575},{"class":351,"line":428},[576,581,586,591],{"type":32,"tag":349,"props":577,"children":578},{"style":372},[579],{"type":37,"value":580},"  \"fbc\"",{"type":32,"tag":349,"props":582,"children":583},{"style":389},[584],{"type":37,"value":585},": ",{"type":32,"tag":349,"props":587,"children":588},{"style":383},[589],{"type":37,"value":590},"\"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\"",{"type":32,"tag":349,"props":592,"children":593},{"style":389},[594],{"type":37,"value":595},",\n",{"type":32,"tag":349,"props":597,"children":598},{"class":351,"line":438},[599,604,608,613],{"type":32,"tag":349,"props":600,"children":601},{"style":372},[602],{"type":37,"value":603},"  \"fbp\"",{"type":32,"tag":349,"props":605,"children":606},{"style":389},[607],{"type":37,"value":585},{"type":32,"tag":349,"props":609,"children":610},{"style":383},[611],{"type":37,"value":612},"\"fb.1.1558571054389.1098115397\"",{"type":32,"tag":349,"props":614,"children":615},{"style":389},[616],{"type":37,"value":595},{"type":32,"tag":349,"props":618,"children":619},{"class":351,"line":447},[620,625,629,634],{"type":32,"tag":349,"props":621,"children":622},{"style":372},[623],{"type":37,"value":624},"  \"client_ip_address\"",{"type":32,"tag":349,"props":626,"children":627},{"style":389},[628],{"type":37,"value":585},{"type":32,"tag":349,"props":630,"children":631},{"style":383},[632],{"type":37,"value":633},"\"93.184.216.34\"",{"type":32,"tag":349,"props":635,"children":636},{"style":389},[637],{"type":37,"value":595},{"type":32,"tag":349,"props":639,"children":640},{"class":351,"line":472},[641,646,650],{"type":32,"tag":349,"props":642,"children":643},{"style":372},[644],{"type":37,"value":645},"  \"client_user_agent\"",{"type":32,"tag":349,"props":647,"children":648},{"style":389},[649],{"type":37,"value":585},{"type":32,"tag":349,"props":651,"children":652},{"style":383},[653],{"type":37,"value":654},"\"Mozilla\u002F5.0...\"\n",{"type":32,"tag":349,"props":656,"children":657},{"class":351,"line":26},[658],{"type":32,"tag":349,"props":659,"children":660},{"style":389},[661],{"type":37,"value":662},"}\n",{"type":32,"tag":33,"props":664,"children":665},{},[666,668,674,676,681,683,689,691,696],{"type":37,"value":667},"IP ve user agent'ı sGTM otomatik alır ama bazı hosting ortamlarında (Cloudflare proxy) ",{"type":32,"tag":52,"props":669,"children":671},{"className":670},[],[672],{"type":37,"value":673},"X-Forwarded-For",{"type":37,"value":675}," header'ını parse etmen gerekebilir. ",{"type":32,"tag":52,"props":677,"children":679},{"className":678},[],[680],{"type":37,"value":81},{"type":37,"value":682}," parametresi Facebook click ID — kullanıcı bir Meta ad'ine tıkladığında URL'de ",{"type":32,"tag":52,"props":684,"children":686},{"className":685},[],[687],{"type":37,"value":688},"fbclid=...",{"type":37,"value":690}," eklenir. Bu değeri cookie'ye yazıp CAPI'ye gönderirsen attribution loop kapanır. Çoğu implementasyon ",{"type":32,"tag":52,"props":692,"children":694},{"className":693},[],[695],{"type":37,"value":81},{"type":37,"value":697},"'yi atlar, sonuç olarak Meta hangi ad'in conversion'ı tetiklediğini bilemez. EMQ 4.2'de kalır.",{"type":32,"tag":40,"props":699,"children":701},{"id":700},"deduplication-stratejisi",[702],{"type":37,"value":703},"Deduplication stratejisi",{"type":32,"tag":33,"props":705,"children":706},{},[707,709,714,716,721],{"type":37,"value":708},"Aynı ",{"type":32,"tag":52,"props":710,"children":712},{"className":711},[],[713],{"type":37,"value":118},{"type":37,"value":715}," eventi hem pixel hem CAPI'den geldiğinde Meta'nın bunu tek event olarak sayması için ",{"type":32,"tag":52,"props":717,"children":719},{"className":718},[],[720],{"type":37,"value":126},{"type":37,"value":722}," aynı olmalı. Genelde UUID v4 kullanılır. Ancak UUID frontend'de üretilirse backend'e taşınması gerekir. Çözüm: checkout'ta hidden input olarak event_id'yi form'a eklemek veya localStorage'a yazmak. Backend order tamamlandığında aynı ID'yi alıp CAPI request'ine koyar. Zaman farkı 48 saat içinde olmalı (Meta'nın dedup window'u). Eğer event_time farkı 48 saati aşarsa iki ayrı event sayılır.",{"type":32,"tag":33,"props":724,"children":725},{},[726],{"type":37,"value":727},"Örnek akış:",{"type":32,"tag":161,"props":729,"children":730},{},[731,752,771],{"type":32,"tag":165,"props":732,"children":733},{},[734,736,742,744,750],{"type":37,"value":735},"Kullanıcı \"Satın Al\" butonuna basar → pixel ",{"type":32,"tag":52,"props":737,"children":739},{"className":738},[],[740],{"type":37,"value":741},"InitiateCheckout",{"type":37,"value":743}," atar (event_id: ",{"type":32,"tag":52,"props":745,"children":747},{"className":746},[],[748],{"type":37,"value":749},"evt_12345",{"type":37,"value":751},", event_time: 1683820800)",{"type":32,"tag":165,"props":753,"children":754},{},[755,757,762,764,769],{"type":37,"value":756},"Backend ödeme onaylanır → CAPI ",{"type":32,"tag":52,"props":758,"children":760},{"className":759},[],[761],{"type":37,"value":118},{"type":37,"value":763}," gönderir (event_id: ",{"type":32,"tag":52,"props":765,"children":767},{"className":766},[],[768],{"type":37,"value":749},{"type":37,"value":770},", event_time: 1683820802)",{"type":32,"tag":165,"props":772,"children":773},{},[774],{"type":37,"value":775},"Meta iki eventi görür, event_id eşleşir, zaman farkı 2 saniye → tek event olarak işler.",{"type":32,"tag":33,"props":777,"children":778},{},[779,781,786,788,793],{"type":37,"value":780},"Bu kurulum olmadan pixel'in attığı ",{"type":32,"tag":52,"props":782,"children":784},{"className":783},[],[785],{"type":37,"value":118},{"type":37,"value":787}," ile CAPI'nin attığı ",{"type":32,"tag":52,"props":789,"children":791},{"className":790},[],[792],{"type":37,"value":118},{"type":37,"value":794}," çift sayılır. ROAS hesabında conversion değeri 2x şişer. Kampanya dashboard'unda \"100 conversion\" görürsün ama gerçek sayı 50'dir. Bunu fark etmezsen budget allocation yanlış gider.",{"type":32,"tag":33,"props":796,"children":797},{},[798],{"type":37,"value":799},"Bazı durumlarda pixel eventi tamamen kaybolur (ad blocker, consent yok). Bu durumda CAPI tek başına çalışır. Dedup yoksa sorun yok. Ama pixel eventi gecikmeyle gelirse (örneğin kullanıcı offline'dan tekrar online oldu, browser queue'daki eventi 10 dakika sonra attı) ve event_id yanlışsa Meta bunu yeni bir event sayar. Bu edge case'i handle etmek için server-side event_time'ı backend'deki order timestamp'ine sabitlemek önerilir — kullanıcının browser saatiyle değil.",{"type":32,"tag":40,"props":801,"children":803},{"id":802},"incrementality-ve-capinin-test-edilmesi",[804],{"type":37,"value":805},"Incrementality ve CAPI'nin test edilmesi",{"type":32,"tag":33,"props":807,"children":808},{},[809],{"type":37,"value":810},"CAPI kurulumu tamamlandığında \"EMQ 8.5, dedup çalışıyor\" raporu yeterli değil. Asıl soru: CAPI olmadan da bu conversion'lar gerçekleşir miydi? Bunu ölçmek için geo-based holdout test veya conversion lift study gerekir. Meta'nın kendi Conversion Lift aracı var ama minimum spend threshold yüksek ($30k+). Alternatif: basit bir A\u002FB test. Trafik yarısında CAPI aktif, yarısında pasif. 14 gün sonra incremental ROAS'a bakarsın. Eğer CAPI grubu %15 daha iyi performans gösteriyorsa altyapı değerini kanıtlamış olursun.",{"type":32,"tag":33,"props":812,"children":813},{},[814,816,821,822,827],{"type":37,"value":815},"Bir diğer metrik: attribution window'lara bakmak. CAPI ile 7-day click attribution'ın güvenilirliği artar çünkü post-click event'ler backend'den gelir, bot değil gerçek kullanıcı. Pixel'de bot traffic %8-12 arasında. CAPI'de server IP whitelist'i yaparak bu oran %1'in altına düşer. Bu da demek oluyor ki kampanya optimization'ı daha temiz sinyalle çalışıyor. Test sonuçlarına göre bazı advertiser'lar pixel'i tamamen kapattı, sadece CAPI ile devam ediyor (özellikle B2B lead gen'de). Ama bu strateji ecommerce için riskli çünkü ",{"type":32,"tag":52,"props":817,"children":819},{"className":818},[],[820],{"type":37,"value":102},{"type":37,"value":128},{"type":32,"tag":52,"props":823,"children":825},{"className":824},[],[826],{"type":37,"value":110},{"type":37,"value":828}," sinyalleri kayboluyor. Bu da dynamic retargeting audience'larını zayıflatır.",{"type":32,"tag":40,"props":830,"children":832},{"id":831},"i̇leri-seviye-custom-event-ve-offline-conversion",[833],{"type":37,"value":834},"İleri seviye: custom event ve offline conversion",{"type":32,"tag":33,"props":836,"children":837},{},[838,840,846,848,854],{"type":37,"value":839},"Meta CAPI sadece standart event'lerle sınırlı değil. Custom event tanımlayıp backend'den gönderebilirsin. Örneğin ",{"type":32,"tag":52,"props":841,"children":843},{"className":842},[],[844],{"type":37,"value":845},"SubscriptionRenewal",{"type":37,"value":847}," veya ",{"type":32,"tag":52,"props":849,"children":851},{"className":850},[],[852],{"type":37,"value":853},"TrialStarted",{"type":37,"value":855},". Bu event'leri custom conversion olarak tanımlayıp campaign optimization objective'ine set edebilirsin. Özellikle SaaS modellerinde LTV'yi optimize etmek için uzun-dönem event'leri (90-day retention, upsell) CAPI ile gönderip bid stratejisine dahil etmek mümkün. Google Ads'in offline conversion import'una benzer mantık.",{"type":32,"tag":33,"props":857,"children":858},{},[859,861,866,868,873],{"type":37,"value":860},"Offline conversion senaryosu: kullanıcı online lead form doldurdu, satış ekibi 5 gün sonra telefonda deal kapattı. Bu deal'i CRM'den export edip CAPI'ye ",{"type":32,"tag":52,"props":862,"children":864},{"className":863},[],[865],{"type":37,"value":118},{"type":37,"value":867}," olarak göndermek gerekiyor. Bu durumda ",{"type":32,"tag":52,"props":869,"children":871},{"className":870},[],[872],{"type":37,"value":134},{"type":37,"value":874}," geçmiş tarihli olacak. Meta 62 güne kadar retroaktif event'i kabul eder. Ama bu event'in attribution algoritmasına etkisi sınırlı çünkü kampanya optimize edilirken real-time sinyallere bakılır. Yine de raporlama doğruluğu için gerekli. CRM-CAPI entegrasyonunu Zapier veya n8n ile otomatikleştirebilirsin; her yeni \"Closed Won\" deal için CAPI POST tetiklersin.",{"type":32,"tag":40,"props":876,"children":878},{"id":877},"yaygın-hatalar-ve-çözümleri",[879],{"type":37,"value":880},"Yaygın hatalar ve çözümleri",{"type":32,"tag":33,"props":882,"children":883},{},[884,896,898,904,906,912,914,919],{"type":32,"tag":169,"props":885,"children":886},{},[887,889,894],{"type":37,"value":888},"1. ",{"type":32,"tag":52,"props":890,"children":892},{"className":891},[],[893],{"type":37,"value":81},{"type":37,"value":895}," parametresi eksik:",{"type":37,"value":897}," Kullanıcı Meta ad'ine tıklayıp siteye geldiğinde URL'de ",{"type":32,"tag":52,"props":899,"children":901},{"className":900},[],[902],{"type":37,"value":903},"fbclid",{"type":37,"value":905}," var. Bu değeri cookie'ye yazmazsan CAPI'ye gönderemezsin. Çözüm: GTM'de bir cookie variable oluştur, ismini ",{"type":32,"tag":52,"props":907,"children":909},{"className":908},[],[910],{"type":37,"value":911},"_fbc",{"type":37,"value":913}," koy, 90 gün süreyle sakla. CAPI tag'inde bu variable'ı ",{"type":32,"tag":52,"props":915,"children":917},{"className":916},[],[918],{"type":37,"value":81},{"type":37,"value":920}," parametresine map et.",{"type":32,"tag":33,"props":922,"children":923},{},[924,929,931,937],{"type":32,"tag":169,"props":925,"children":926},{},[927],{"type":37,"value":928},"2. Email hash yanlış:",{"type":37,"value":930}," Boşluk veya büyük harf kalırsa hash eşleşmez. Tüm string'leri ",{"type":32,"tag":52,"props":932,"children":934},{"className":933},[],[935],{"type":37,"value":936},"trim().toLowerCase()",{"type":37,"value":938}," yap, ardından SHA-256 uygula.",{"type":32,"tag":33,"props":940,"children":941},{},[942,947,949,955],{"type":32,"tag":169,"props":943,"children":944},{},[945],{"type":37,"value":946},"3. Test mode'dan canlıya geçilmemiş:",{"type":37,"value":948}," Events Manager'da \"Test Events\" sekmesinde event'ler görünür ama gerçek trafik gönderilmez. ",{"type":32,"tag":52,"props":950,"children":952},{"className":951},[],[953],{"type":37,"value":954},"test_event_code",{"type":37,"value":956}," parametresini kaldır, production token kullan.",{"type":32,"tag":33,"props":958,"children":959},{},[960,965],{"type":32,"tag":169,"props":961,"children":962},{},[963],{"type":37,"value":964},"4. Server container log'larına bakmamak:",{"type":37,"value":966}," sGTM Cloud Run log'larında CAPI response'ları görünür. 200 OK dışında bir şey görüyorsan (401, 400) token veya payload hatalı demektir.",{"type":32,"tag":33,"props":968,"children":969},{},[970,975,977,983,985,991],{"type":32,"tag":169,"props":971,"children":972},{},[973],{"type":37,"value":974},"5. Pixel ve CAPI arasında veri tipi uyumsuzluğu:",{"type":37,"value":976}," Pixel ",{"type":32,"tag":52,"props":978,"children":980},{"className":979},[],[981],{"type":37,"value":982},"value",{"type":37,"value":984}," parametresini float gönderirken CAPI integer gönderiyor. Meta para birimini yuvarlayabilir. Çözüm: her iki tarafta da ",{"type":32,"tag":52,"props":986,"children":988},{"className":987},[],[989],{"type":37,"value":990},"value: parseFloat(orderTotal).toFixed(2)",{"type":37,"value":992}," kullan.",{"type":32,"tag":33,"props":994,"children":995},{},[996,998,1004],{"type":37,"value":997},"Son bir nokta: CAPI kurulumu bir kez yapılıp unutulacak bir şey değil. iOS güncellemeleri, Meta API version değişiklikleri, yeni identifier türlerinin eklenmesi (örneğin ",{"type":32,"tag":52,"props":999,"children":1001},{"className":1000},[],[1002],{"type":37,"value":1003},"anon_id",{"type":37,"value":1005}," 2025'te beta'ya açıldı) düzenli bakım gerektiriyor. Aylık EMQ trendini takip et, 8'in altına düşerse identifier mapping'i gözden geçir. Deduplication rate'i de önemli: idealde %95+ olmalı (yani pixel+CAPI event'lerinin %95'i başarıyla dedupe ediliyor). Bu metriği Meta Events Manager'da göremezsin, kendi log pipeline'ını kurman gerekir — sGTM'den giden request ID'lerini BigQuery'ye yazıp karşılaştırabilirsin.",{"type":32,"tag":1007,"props":1008,"children":1009},"style",{},[1010],{"type":37,"value":1011},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":395,"depth":395,"links":1013},[1014,1015,1016,1017,1018,1019,1020],{"id":42,"depth":362,"text":45},{"id":146,"depth":362,"text":149},{"id":293,"depth":362,"text":296},{"id":700,"depth":362,"text":703},{"id":802,"depth":362,"text":805},{"id":831,"depth":362,"text":834},{"id":877,"depth":362,"text":880},"markdown","content:tr:marketing:server-side-conversions-meta-capiyi-sifirdan-dogru-kurmak.md","content","tr\u002Fmarketing\u002Fserver-side-conversions-meta-capiyi-sifirdan-dogru-kurmak.md","tr\u002Fmarketing\u002Fserver-side-conversions-meta-capiyi-sifirdan-dogru-kurmak","md",1778164175442]