Bloga dön
14 Ağustos 2026Sergei Solod10 dk okuma

Popunder Sıklığını Kullanıcı Etkileşimiyle Karşılaştırarak Test Ederken Öğrendiklerim

Canlıdaki bir web uygulamasında popunder sıklığını artırdım ve değişiklikten önceki ve sonraki toplu etkileşim verilerini karşılaştırdım. Sonunda 45 saniyelik ilk gecikmeyi ve en az dört dakikalık cooldown süresini korudum; ancak asıl değerli ders, sabit görünen bir etkileşim ortalamasının ne kadar dikkatli yorumlanması gerektiğiydi.

popunderfrekans sınırlamaweb monetizasyonukullanıcı etkileşimiweb analitiği

Popunder sıklığının çok açık bir trade-off yaratmasını bekliyordum: reklamları daha seyrek gösterip kullanıcı deneyimini korumak ya da geliri artırmak için sıklığı yükseltip etkileşim düşmeye başlayana kadar devam etmek. Production davranışı o kadar düzenli olmadı.

Canlıdaki web uygulamalarımdan birinde sıklığı artırdıktan sonra engagement verisinde belirgin bir kırılma bekledim. Bunun yerine toplu metrik yaklaşık olarak önceki günlük dalgalanma aralığında hareket etmeyi sürdürdü. Bazı günler daha iyi, bazıları daha kötüydü; ancak yeni politikanın başladığı noktadan itibaren açık ve kalıcı bir düşüş görmedim.

Sonunda şu ayarı korudum:

İlk gecikme: 45 saniye
Başarılı bir popunder sonrasında minimum cooldown: 4 dakika

Aynı dört dakikalık dönem içinde en fazla bir başarılı event'e izin veren bir frequency window da kullandım:

const policy = {
  initialDelaySeconds: 45,
  cooldownSeconds: 240,
  windowSeconds: 240,
  maxEventsPerWindow: 1,
};

Bu, herhangi bir reklam sağlayıcısından, SDK'dan, uygulamadan veya deployment'dan bağımsız açıklayıcı pseudocode'dur. Asıl ilginç olan uygulamanın ayrıntıları değil, arkasındaki politikadır.

Aslında iki ayrı sıklık kararı var

Başta problemi tek bir soruya indirgiyordum: iki popunder arasında kaç dakika olmalı? Bunun yanlış bir abstraction olduğunu fark ettim. En az iki karar var: ilk reklam fırsatından önceki gecikme ve sonraki fırsatlar arasındaki minimum süre.

Bu iki an aynı değil. Yeni bir ziyaretçi ürünün yararlı olup olmadığına henüz karar vermemiştir; etkileşimde bulunan bir kullanıcı ise büyük ölçüde kararını vermiştir. Bu nedenle ilk kesintinin sonraki kesintilere göre daha fazla korunması gerektiğini düşündüm.

İlk saniyeleri neden daha az agresif monetize etmeye başladım

Daha kısa initial delay, daha fazla ziyaretçinin erken eligible olmasını ve dolayısıyla daha fazla potansiyel reklam olayı oluşmasını sağlar. Mekanik olarak bu doğru. Ancak bu mantık monetization'ın ne zaman gerçekleştiğini göz ardı eder.

Reklam kullanıcı gelir gelmez ortaya çıkarsa, sitenin ilk değerlendirmesinin bir parçası olur. Kullanıcı önce ürünü anlamak ve kullanmak için kesintisiz zaman elde ederse aynı reklam mekanizması farklı bir bağlamda yaşanır.

Daha önce daha kısa bir gecikme kullanıyordum; sonunda bunu 45 saniyeye çıkardım. Bu hâlâ nispeten erken ve muhafazakâr bir ayar olarak seçilmedi. Amaç, ziyaretin başlangıcı ile ilk monetization opportunity arasına biraz mesafe koymaktı. Bu 45 saniyeyi kayıp reklam inventory'si değil, ürünün değerini göstermesi için ayrılmış zaman olarak görmeye başladım.

45 saniye bir eşiktir, planlanmış reklam zamanı değil

Gecikmenin dolması yalnızca eligibility yaratır; reklamın tam 00:45'te otomatik olarak görüneceği anlamına gelmez. Gerçek event hâlâ uygun bir kullanıcı etkileşimine bağlıdır. Kullanıcı 00:45'te eligible olabilir, ilk popunder ise sonraki uygun hareket 01:03'te gerçekleştiğinde açılabilir.

