← Back to Events

Promotion View

Also known as: view_promotion, Promotion Impression, Internal Promotion View, Banner Impression

AcquisitioneventE-commerce: Top-of-Funnel & Marketing AcquisitionPromotionsE-commerce

Promotion View is the standard ecommerce view_promotion event, recorded when an internal promotional creative such as a hero banner, carousel slide, category tile or offer module becomes genuinely visible to a shopper, and it carries promotion_id, promotion_name, creative_name, creative_slot and location_id. It is the impression half of the on-site campaign funnel and the agreed denominator for Promotion Click-Through Rate, so every promotion, creative variant and placement can be compared on exposure as well as on clicks and downstream revenue.

Event Serialization

always

Business Use Case

1️⃣ The Onsite Merchandising Manager reviews slot performance every Monday, ranks each creative_slot by promotion views against the clicks and revenue they generate, and rotates or retires any slot delivering exposure without click-through before the next campaign drop. 2️⃣ The Campaign Marketing team checks delivery within 24 hours of a promotion going live, confirming the creative actually reached shoppers across device categories, locales and channels, and fixes targeting or personalisation rules when a placement shows no or partial exposure. 3️⃣ The Product team running banner and hero experiments uses promotion views as the exposure denominator, verifying both variants received a comparable impression base before any click-through or conversion difference is read as a result. 4️⃣ Revenue Management uses exposure by promotion and audience to judge how much discount visibility is being spent for each incremental order, and reallocates promotional inventory toward offers with the strongest click-to-order yield.

Business Criticality

High

Journey / Navigation Area

Discovery

Owning Function

Marketing

Calculation Notes

1️⃣ Fires on qualified viewability, not on render: the creative must have at least 50% of its pixel area inside the viewport for one continuous second, measured with an IntersectionObserver. Above-the-fold creatives fire once the threshold is met after paint; single-page-application route changes only re-arm the observer, they never fire the event by themselves. 2️⃣ Serialization is once per promotion_id + creative_slot per page view, and the event fires on every subsequent page view — scrolling a creative out of and back into the viewport must not re-fire. Lazy-loaded and infinite-scroll modules fire on first qualifying exposure only; a carousel is the exception, where each slide is its own creative and fires when it becomes the active qualifying slide, with auto-rotation back to a slide already counted suppressed for the life of the page. 3️⃣ Required parameters are promotion_id, promotion_name, creative_name and creative_slot; location_id is required whenever the same creative is served in more than one placement or locale. The items array is optional and is populated only when the creative promotes specific SKUs — send no array rather than an empty one, and keep promotion values identical at event and item level. 4️⃣ Excluded from collection: exposures in a hidden or backgrounded tab (document.visibilityState is not 'visible'), pre-rendered and bot traffic, creatives inside collapsed accordions or off-screen carousel slides that were never activated, and personalisation slots that resolved to no creative at all. 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, never a personalised string containing a customer name, email hash, segment membership or basket content, and collection is suppressed while analytics consent is denied so consented and non-consented exposure never mix in the denominator. 6️⃣ The most common instrumentation faults are firing on DOM insertion rather than viewport exposure, which inflates the denominator and depresses Promotion Click-Through Rate; letting promotion_id or creative_slot drift between view_promotion and select_promotion, which breaks the impression-to-click join; reusing one creative_slot label across templates; and treating internal promotion views as paid media impressions in acquisition reporting. 7️⃣ Volume is high — a merchandised homepage can emit more promotion views than page views — so cap the number of creatives instrumented per template, timestamp each event at the moment of qualifying exposure rather than at page load, and keep the event out of conversion-path and engagement definitions to protect event quotas and server-call budgets.

Platform Events

PlatformEvent
Google Analytics 4view_promotion
AdobeInternal Promotion Impression

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": "view_promotion",
          "eventAction": "Internal Promotion Impression",
          "type": "impression",
          "timeStamp": "2026-09-20T14:43:07.512Z"
        },
        "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"
        }
      }
    ],
    "version": "1.0"
  }
}
GA4 Data Layer
{
  "event": "view_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": "promotionView",
  "eventInfo": {
    "eventName": "Internal Promotion Impression",
    "eventType": "impression",
    "trigger": "viewport_50_percent_1_second"
  },
  "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": "display",
  "timestamp": "2026-09-20T14:43:07.512Z",
  "web": {
    "webPageDetails": {
      "name": "Homepage",
      "siteSection": "home"
    }
  },
  "productListItems": [
    {
      "SKU": "SKU_10245",
      "name": "Linen Shirt",
      "priceTotal": 39.99,
      "currencyCode": "USD"
    }
  ],
  "_experience": {
    "decisioning": {
      "propositionEventType": {
        "display": 1
      }
    },
    "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

Data SensitivityInternal

Dimensions

Derived Entities

Derived Metrics

Governance & Metadata

Created bydevyendarm
Created on9/20/2026
Last modified bydevyendarm
Last modified on9/21/2026
Version1.0.0
Validation stateqa passed
StatusPUBLISHED

GitHub

View related Pull Requestcatalog/events/promotion-view.yml

Community Discussion