From 936f283b6dbed4d82e0427d990b1bcf402d0ed63 Mon Sep 17 00:00:00 2001 From: Ryan Salazar Date: Sun, 24 May 2026 21:57:59 +0000 Subject: [PATCH] =?UTF-8?q?ads:=20drop=20IntersectionObserver=20gate=20?= =?UTF-8?q?=E2=80=94=20one=20mount=20=3D=20one=20impression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AdImage.tsx | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/components/AdImage.tsx b/src/components/AdImage.tsx index 1e7f758..8e77b1b 100644 --- a/src/components/AdImage.tsx +++ b/src/components/AdImage.tsx @@ -53,30 +53,13 @@ export default function AdImage({ const id = ad.campaign_id || ad.slug; if (!id) return; + // One impression per pageview per banner, fired on mount. No viewport + // gate — too many ad slots sit below-the-fold and the IO threshold + // suppressed real signal. if (!beaconMount.current) { beaconMount.current = true; sendImpression(id, page, false); } - - const el = containerRef.current; - if (!el) return; - - const observer = new IntersectionObserver( - (entries) => { - for (const e of entries) { - if (e.isIntersecting) { - const now = Date.now(); - if (now - lastViewportFire.current >= 12000) { - lastViewportFire.current = now; - sendImpression(id, page, true); - } - } - } - }, - { threshold: 0.5 }, - ); - observer.observe(el); - return () => observer.disconnect(); }, [ad.src, ad.slug, ad.campaign_id, page]); if (!ad.src) return null;