Cooldown da aynı şekilde çalışır. Dört dakika, önceki başarılı olaydan dört dakika geçmeden yeni bir olayın eligible olamayacağı anlamına gelir. Her dört dakikada otomatik reklam gösterileceği anlamına gelmez. Dolayısıyla konfigüre edilen süreler minimum değerlerdir; gerçek aralık daha uzun olabilir.

Tekrar aralığı ilk gecikmeden daha önemli hâle geldi

İlk gecikmeden memnun kaldıktan sonra repeat cadence daha önemli değişkene dönüştü. Uzun cooldown reklam baskısını azaltır, fakat birçok engaged user ikinci fırsata hiç ulaşamayabilir.

İki koşulu aynı anda istiyordum: uygulamayı kullanmaya devam eden birinin başka bir monetization event üretmesi gerçekçi olmalı ve event'ler arasında anlamlı kesintisiz kullanım blokları bulunmalı.

Dört dakikayı korudum. İlk gecikme 45 saniye olduğunda teorik en erken eligibility noktaları yaklaşık 00:45, 04:45, 08:45 ve 12:45'tir. Gerçek olaylar daha sonra gerçekleşebilir çünkü uygun bir interaction hâlâ gereklidir.

Dört dakika neden yalnızca impression maksimize etmekten farklıydı

Cooldown'ı azaltmak daha fazla teorik fırsat yaratır. Tek metrik kullanıcı başına reklam fırsatıysa daha kısa aralık açıkça daha iyidir. Ancak ürünün reklam değeri, yalnızca kullanıcı için değerli kalmaya devam ettiği sürece vardır.

ek monetization
-
davranışsal zarar
=
net değer

Dört dakika, kullanıcıya yeni bir popunder'ın imkânsız olduğu anlamlı bir normal kullanım aralığı veriyordu. Benim için bu invariant “dört dakikada bir” ifadesinden daha önemliydi.

Bir monetization event sonrasında kullanıcı birkaç dakika boyunca yeni bir olayın imkânsız olduğu bir süreye sahip olur.

Engagement'ta görünür bir düşüş bekliyordum

Deployment öncesindeki temel hipotezim, daha yüksek reklam sıklığının analytics'te net bir before-and-after düşüşü oluşturacağıydı. Böyle olsaydı politikayı yumuşatmak için güçlü bir nedenim olurdu.

Bunun yerine aggregate engagement önceki gibi dalgalanmaya devam etti. Frequency change sonrasında yeni bir düşük baseline veya uzun süre daha zayıf kalan bir seri görmedim. Yeterince büyük olacağını düşündüğüm failure mode belirgin şekilde ortaya çıkmadı.

Gerçekte ne iddia edebilirim

Reklamların hiç etkisi olmadığını, kullanıcıların rahatsız olmadığını, retention'ın tamamen aynı kaldığını veya bu konfigürasyonun evrensel olarak optimal olduğunu söyleyemem. Toplu bir ortalama bunların hiçbirini kanıtlamaz.

Gözlemimin desteklediği en güçlü ifade daha sınırlıdır:

Sıklık artışından sonra, daha önce zaten gördüğüm normal dalgalanmanın ötesinde açık ve kalıcı bir aggregate engagement düşüşü gözlemlemedim.

Bu ifade daha küçük etkiler, kullanıcı grupları arasındaki farklar ve tek bir ortalamanın saklayabileceği davranışlar için alan bırakır. Test ettiğim şey konfigürasyonun tutulabilecek kadar kabul edilebilir olup olmadığıydı; global optimum bulup bulmadığım değil.

Sabit bir ortalama çok farklı kullanıcı davranışlarını gizleyebilir

Neredeyse değişmeyen toplu bir ortalama çok farklı gerçeklikleri temsil edebilir. Hemen herkes aynı davranıyor olabilir; bazı kullanıcılar daha erken ayrılırken başka bir grup daha uzun kalabilir; küçük bir grup olumsuz tepki verebilir ama ortalamayı yeterince değiştirmeyebilir; ya da gerçek negatif etki günlük doğal varyasyondan küçük olabilir.

Bu yüzden sabit bir ortalamayı faydalı bir uyarı sinyali olarak görüyorum, sıfır etki kanıtı olarak değil.

Engagement, ziyaret süresinin birebir karşılığı değildir

Bir analytics engagement metriğini de session'ın kesin ortalama süresi olarak değerlendirmedim. Active engagement, analytics sisteminin tanımına bağlıdır ve bir sekmenin açık kaldığı toplam süreyle aynı olmak zorunda değildir. Kullanıcılar odağı değiştirir, daha sonra geri gelir veya basit bir “time on site” modelini yanıltıcı kılan biçimlerde gezinir.

