使用滚动事件正确实现 GA 增强型电子商务 addImpression

Jam*_*mes 5 javascript jquery google-analytics

谷歌新的增强型电子商务跟踪有一些很棒的功能,包括印象数据和基于印象的点击率。这很棒,但是Google 给出的默认示例是在页面加载时为每个产品设置 addImpression。问题是,如果一个网站有很大的类别页面(例如一个页面有 100 个产品),那么这些产品中的许多可能实际上从未被查看过,因此“印象”确实没有发生,数据将不准确。

addImpression 方法也可以通过事件发送,所以我解决这个问题的方法是将一个函数绑定到滚动事件并使用jQuery Viewport 插件来查看项目是否真的在视图中。如果该项目在视图中,它会从我添加到每个产品的数据属性标签中获取信息,为该对象创建一个印象,并为其分配一个类“impressionSent”,以便该产品不会再次发送(防止单个页面加载的双重印象)。在每个函数的末尾,使用 .promise().done(),新的展示数据与事件一起发送。

简单的脚本是:

$j(window).bind("scroll", function() {
          $j('li.item:in-viewport').not('.impressionSent').each(function(){
            $j(this).addClass('impressionSent');           
                ga('ec:addImpression', {
                  'id': $j(this).attr('data-sku'),
                  'name': $j(this).attr('data-name'),
                  'category': $j(this).attr('data-category'),
                  'brand': $j(this).attr('data-brand'),
                  'list': 'Category',
                  'position': $j(this).attr('data-position')                     
                });           
          }).promise().done( function() {
              ga('send', 'event', 'scroll', 'impression', {'nonInteraction': true});     
          });
        });
Run Code Online (Sandbox Code Playgroud)

在 Dev 中,除了一个问题外,此方法非常有效:正在触发的事件数量。在控制台中并使用 Google Analytics Debugger 浏览网站时出现以下错误:
Exceeded rate limit for sending hits. Aborting hit.

根据 Google 的说法,每个会话最多可以发送 500 个事件。

所以我的问题是:(1) 是否可以使用 js/jquery 方法来限制每个会话发送的事件数量,而不是执行 setInterval 函数并检查是否有新信息要发送?像在变量中存储特定数量并在达到特定大小或页面退出时将其发送之类的东西?

(2) 对于分析专家:这是否能解决我的问题,或者是“最多 500 个事件”,包括“addImpression”方法的数量。即如果我在一个页面上有 500 个产品并在单个事件中发送 500 个 addImpression,这会超过最大值吗?

Ben*_*nja 2

是的,每次检测到印象时,您都可以将其添加到队列中,然后调用函数来发送事件,并对其进行“反跳”,例如使用:

https://lodash.com/docs#debounce

这将做你想要的“创建一个去抖函数,延迟调用 func ,直到自上次调用去抖函数以来等待毫秒过去。”

在去抖函数中,您可以从展示队列中获取所有内容,并将其发送到 GA。这将减少您对事件的使用,因为您可以在 1 个事件中发送所有排队的展示次数,例如:

impressionQueue = [];

function filterDuplicates(impressions) {
  // TODO: return impressions array without duplicates
}

var sendImpressions = _.debounce(function() {
  filterDuplicates(impressionsQueue).forEach(function(impression) {
    ga('ec:addImpression', impression);
  });
  impressionQueue.length = 0;
  ga('send', 'pageview');
}, 2000); // debounce for 2 seconds

// call this for every product that enters the viewport
function trackProductImpression(impression) {
  impressionQueue.push(impression);
  sendImpressions();
}
Run Code Online (Sandbox Code Playgroud)

反跳延迟越高,您将发送的事件越少(如果用户在发送展示次数之前关闭选项卡/快速离开,则丢失一些展示次数的可能性也越大)