brave-minister-66862
05/01/2026, 8:42 PMtrackingCallback is wrong or we're hitting a known limitation.
Setup: Astro static site, GA4 loaded via GTM (deferred), @growthbook/growthbook client-side, bucketing on deviceId. 3 variations (control + 2 redirects).
Prod (N=2048, p<0.001): Control 47.66% / Var1 25.34% / Var2 27%. Variations losing ~22% of expected exposures.
Already ruled out: local simulation (~2000 fresh sessions, capturing every GA4 request) shows balanced bucketing, exactly 1 event per session, no double-fire, no destination re-evaluation. SDK looks clean in isolation.
Our hypothesis: because GA4 is GTM-deferred, gtag.js sometimes isn't ready before GrowthBook fires the redirect (within 2s maxNavigateDelay). The queued experiment_viewed sits in dataLayer, page unloads, event lost. Control has no deadline, so it always delivers.
Implementation (per docs' async-callback + transport_type: 'beacon' pattern):
trackingCallback: (experiment, result) => {
const attrs = gb.getAttributes() as Record<string, string>
const isRedirectVariation = !!(result.value as { urlRedirect?: string } | undefined)?.urlRedirect
if (isRedirectVariation) {
return new Promise<void>((resolve) => {
gtag('event', 'experiment_viewed', {
transport_type: 'beacon',
event_category: 'experiment',
experiment_id: experiment.key,
variation_id: result.variationId,
gb_user_id: attrs.userId,
gb_device_id: attrs.deviceId,
event_callback: resolve,
})
})
}
return new Promise<void>((resolve) => {
gtag('event', 'experiment_viewed', {
event_category: 'experiment',
experiment_id: experiment.key,
variation_id: result.variationId,
gb_user_id: attrs.userId,
gb_device_id: attrs.deviceId,
event_callback: resolve,
})
})
},
Question: is something wrong here, or is transport_type: 'beacon' known to be unreliable with GTM-deferred GA4? If the latter — what do you recommend for client-side redirect experiments when Edge Worker SDK isn't an option?
Thanks!fresh-football-47124
fresh-football-47124
fresh-football-47124
fresh-football-47124
brave-minister-66862
05/01/2026, 8:45 PMbrave-minister-66862
05/08/2026, 12:47 PMbrave-minister-66862
05/08/2026, 12:53 PMbrave-minister-66862
05/11/2026, 9:41 AM