Promotion Click
Also known as: select_promotion, Promotion Selection, Internal Promotion Click, Banner Click
Promotion Click is the standard ecommerce select_promotion event, recorded when a shopper deliberately activates an internal promotional creative such as a hero banner, carousel slide, category tile or offer module, and it carries the same promotion_id, promotion_name, creative_name, creative_slot and location_id as the impression that preceded it. It is the click half of the on-site campaign funnel and the agreed numerator for Promotion Click-Through Rate, so every promotion, creative variant and placement can be judged on the engagement it earns from the exposure it was given.
Event Serialization
always
Business Use Case
1️⃣ The Onsite Merchandising Manager reviews the weekly promotion report, ranks each creative_slot by clicks earned against the impressions it received, and moves the strongest offer into the hero slot while retiring creatives that draw exposure but no engagement before the next campaign drop. 2️⃣ The Campaign Marketing Manager checks clicks by creative_name within the first 48 hours of a launch, identifies the copy or imagery variant shoppers actually respond to, and pushes that variant to the remaining placements while the campaign is still live. 3️⃣ The Product team running banner and hero experiments uses the click as the primary success event against Promotion View as the exposure denominator, and only declares a winning creative once both variants show a comparable impression base. 4️⃣ Revenue Management joins promotion clicks to the orders and discount cost that follow them, and reallocates prime placement and promotional inventory toward the offers that convert clicks into margin rather than those that simply attract them.
Business Criticality
High
Journey / Navigation Area
Discovery
Owning Function
Marketing
Calculation Notes
1️⃣ Fires on deliberate activation of the creative — primary mouse click, touch tap, Enter or Space on a focused element, and modifier or middle clicks that open a new tab — and it fires before navigation, not after the destination page loads. Send it with a beacon or keep-alive transport, or hold the navigation on an event callback with a short timeout, so the hit survives unload on slow devices; never rely on the destination page to report the click back. 2️⃣ Serialization is once per deliberate activation, so the event is allowed to repeat within a page view and within a session. Bind the handler to the outermost creative container and stop propagation there: a banner whose wrapper, image anchor and CTA button are each clickable must emit exactly one event, and a repeat activation of the same promotion_id and creative_slot inside roughly one second (double-click, rage-click, touch plus synthetic click) is suppressed as a duplicate. 3️⃣ Required parameters are promotion_id, promotion_name, creative_name and creative_slot, with location_id required whenever the same creative runs in more than one placement or locale; the items array stays optional and is sent only when the creative links to specific SKUs. Every value must be byte-identical to the one sent on the paired Promotion View — any drift in casing, versioning or slot label silently breaks the impression-to-click join and makes click-through unreportable. 4️⃣ Excluded from collection: programmatic activations that no shopper made (carousel auto-advance, personalisation or test scripts calling click()), clicks on surrounding chrome such as carousel arrows, pagination dots and dismiss controls, activations of an expired or disabled creative that does not navigate, and bot, pre-render and automated traffic. Clicks on paid media placements belong to campaign reporting and are never collected here. 5️⃣ No personal data belongs in the payload. promotion_id, creative_name and creative_slot must be catalogue values from the campaign and merchandising systems rather than personalised strings, and no identifier from the destination URL query string is copied into the event; collection is suppressed while analytics consent is denied, on the same basis as Promotion View, so numerator and denominator are never drawn from different consent populations. 6️⃣ The event belongs to the page view and session in which the creative was exposed. Stamp it at the moment of activation and dispatch it before a single-page-application route change rewrites page context; when the destination opens in a new tab the event still belongs to the originating page, not to the new one. 7️⃣ The recurring instrumentation faults are firing on hover or on impression rather than on activation, losing the hit to navigation because no beacon transport was configured, emitting several events from nested clickable regions of one creative, letting creative_slot labels diverge between templates, and replacing the standard event with a KPI-shaped custom name such as 'banner_ctr' that cannot be joined to the impression.
Platform Events
| Platform | Event |
|---|---|
| Google Analytics 4 | select_promotion |
| Adobe | Internal Promotion Click |
Data Mappings
W3 Data Layer
{
"digitalData": {
"pageInstanceID": "prod-home-en-us",
"page": {
"pageInfo": {
"pageID": "home",
"pageName": "Homepage",
"destinationURL": "https://www.example.com/"
},
"category": {
"primaryCategory": "Home",
"pageType": "home"
}
},
"component": [
{
"componentInfo": {
"componentID": "PROMO_SUMMER30_2026",
"componentName": "Summer Sale 30% Off"
},
"attributes": {
"promotion_id": "PROMO_SUMMER30_2026",
"promotion_name": "Summer Sale 30% Off",
"creative_name": "summer_sale_hero_banner_v2",
"creative_slot": "homepage_hero_1",
"location_id": "home_page"
}
}
],
"event": [
{
"eventInfo": {
"eventName": "select_promotion",
"eventAction": "Internal Promotion Click",
"type": "click",
"timeStamp": "2026-09-20T14:43:19.804Z"
},
"attributes": {
"promotion_id": "PROMO_SUMMER30_2026",
"promotion_name": "Summer Sale 30% Off",
"creative_name": "summer_sale_hero_banner_v2",
"creative_slot": "homepage_hero_1",
"location_id": "home_page",
"link_destination": "https://www.example.com/collections/summer-sale"
}
}
],
"version": "1.0"
}
}GA4 Data Layer
{
"event": "select_promotion",
"ecommerce": {
"promotion_id": "PROMO_SUMMER30_2026",
"promotion_name": "Summer Sale 30% Off",
"creative_name": "summer_sale_hero_banner_v2",
"creative_slot": "homepage_hero_1",
"location_id": "home_page",
"items": [
{
"item_id": "SKU_10245",
"item_name": "Linen Shirt",
"item_brand": "Northwind",
"item_category": "Apparel",
"price": 39.99,
"index": 0,
"promotion_id": "PROMO_SUMMER30_2026",
"promotion_name": "Summer Sale 30% Off",
"creative_name": "summer_sale_hero_banner_v2",
"creative_slot": "homepage_hero_1",
"location_id": "home_page"
}
]
}
}Adobe Client Data Layer
{
"event": "promotionClick",
"eventInfo": {
"eventName": "Internal Promotion Click",
"eventType": "click",
"trigger": "creative_activation"
},
"promotion": {
"promotion_id": "PROMO_SUMMER30_2026",
"promotion_name": "Summer Sale 30% Off",
"creative_name": "summer_sale_hero_banner_v2",
"creative_slot": "homepage_hero_1",
"location_id": "home_page"
},
"productListItems": [
{
"SKU": "SKU_10245",
"name": "Linen Shirt",
"priceTotal": 39.99,
"currencyCode": "USD"
}
],
"web": {
"webPageDetails": {
"name": "Homepage",
"siteSection": "home"
}
}
}XDM Mapping
{
"eventType": "web.webinteraction.linkClicks",
"timestamp": "2026-09-20T14:43:19.804Z",
"web": {
"webInteraction": {
"name": "Internal Promotion Click",
"type": "other",
"URL": "https://www.example.com/collections/summer-sale",
"linkClicks": {
"value": 1
}
},
"webPageDetails": {
"name": "Homepage",
"siteSection": "home"
}
},
"productListItems": [
{
"SKU": "SKU_10245",
"name": "Linen Shirt",
"priceTotal": 39.99,
"currencyCode": "USD"
}
],
"_experience": {
"analytics": {
"customDimensions": {
"eVars": {
"eVar31": "PROMO_SUMMER30_2026",
"eVar32": "Summer Sale 30% Off",
"eVar33": "summer_sale_hero_banner_v2",
"eVar34": "homepage_hero_1",
"eVar35": "home_page"
},
"props": {
"prop31": "PROMO_SUMMER30_2026",
"prop34": "homepage_hero_1"
}
}
}
}
}Source Data
Digital Analytics (GA4)
Dependencies
Prerequisite: List the dependencies required for this Event
Report Attributes
Promotion Name Promotion ID Creative Name Creative Slot Location ID Page Type Device Category Default Channel Grouping Campaign Name New vs Returning User
Segment Eligibility
true
Governance
Dimensions
Related Dimensions
Derived Dimensions
Derived Entities
Derived Metrics
Derived KPIs
Governance & Metadata
GitHub
catalog/events/promotion-click.yml