The view_promotion Event in Google Analytics 4 (GA4)
The view_promotion event in Google Analytics 4 (GA4) is used to track when a user sees a promotion—for example, a banner, hero slider, coupon teaser, or promotional tile.
This is valuable when you want to actually “measure” promotions: which campaigns are being seen, which are being clicked, and which ultimately lead to purchases? Combined with select_promotion, you can derive meaningful promo performance insights.
[SCREENSHOT: Homepage or category with visible promo banner (“Sale”, coupon, promotion) with clear design; ideally showing position/slot (e.g., top of hero).]
Implementation
The most important point about view_promotion: only track promotions that the user actually sees.
Especially on pages with multiple banners, sliders, or teasers, it’s not a good idea to simply send everything on the page as view_promotion. Better approaches:
- only track when a promo element becomes visible in the viewport, or
- at minimum, only track promotions in the initially visible area (above the fold).
Clean naming: ID, Name, Slot
Even though GA4 makes many promo parameters technically optional, you’ll only get truly meaningful reports if you consistently send at least the following:
promotion_id(stable ID, e.g.,winter_sale_2026)promotion_name(human-readable name)creative_name(which creative/asset)creative_slot(where on the page, e.g.,home_hero_1,sidebar_banner_2)
This way, you can later see not just that a promotion worked, but also which placement and which creative.
dataLayer
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: "view_promotion",
ecommerce: {
items: [{
promotion_id: "winter_sale_2026",
promotion_name: "Winter Sale 2026",
creative_name: "hero_banner",
creative_slot: "home_hero_1",
location_id: "home"
}]
}
});
Common pitfalls
- Too many impressions: If you track every promo on the page again on every scroll, CTRs and funnels quickly become unrealistic.
- Rotating sliders: For sliders, you can decide whether to only track the first slide (usually sensible) or later slides as well—but only if they were actually visible (e.g., after X seconds or on swipe).
- Inconsistent IDs/names: If you write
promotion_id/promotion_namedifferently depending on the page/template, reporting becomes fragmented (and much ends up as “(not set)” or in separate rows). Make sure the same teaser is named consistently everywhere.