Bu nedenle reklam aralığını “average engagement X ise next pop X'ten önce olmalı” gibi bir formülden türetmedim. Metriği yön göstermek için kullandım: değişiklikten sonra ürün belirgin biçimde daha zayıf mı görünüyordu? İzlediğim aggregate seviyede cevap hayırdı.

Cooldown ve frequency window ilişkili ama aynı değil

Implementation hem 240 saniyelik cooldown hem de 240 saniyelik window içinde maksimum bir başarılı event kullanıyordu. Büyük ölçüde redundant olsalar da biraz farklı constraint'ler ifade ediyorlar.

Cooldown, önceki event'ten yeterli süre geçmeden yenisine izin verme der. Window ise tanımlı dönem içinde birden fazla başarılı event'e izin verme der. Integration mekanizmalardan birini farklı yorumlasa bile intended invariant açık kalsın diye ikisini de korudum.

İki başarılı popunder hiçbir zaman dört dakikadan daha kısa aralıkla gerçekleşmemelidir.

Window başına bir event, ziyaret başına bir event demek değildir

maxEventsPerWindow = 1 değeri ziyaretçinin tüm kaldığı süre boyunca yalnızca bir reklam anlamına gelmez. Scope konfigüre edilen window'dur; window sona erdiğinde yenisi başlayabilir. 1 bir kullanıcı action'ı da değildir; o periyot içindeki bir başarılı monetization event'idir.

Şimdi frequency logic incelerken üç soru soruyorum: Counter neyi sayıyor? Ne resetliyor? Reset window ne kadar uzun? Bu cevaplar olmadan 1 gibi raw value'lar neredeyse hiçbir şey söylemez.

Policy'yi provider-specific implementation'dan ayırdım

Yeniden kullanılabilir davranış vendor-specific script, identifier veya parameter name göstermeden ifade edilebilir:

function isEligible(state, now) {
  if (!state.hasShownFirstEvent) {
    return now - state.arrivalTime >= 45_000;
  }

  return now - state.lastEventTime >= 240_000;
}

Bu açıklayıcı pseudocode'dur, production source code değildir. Provider'lar, SDK'lar ve deployment architecture değişir; politika daha kalıcıdır: ziyaretin başlangıcını koru, gerçek kullanım başladıktan sonra monetization'a izin ver, hard cooldown uygula ve ancak sonrasında tekrar et.

Build başarısı ile davranışsal doğruluk farklı şeylerdir

Typechecker, linter ve production build birçok teknik özelliği doğrulayabilir, ancak reklam timeline'ının browser'da doğru çalıştığını kanıtlamaz. Bu feature için behavioral validation da gerekir.

1. Temiz bir browser state açın.
2. Initial delay bitmeden interact edin: popunder olmamalı.
3. Initial delay süresini geçin.
4. Eligible interaction yapın: ilk popunder olabilir.
5. Cooldown bitmeden interact etmeye devam edin: ikinci popunder olmamalı.
6. Cooldown'ın bitmesini bekleyin.
7. Yeniden interact edin: artık başka bir popunder olabilir.

Başarılı build ve başarılı behavioral test farklı soruları yanıtlar. İkisi de önemlidir.

Toplam reklam deneyimi tek tek placement'lardan daha önemlidir

İki bağımsız reklam sistemi ayrı ayrı makul görünüp birlikte agresif bir deneyim yaratabilir. Dört dakikalık limite sahip iki format sırayla çalışırsa kullanıcı yaklaşık 00:45, 02:45, 04:45 ve 06:45'te kesinti yaşayabilir.

Bu beni daha iyi bir kurala götürdü:

Frequency cap'ler reklam script'i başına değil, kullanıcı deneyimi başına değerlendirilmelidir.

Kullanıcı her bir kesintinin hangi konfigürasyondan geldiğini değil, toplam kesintiyi yaşar. Production audit bu nedenle bir kullanıcının belirli bir sürede gerçekte kaç interruptive ad event ile karşılaşabileceğini sormalıdır.

Ham impression sayısı yanlış optimizasyon hedefidir

Cooldown'ı azaltarak daha fazla fırsat yaratmak kolaydır. Zor soru, kullanıcının toplam ekonomik değerini azaltmadan ne kadar ek monetization elde edilebileceğidir.

