Appearance
Specsavers Adbubble - Tracking Issues (April 2026)
Creative 90597 - Bubble/Expandable format, delivered via GAM on TV2.no.
What's Wrong
- Viewability ~0% - 493 viewable impressions out of 990k (0.05%). Bubble format normally sits at 96%+.
- Interacted was 0% for 10 days, then jumped to 23% - No interacted data April 14-23, then suddenly 23% from April 24 after a rebuild.
- Flow data gap - 5,059 started conversations but only ~227 appear in flow level 0. Continue rates show 0% despite users clearly progressing between levels.
Potential Causes
Interacted (confirmed fixed)
- Engine 6.8.4 bug:
creativeContainerClicked()inCreative.vueused@click.selfwhich never fires becauseCreativeBodycovers the entire container.creativeClickedOncewas never set, so no "interacted" events were sent. - Fixed in 6.8.5 with
@click.capture="handleFirstInteraction"which catches the first trusted click anywhere in the creative. - The 23% rate post-fix may be slightly inflated because close button (RemoveButton) also triggers
handleFirstInteraction.
Viewability (~0%)
- GAM iframe containment - Expandable stub tries to break out with
window.top.documentbut fails silently in cross-origin GAM iframes. Creative runs trapped inside the iframe. - IntersectionObserver scope - Inside a cross-origin iframe, IntersectionObserver checks visibility against the iframe viewport, not the user's actual viewport. The 50% threshold may never be met depending on iframe dimensions.
- TCF/GDPR gating -
Visibility.setup()is only called whentcfTrackingEnabledis true. If publisher CMP blocks Cavai vendor 729 or purpose 7, viewability tracking is skipped entirely. However, the check only blocks on explicitfalse, so this is less likely. - Expandable initial state - Creative container starts with
visibility: hidden; position: fixed; bottom: 0. IntersectionObserver is set up immediately at init, but the element may not register as intersecting depending on browser behavior with hidden elements.
Flow data gap
- Expected behavior for expandable -
conversationFlow.ts(line 59-66) has an early return when!creativeExpanded && creativeType === EXPANDABLE. Flow components are only processed after expansion. - The gap between 5,059 started and 227 in flow level 0 may simply be users who expanded, browsed the slider, but never clicked a glasses choice.
- Continue rates at 0% suggest the aggregation pipeline isn't linking flow steps correctly for this creative type.
Potential Solutions
- Viewability in iframes - Investigate whether the bubble breaks out of the GAM iframe on the actual publisher page. Compare with other Adbubble creatives that have normal viewability (96%+) to see if they use a different delivery method.
- IntersectionObserver fallback - Consider adding a fallback for cross-origin iframes: use
postMessageto the parent to check actual viewport visibility, or use the SafeFrame API ($sf.ext.inViewPercentage()) when SafeFrame is detected. - Interacted inflation - Consider whether close button clicks should count as "interacted". Could filter by checking if
numUserActions > 0rather thancreativeClickedOnce. - Flow continue tracking - Investigate why continue rates are 0% in aggregation despite users progressing between flow levels.
Key Files
| File | Relevance |
|---|---|
Creative-Engine/src/components/creative/Creative.vue | handleFirstInteraction fix (6.8.5) |
Creative-Engine/src/analytics/visibility.ts | IntersectionObserver setup, viewability tracking |
Creative-Engine/src/analytics/analytics.ts | TCF gating of visibility, sendAnalytics |
Creative-Engine/src/analytics/TCF.ts | TCF consent check (vendor 729, purpose 7) |
Creative-Engine/src/logic-system/processors/conversationFlow.ts | Expandable flow early return (line 59-66) |
Creative-Engine/templates/tagstub/Expandable.ts | Stub iframe breakout logic |
Creative-Engine/templates/tagstub/helpers/getTopmostDocument.ts | Cross-origin fallback |