π£ Phase 3 β OptionalΒ Β·Β Internal promotion analytics.
view_promotion & select_promotion
When to pushβ
view_promotion: when a promotional banner / internal push appears (homepage hero, sale ribbon, etc.).select_promotion: when the user clicks it.
view_promotion exampleβ
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'view_promotion',
ecommerce: {
items: [
{
promotion_id: 'sale_summer_2026',
promotion_name: 'Summer Sale -20%',
creative_name: 'hero_banner_summer_v1',
creative_slot: 'homepage_hero',
location_id: 'home_top'
}
]
}
});
select_promotion exampleβ
Same shape, different event name:
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'select_promotion',
ecommerce: {
items: [
{
promotion_id: 'sale_summer_2026',
promotion_name: 'Summer Sale -20%',
creative_name: 'hero_banner_summer_v1',
creative_slot: 'homepage_hero',
location_id: 'home_top'
}
]
}
});
Parametersβ
| Parameter | Required |
|---|---|
promotion_id | required* |
promotion_name | required* |
creative_name | recommended |
creative_slot | recommended β placement |
location_id | optional |
* At least one of the two.
Platformsβ
| Platform | Native event |
|---|---|
| GA4 | view_promotion / select_promotion |
| Meta | β |
| Google Ads | β |
Multiple bannersβ
When several banners appear at once (e.g. 3 hero slots): either 3 separate view_promotion events or 1 event with 3 items.
Recommended: 3 separate events β easier to attribute later.
Pitfallsβ
- β Pushing on every scroll β use Intersection Observer: fire once when β₯ 50% visible.
- β Confusing with a product (
view_item) β a promotion is a marketing asset, not a product.