Ziyaret başına daha az reklam gösteren bir konfigürasyon, tekrar kullanımı daha iyi koruyorsa zaman içinde daha fazla revenue üretebilir. Bu yüzden revenue per user over time, benim için impressions per visit değerinden daha önemlidir. İkincisini maksimize etmek kolaydır; ilki gerçek iş problemidir.

Daha güçlü bir test tek bir aggregate grafiğin ötesine geçerdi

Production gözlemim, korktuğum katastrofik sonucun açıkça gerçekleşmediğini anlamam için yeterliydi. Tüm downstream effect'leri belirlemek için yeterli değildi.

Daha güçlü bir deney, unique user başına monetization revenue, ziyaret başına revenue, kullanıcı başına reklam event, active engagement, ürün içindeki anlamlı interaction'lar, returning-user rate, zaman içinde retention ve uzun vadeli user value ölçerdi.

İki tarafı da ölçmek gerekir. Sadece reklam output'una bakarsam neredeyse kaçınılmaz olarak “daha fazla reklam daha iyidir” sonucuna varırım. Sadece engagement'a bakarsam çok düşük davranış maliyetiyle gelen anlamlı revenue artışlarını kaçırabilirim.

Policy'yi neden basit tuttum

Sürekli yeni istisnalar eklemek için neden görmedim. Final logic basit kaldı: 45 saniye bekle, sonraki eligible interaction'da monetize et, dört dakika hard cooldown uygula ve sonra sonraki uygun interaction'ın tekrar monetize etmesine izin ver.

Az sayıda güçlü invariant, çok sayıda belirsiz exception içeren bir politikadan daha kolay anlaşılır, test edilir ve debug edilir.

Asimetri bilinçli

Policy yeni kullanıcılarla engaged users'ı farklı ele alır. Yeni ziyaretçi daha fazla korunur; etkileşime devam eden kullanıcı zaman içinde daha fazla monetization opportunity yaratır.

Böylece reklam baskısı en başta maksimum seviyede uygulanmak yerine kanıtlanmış engagement ile birlikte artar. Bu kavramsal değişim deneyin en yararlı sonuçlarından biriydi.

Bu case study'den ne sonuç çıkarmazdım

45 saniyenin evrensel olarak doğru olduğunu, dört dakikanın optimal interval olduğunu, daha yüksek popunder sıklığının engagement'a asla zarar vermediğini veya sabit ortalamanın kullanıcıların etkilenmediği anlamına geldiğini söylemezdim. Tek bir production workload'u tüm web ürünlerine de genellemezdim.

Farklı ürünlerin farklı kullanıcıları, beklentileri, acquisition source'ları, usage pattern'ları ve ekonomileri vardır. Sonuç tam da spesifik olduğu için değerlidir, evrensel bir kural kanıtladığı için değil.

Fikrimi değiştiren bölüm

Deneyden önce reklam baskısı ile engagement arasında neredeyse mekanik bir ilişki bekliyordum: birini yeterince yükseltirsen diğerinin gözle görülür şekilde düşmesi gerekir. Production behavior bu kadar düzenli değildi.

Frekansı nispeten yüksek bulduğum bir seviyeye çıkardım. Kullanıcılar etkileşime devam etti ve aggregate engagement tanıdık günlük aralığında kaldı. Bu, maliyetin sıfır olduğu anlamına gelmiyor. Sadece izlediğim metric'te beklediğim açık signal'i oluşturacak kadar büyük görünmediği anlamına geliyor.

“Etki yok” ile “bu ölçümde belirgin etki yok” arasındaki fark önemlidir. Production sistemleri bize nadiren istediğimiz kadar temiz causal story verir.

Şimdiki kuralım

Artık teknik olarak ne kadar sık yeni popunder gösterebileceğimi sormuyorum. Yeni bir kullanıcı monetization başlamadan önce ne kadar kesintisiz ürün deneyimi almalı, engaged user başka bir event mümkün olmadan önce ne kadar kesintisiz kullanım almalı ve ek reklam toplam user value'yu mu artırıyor yoksa yalnızca impression counter'ı mı, bunları soruyorum.

Bu uygulama için koruduğum değerler:

ilk eligibility öncesi 45 saniye
başarılı event'ler arasında en az 4 dakika

Bu değerler yalnızca bir implementation. Başka yerde yeniden kullanacağım kural daha geniş:

Kullanıcı yolculuğunun başlangıcını koru, ilk meraktan ziyade kanıtlanmış engagement'ı daha güçlü monetize et ve sonucu ham reklam hacmi yerine kullanıcı seviyesindeki değerle değerlendir.