Google Ads ve Meta kampanyalarınızla ilgilenen ajanın raporları okuduğu, değişikliği gerekçesiyle birlikte önerdiği ve yalnızca kendisine verdiğiniz sınırlar içinde uyguladığı bir çalışma ortamı.
Hizmet bir teklif, bir başarı değil; bunu ilk biz söylüyoruz: bugün Google Ads veya Meta’da bütçeleri ya da ihaleleri değiştiren bir sistemimiz yok. Birinin yapıldığı parçaları kurduk ve çalıştırdık — gerçek dönüşüm sinyalini Google’a göndermek, varsayılan olarak dry-run açıkken ücretli tanıtım satın alan bir motor, ücret doğuran her eylemi yazan bir kayıt ve bir orkestratörü dolambaçlı yol olmadan durduran bir kesici.
Teklif, koşullarıyla„offer”, nu „delivered”, și motivul se poate verifica în câteva secunde. Am căutat în peste 150 de depozite proprii câmpurile prin care API-urile de reclamă mișcă bani — `budget_micros`, `campaignBudget`, `target_cpa`, `target_roas`, `bid_strategy` — și nu apar nicăieri, nici la Google, nici la Meta. Nu gestionăm azi bugete de reclamă. Ce apare, și se poate deschide fișier cu fișier, sunt piesele care despart o automatizare de un accident: trimiterea conversiilor offline către Google prin Data Manager API, 264 de linii într-un proiect de producție al nostru; un motor de promovare plătită care cumpără boostere, etichete și pachete cu dry-run pornit implicit; un A/B tester bayesian care refuză să declare câștigător sub 100 de afișări per variantă, și orchestratorul de campanii din MEGA CRM cu întrerupător fără `--force`. Serviciul e descris din aceste piese. Nu dintr-un panou care nu există.
Kampanyaları yöneten bir ajan, üzerinde “optimize et” yazan bir düğme değildir. Belirli raporları okuma izni, belirli alanları yazma izni ve geri kalan için hiçbir izni olan bir programdır. Zor kısım bir değişiklik önermek değildir — modeller bunu iyi ve hızlı yapar. Zor kısım, nerede durduğunu, ne yaptığını nasıl kanıtladığını ve hata yaptığında ne olduğunu yazmaktır. Çalışma bunun hakkındadır ve tartışmaya oradan başlıyoruz.
Bizde olmayanları baştan söylüyoruz ki siz bunları başkasından öğrenmeyin. Bizde bugün Google Ads’te bir bütçeyi yükselten ya da Meta’da bir teklifi değiştiren bir sistem çalışmıyor. Çalışan ve satır satır gösterilebilen şeyler, gerçek para harcayan diğer otomasyonlar için yazdığımız güvenlik mekanizmalarıdır: dry-run varsayılan olarak açık, her ücretli eylem için sayaç, hatada geri çekilme ki hata döngüde tekrarlanmasın, karar öncesi kanıt eşiği ve orkestratörü başlatmayı reddeden bir kesici anahtar.
Zaten kurulu olan parça bir bütçe değişikliği değil, bir sinyaldir — ve işe onunla başlamayı öneriyoruz. Google, ona dönüşüm olduğunu söylediğiniz şeyden öğrenir. Ona “form gönderildi” derseniz, form gönderen insanları arar. Ona “istemcinin sistemine gerçek olarak ulaşan talep” diyen entegrasyonu yazdık; tıklama tanımlayıcısı ve SHA-256 üzerinden geçirilen kullanıcı tanımlayıcılarıyla, Data Manager API aracılığıyla. Bu hemen başlayabilir, çünkü bu mevcut koddur, bir vaat değil.
Çalışma ortamının geri kalanı — raporları okuyan katman, öneren katman, çalışan katman — daha önce kod aracılığıyla para harcadığımız yerde kullandığımız aynı kalıp üzerine kuruluyor. Sıkı biçimde okuma ile başlanır, yürütmesiz önerilere geçilir ve en sonunda yürütme alan alan, her birine yazılmış sınırla açılır.
Neleri kapsıyor
Çalışma, bileşenlerine ayrılmış hâliyle
Gösterge panelini değil, raporları okuyun
Ajanın neyi ve nereden okuyacağı baştan belirlenir: kampanya ve reklam grubu başına harcama, atfedilen dönüşümler, edinme başına maliyet, bütçe nedeniyle kaybedilen gösterim payı ile konum nedeniyle kaybedilen gösterim payı — farklı kararlar gerektiren iki farklı sayı. Okuma API aracılığıyla, ayrı bir hizmet hesabıyla yapılır, arayüzdeki ekran görüntüleriyle değil. Okuma katmanı önce teslim edilir ve tek başına çalıştırılır, hesapta hiçbir yazma izni olmadan.
Değişikliği, nedeni yanına yazılı olarak önerin
Bir öneri bir sayı değildir. Değişecek alan, eski değer, yeni değer, kararın alındığı veri aralığı ve nedenidir. Öneriler, bir insanın okuyacağı bir raporda, “X kampanyasının günlük bütçesini A’dan B’ye yükseltirdim, çünkü son N günde M% oranında bütçe nedeniyle sınırlanmıştı, kabul edilen eşiğin altında bir edinme başına maliyetle” biçiminde toplanır. Neden yazılamıyorsa, öneri yapılmaz.
Üç eşik: tek başına ne yapar, ne zaman bir insan ister, neyi asla yapmaz
Her alan, bir şey başlamadan önce yazılmış üç kategoriden birine girer. Tek başına: kabul edilen bir yüzde altındaki değişiklikler, günlük bir tavan içinde, açık olarak işaretlenmiş kampanyalarda. Onayla: tavanın aşılması, herhangi bir yeni kampanya, herhangi bir yeni kitle, herhangi bir teklif değişikliği. Asla: onun başlatmadığı bir kampanyayı durdurmak, ödeme yöntemini değiştirmek, faturalandırma hesaplarına dokunmak. Liste sözleşmede yazılır, kodda değil, ve kod onu okur.
Dry-run varsayılan olarak açık — bizimle gelen kalıp
999.md’deki ücretli tanıtım motorumuzda, paranın harcanıp harcanmayacağını belirleyen işlev alışılmışın tersine yazılmıştır: ortam değişkeni tam olarak `false` değerine sahip değilse dry-run etkindir. Ayarlanmamış, boş, `true`, yanlış yazılmış — hepsi dry-run’ı açık tutar. Bu bilinçli bir seçimdir: bir yapılandırma hatası vanayı açamaz, yalnızca kapalı tutabilir. Aynı işlev iki bağımsız yerde vardır, tanıtım motoru ve yeniden yayınlama yürütücüsü.
Maliyet oluşturan her eylem bir kayda yazılır
Tanıtım sisteminde her yürütme, reklamı, kullanıcıyı, eylem türünü, leu cinsinden tutarı, başarılı olup olmadığını, sağlayıcının ham yanıtını ve `dry_run` işaretini içeren `agent_costs` tablosuna girer. Yazma işlemi programlama güncellemesiyle aynı işlem içinde yapılır, bu yüzden iz bırakmayan bir harcama ya da harcamasız bir iz olamaz. Dry-run olduğunda kaydedilen tutar sıfırdır, ama satır vardır — ne olacağını tam olarak görürsünüz.
Gerçek dönüşüm sinyali — zaten var olan parça
Birisi ücretli bir tıklamadan gelip bir talep gönderdiğinde, sinyal Google’a ancak talep müşterinin sistemine girdikten sonra gider, düğmeye basıldığında değil. Entegrasyon `https://datamanager.googleapis.com/v1/events:ingest` kullanır, tıklama kimliğini, zamanı, değeri ve para birimini, ayrıca SHA-256 ile geçirilmiş kullanıcı kimliklerini gönderir — küçük harfe çevrilmiş normalleştirilmiş adres, uluslararası formata getirilmiş telefon. Tıklama kimliği olmadan gönderim kendi kendine durur ve atlandı olarak işaretlenir, çünkü atfedilebilir olmazdı.
Onay, etiketlerden önce konur, sonra değil
Consent Mode v2, herhangi bir Google betiği başlamadan önce tüm pazarlama ve analiz amaçları için `denied` olarak başlatılır, 500 ms’lik bir güncelleme bekleme penceresiyle. Kişinin banner ile etkileşimi üzerine, sayfa yeniden yüklenmeden yalnızca `granted` durumuna geçilir. İşlevsel ve güvenlik depolaması açık kalır, çünkü bunlar olmadan sayfa çalışmaz. Bir kez yazılır ve her ziyarette çalışır.
İki seçenek arasındaki karar, izlenime göre değil, kanıta göre verilir
Kurduğumuz A/B test aracı, her varyantı uniform prior ile Beta-Binomial olarak modeller ve 10.000 Monte Carlo örneklemesiyle hangisinin daha iyi olma olasılığını tahmin eder. Varyant başına 100 gösterim ve 0,95 olasılığın altında kazanan ilan etmez. 168 saat içinde karar verilmezse, destekleyemeyeceği bir kazanan adı vermek yerine deneyi kapatır ve süresinin dolduğunu söyler.
Atlanamayan bir devre kesici
İç sistemimizdeki kampanya orkestratörü, her şeyden önce bir ortam değişkenini kontrol eder. Eğer ayarlanmışsa, başlamayı reddeder — `--force` yoktur, bunu aşacak bir argüman yoktur. Bu, gerçek bir çift gönderim olayından sonra eklendi, dekor olarak değil. Aynı desen burada da uygulanır: tüm yazmaları durduran, okumayı ve raporlamayı sürdürmeye bırakan hesap düzeyinde bir anahtar.
Nasıl görünüyor
Süreç, adım adım.
01
Hesap ve yetki envanteri
Reklam hesapları, bugün kimin hangi rolle erişimi olduğu, hangi dönüşümlerin tanımlı olduğu ve bunlardan hangilerinin aslında aynı olayın kopyaları olduğu listelenir. Üç alan listesi belirlenir — tek başına, onayla, asla. Teslim ediyoruz: yazılı envanter, her birinin gerçekte neyi ölçtüğünü gösteren dönüşüm listesi ve üç liste üzerindeki mutabakat.
02
Tek başına çalışan okuma katmanı
Okuma, yazma yetkisi olmayan bir hesapla API üzerinden bağlanır ve günlük rapor başlatılır. Bu aşamada hesaplarda hiçbir şey değişmez — yalnızca temsilcinin gördüğü görülür. Yanlış sayan dönüşümler, kimsenin haberi olmadan bütçe kısıtı olan kampanyalar ve üst üste binen kitleler ortaya çıktığı andır. Teslim ediyoruz: günlük rapor ve okurken bulduklarımızın listesi.
03
Gerçek dönüşüm sinyali
Tıklama kimliği açılış sayfasında yakalanır, sizin sisteminizdeki taleple bağlanır ve Google’a ancak talep aşağı akışta doğrulandığında gönderilir, düğmeye basıldığında değil. Başarısız gönderimler için 90 günlük pencerede yeniden deneme başlatılır. Teslim ediyoruz: çalışan entegrasyon, kaydetmeden gönderen bir doğrulama modu ve neyin gönderildiğini, neyin atlandığını ve nedenini içeren günlük.
04
Yürütmesiz öneri katmanı
Temsilci öneriler yazmaya başlar: alan, eski değer, yeni değer, neden, veri penceresi. Hiçbir şey yürütülmez. Öneriler sıkıcı olana kadar böyle çalışır — yani bunları okuyan kişi neredeyse her şeye zaten “evet” diyecek noktaya gelene kadar. Teslim ediyoruz: ne önerildiği ve neyi onayladığınız ya da reddettiğiniz her şeyi içeren öneri akışı, nerede hata yaptığının görülmesi için.
05
Yürütmenin alan alan açılması
Yürütme, “tek başına” listesindeki ilk alan için, dry-run varsayılan açık olacak şekilde ve günlük üst sınırla açılır. Kayda, yazılanın önerilenle aynı olduğu doğrulanır. Sonra ikinci alan. Teslim ediyoruz: işlem kaydı, tüm yazmaları durdurup okumayı açık bırakan anahtar ve temsilci hata yaptığında ne yapılacağına dair yazılı prosedür.
Traseul unei decizii
Veriler
Neye dokunuyoruz, nerede duruyorlar ve ne kadar kalıyorlar
Veri koruma sorumlusu olan herkesin soracağı sorular — o sormadan önce burada sorulmuş hâliyle.
Hangi verilere erişir
API üzerinden okunan kampanya raporları, reklam grubu ve anahtar kelime. Landing page adresinden yakalanan ve müşteri talebi üzerinde saklanan reklam tıklama kimliği. Zaman, değer ve para birimiyle birlikte dönüşüm etkinlikleri. Açık talep üzerine, dönüştüren kişinin e-posta adresi ve telefonu, ancak yalnızca kriptografik özet biçiminde.
Google’a ne gider ve hangi biçimde
Tıklama kimliği açık biçimde gider — zaten o bir tıklama kimliği. E-posta ve telefon yalnızca SHA-256 olarak gider; gönderimden önce yerelde hesaplanır: e-posta boşluklardan arındırılır ve küçük harfe çevrilir, telefon uluslararası formata getirilir. Posta adresi hiç gönderilmez, çünkü Google şeması bunu posta kodu ve bölge koduyla birlikte tam ister, ancak posta kodu gerçek verilerde tutarlı değildir — neden kodda yazılıdır, varsayılmaz.
Nerede dururlar ve kimler görür
Kampanya verileri ve etkinlikler, sizin proje veritabanınızda, üzerinde anlaşılan altyapıda durur. Reklam hesaplarının kimlik bilgileri, kodda ve kaynak deposunda değil, sistem servisi tarafından okunan ortam dosyasında durur. Erişim belirteci en fazla 55 dakika bellekte tutulur, ancak sağlayıcı onu 3.600 saniye geçerli verir — aradaki pay kasıtlıdır, böylece asla süresi dolmuş bir tane kullanılmasın.
Bir etkinlik ne kadar süre daha gönderilebilir
Pratik pencere, dönüşüm anından itibaren 90 gündür — Google çevrimdışı dönüşümler için bunu kabul eder. Başarısız gönderimler için yeniden deneme tam bu pencere içinde, toplu şekilde, istek başına en fazla beş denemeyle çalışır. Beş denemeden sonra istek kendi haline bırakılır ve sonsuza kadar yeniden denenmek yerine gönderilmemiş olarak işaretli kalır.
Verilerle ne yapmıyoruz
Yazılı bir yasal dayanak olmadan ve kişinin gördüğü bilgilendirmede yer almadan müşteri listelerinizden herkese açık yapı kurmayız. İki farklı müşteri hesabı arasında veri aktarmayız. Kampanya raporlarının kopyalarını üzerinde anlaşılan sistemin dışında saklamayız. İşleme kayıt defteri ilk gönderimden önce doldurulur, sonra değil.
Bir vaka
Formlar için ödeme yapan, talepler için değil, bir kampanya
Durum
Kişi online talepleri alan Kişinevli bir platform, arama trafiği satın alıyordu. Reklam hesabında tanımlanan dönüşüm “gönderilen form” idi. Teklif algoritması tam olarak kendisinden isteneni yapıyordu: form gönderen insanları getiriyordu. Bunların kaçının daha aşağıda, zincirde gerçek talebe dönüştüğü, reklam platformuna hiçbir zaman geri dönmüyordu.
Ne kurduk
Dönüşüm anını zincirin daha sonrasına taşıdık. Tıklama kimliği landing page’de yakalanır ve talep üzerinde saklanır. Talep aşağıdaki sisteme iletilir; eğer bu sistem kendi kimliğini döndürürse — yani gerçekten içeri girdiyse — işte o zaman etkinlik Google’a, Data Manager API üzerinden, zaman, değer, para birimi ve SHA-256 ile geçirilmiş kullanıcı kimlikleriyle birlikte gider. Tıklama kimliği olmadan gönderim kendiliğinden durur ve atlandı olarak işaretlenir. Tıklama kimliği olan ve gönderim işareti olmayan talepleri son 90 gün içinde, 50’lik partiler halinde ve en fazla beş denemeyle arayan bir yeniden deneme işi ekledik.
Ne çıktı
Reklam platformunun aldığı sinyal artık düğme basışlarını değil, hedefe ulaşan talepleri anlatır. Entegrasyon yapılandırılmamışsa veya kapalıysa tüm işlemler etkisizdir — işlev, herhangi bir şeyden önce yedi kimlik bilgisinin hepsini kontrol eder ve bir tanesi eksikse “atlandı” döndürür. Hatalar günlüklenir, ancak ileri taşınmaz: Google yanıt vermezse, müşteri talebi olduğu gibi ilerler.
Vakanın söylemedikleri
Bu bir sinyal entegrasyonudur, kampanya yönetimi entegrasyonu değil. Hiçbir bütçeyi ve hiçbir teklifi değiştirmez. Satın alma başına maliyet üzerindeki etki tarafımızca ölçülmedi ve bunu yayınlamıyoruz — kodda yazar tarafından yazılmış bir beklenti vardır, bir ölçüm değil, ve ikisi arasındaki bütün fark budur.
Sorular
İnsanların aramadan önce bize sordukları
Bir ajan bütçeyi artırdığında ve harcama yükseldiğinde sorumluluğu kim taşır?
Siz. Ve bu nedenle ortam, sizi hazırlıksız yakalamak için değil, sorumluluğu bilinçli biçimde taşıyabilmeniz için kurulmuştur. Somut olarak: ajanın, adı belirtilerek ve yazılı şekilde, alan alan verilmemiş hiçbir yazma izni yoktur; açılan her alanın, önerinin insan onayına gittiği bir üst sınırı vardır; gerçekleştirilen her işlem, eski değer, yeni değer ve gerekçeyle birlikte, yürütmeyle aynı işlem içinde bir kayda yazılır; ve okumayı durdurmadan tüm yazmaları durduran bir anahtar vardır. Biz, yaptığımız şeyden sorumluyuz — yazdığınız sınırların kod tarafından uygulandığından, kaydın eksiksiz olduğundan, durdurmanın çalıştığından. Onayladığınız bir değişikliğin ticari sonucundan sorumlu değiliz; manuel olarak düğmeye basan ajans da sorumlu değildir. Biri size başka bir şey vaat ediyorsa, sözleşmede sorumluluğun sınırlandırılması başlığında ne yazdığını sorun.
Bugün Google Ads ya da Meta kampanyalarını yöneten bir sisteminiz var mı?
Hayır. Kodumuzun hiçbir yerinde bir bütçeyi, bir ihaleyi veya Google ya da Meta’daki bir teklif verme stratejisini değiştiren herhangi bir alan yok. Tüm depolarda tam olarak bu alan adlarını arayarak kontrol ettik. Elimizde olan şey, dönüşümlerin Google’a gönderilmesi, başka bir platformda ücretli tanıtım satın alan bir motor ve bunların etrafındaki güvenlik mekanizmaları. Hizmet oradan yola çıkarak geliştiriliyor ve tam da karışıklık olmasın diye teklif olarak işaretlenmiş durumda.
O zaman siz tam olarak neyi geliştirdiniz ve gerçek para harcıyor?
Moldova’daki bir ilan platformundaki ücretli tanıtım motorumuz. Ücretli etiketler koyar, günlük limit ve tıklama başına fiyatla booster’ları başlatır, paketleri etkinleştirir ve ilanları kategorinin gerçek hızından hesaplanan bir aralıktan sonra yeniden yayımlar. Günlük limiti tıklama başına fiyattan büyük olmayan bir booster’ı başlatmayı reddeder — küçük bir kontrol, ama genelde eksik olan kontrolün tam türü. Maliyet doğuran herhangi bir çağrıdan önce her işlem dry-run kontrolünden geçer.
Kendi başına neyi değiştirebilir ve ne için onay gerekir?
Önceden birlikte karar verilir ve yazılır. Tartışmadaki başlangıç noktamız şu: tek başına — günlük bütçenin üzerinde kararlaştırılmış bir yüzde altındaki ayarlamalar, mutlak günlük üst sınır içinde, sizin açık olarak işaretlediğiniz kampanyalarda; onayla — üst sınırın aşılması, yeni kampanyalar, yeni kitleler, tekliflere herhangi bir dokunma; asla — başkası tarafından başlatılmış kampanyaların durdurulması, ödeme yöntemleri, fatura hesapları. Eğer başlangıçta her şeyin onaya bağlı olmasını istiyorsanız, bu geçerli bir tercihtir ve biz de onu tercih ederiz.
Ajan, bir dönüşümün gerçek olduğunu ve boş bir form olmadığını nasıl biliyor?
Çünkü sinyal butona basıldığında gitmiyor. Ancak talep, sizin için önemli olan sistemde aşağı akışta doğrulandığında gidiyor — CRM’den veya partnerden geri alınan bir talep kimliği. O zamana kadar dönüşüm denecek bir şey olmamıştır. Fark kozmetik değildir: Google’ın teklif verme algoritması kendisine ne gönderdiğinizden öğrenir, dolayısıyla ona formlar gönderirseniz, size form dolduran kişiler getirir.
Dönüşüm yapanların kişisel verilerine ne oluyor?
E-posta ve telefon yalnızca SHA-256 kriptografik özeti olarak gider; gönderimden önce yerel olarak hesaplanır, normalizasyonla birlikte — e-posta boşluksuz ve küçük harfli, telefon uluslararası formata getirilmiş halde. Posta adresi hiç gönderilmez. Kişi pazarlama amacını banner’da kabul etmeden hiçbir şey gitmez, çünkü Consent Mode bütünüyle `denied` ile başlar. Hukuki dayanak ve bilgilendirme, ilk gönderimden önce yazılır; birinin ilk sorusundan sonra değil.
Reklam platformuna çağrı yarıda kesilirse ne olur?
Başarısızlık ham yanıtla kaydedilir ve işlem ertelenir — yeniden yayınlama yürütücümüzde, yapılandırılmış soğuma süresi ile beş dakikanın maksimumu kadar; özellikle bir hatanın çağrı döngüsüne dönüşmemesi için. Başarısız dönüşüm gönderimleri ayrı bir iş ile, 50’şerlik partiler halinde, talep başına en fazla beş denemeyle, 90 günlük pencerede yeniden denenir. Beşinci denemeden sonra durur ve gönderilmemiş olarak işaretli kalır; kaybolması için değil, görülmesi için.
Bunu tamamen ve hızlıca nasıl kapatırım?
Yazma anahtarı. Okuma ve raporlama sürer, yürütme durur. Mevcut sistemlerimizde bu iki şekilde uygulanır, ikisi de doğrulanabilir: para harcanabilmesi için tam olarak `false` değerine sahip olması gereken bir ortam değişkeni — başka her şey vanayı kapalı tutar — ve başlatmayı reddeden ve `--force` içermeyen bir kampanya orkestratörü üzerindeki bir anahtar. Yüklenmeyebilecek bir arayüzdeki bir düğmeye bağlı değiliz.
Edinme başına maliyette bir düşüş garanti ediyor musunuz?
Hayır, ve nedenini söylemek gerekir, çünkü kodumuzda tam olarak böyle bir sayı var. Dönüşüm entegrasyonunun başındaki yorumda bir beklenti yazıyor — edinme başına maliyet ne kadar düşebilir ve gösterim payı ne kadar yükselebilir. Bu, onu geliştiren kişinin yazdığı bir beklentidir, bir ölçüm değil; bu yüzden onu bu sitede sonuç olarak hiçbir yerde bulamazsınız. Size söz verebileceğimiz şey, ölçümün yapılabilir hale gelmesidir: bir şey ifade eden dönüşümlerle ve her değişikliğin kaydıyla, önce-sonra karşılaştırması mümkün olur. Bunlar olmadan olmaz.
Yukarıdaki iddialar neye dayanıyor (20 kaynak)
Bunlardan 20 tanesi depolarımızdaki kod ve dosyalardır. Adlarını ya da satırlarını yayımlamıyoruz: hepsi bir arada, tek bir sayfada, yalnızca bize ait olmayan sistemlerin nasıl kurulduğunu fazla net anlatırdı. İstek üzerine, depoda sizinle birlikte gözden geçiriyoruz — doğrulama hâlâ mümkün, sadece bir görüşme içinde yapılıyor.