Google标签管理器和Optimize可在服务器端实验中发送变体。

10

我正在使用Google Tag Manager容器来管理脚本。 我正在尝试执行服务器端优化/分析实验。出于性能原因,我需要进行服务器端实验。 我已经成功地使用GTM / Optimize容器执行了客户端实验。

这是我的GTM代码:

window.dataLayer = window.dataLayer || [];
....    
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXXX');</script>
<!-- End Google Tag Manager -->

我尝试了以下不同的方法来触发哪个变体。

// These fn get called only once GA exists via setTimeout. They get called correctly.
// I've setup the experimentTrigger via GTM container and it triggers correctly to Analytics.
function setGAExperiment1(_expIdvId){
    // Matches ga('set', 'exp', '$experimentId.$variationId');
    //   https://developers.google.com/optimize/devguides/experiments
    ga('set', 'exp', _expIdvId);
    dataLayer.push({'event': 'experimentTrigger', 'exp': _expIdvId }); // to trigger data send of exp
    // I receive the experimentTrigger event with 'exp' value on Analytics but not any experiment data into Optimize/Analytics.
}

function setGAExperiment2(_expIdvId){
    // Matches ga('set', 'exp', '$experimentId.$variationId');
    //   https://developers.google.com/optimize/devguides/experiments
    ga('set', 'exp', _expIdvId);
    ga('send', 'event', 'experiment', 'view'); // to trigger data send of exp
}

我在Google Optimize或Google Analytics的“行为”->“实验”中没有收到任何实验数据,就像我应该收到的那样。我该如何修复这个问题?

我找到了与此话题最接近的讨论,分别是这里这里,但没有明确的答案。

3个回答

8
你可以使用 Google Tag Manager 中的“Fields To Set”选项,在页面加载时设置 Google Analytics 变量。
  1. 在 GTM 中打开您的 Universal Analytics 标签
  2. 点击 启用标签中的覆盖设置
  3. 点击 更多设置> Fields to Set
  4. 创建一个名为expId的新字段。该字段应包含字母数字实验 ID XXXXXXXXXXX
  5. 创建一个名为expVar的新字段。该字段应包含实验变体号码(原始版本为 0,自定义版本为1、2、3等)
重要提示:确保优化标记在分析标记之前触发。
在我的情况下,我使用了“自定义 JavaScript”变量来处理expIdexpVar字段,这些变量使用一些自定义代码来获取正确的实验 ID 和版本 ID。
我通过查看“分析字段参考”页面来找到这些字段名称。

https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#expId

https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#expVar

这种方法可能比您自己的答案更受欢迎,因为它不需要触发任何额外的事件。除此之外,您可以完全在GTM中进行配置。
参考截图:

enter image description here


嗨@milan-simek,你能分享一下获取实验ID和变量号的自定义JS代码吗? - TSQL_Newbie

7

通过明确指定跟踪器ID解决了问题。

我使用谷歌提供的Analytics Debugger Chrome来调试问题,发现Google Tag Manager (GTM)使跟踪器ID为gtm1,因此我必须在前缀中加上它。

找到您的跟踪器ID,请调用ga.getAll()[0].get('name')(可能是gtm1gtm2等)。

将我的setGAExperiment函数更改为以下内容:

function setGAExperimentCX(_expId, _vId){
    ga('gtm1.set', 'exp', _expId.toString() + '.' + _vId.toString());

    // this forces the above exp set to be sent to GA, you can name the event whatever you want with whatever values you want
    ga('gtm1.send', 'event', 'Experiment', 'Trigger', _expId.toString() + '.' + _vId.toString());
}

调用setGAExperimentCX函数的功能是:
function performNewCartExp(_vId) {
    if (typeof ga == "undefined") {
        if (_performNewCartExp != undefined) { clearTimeout(_performNewCartExp); }
        _performNewCartExp = setTimeout(function () { performNewCartExp(_str); }, 250);
    } else {
        setGAExperimentCX('XXXXXXXXXXX', parseInt(_vId, 10));
    }
}

谢谢,这对我帮助很大。小修正:我认为“_str”应该改成“_vId”。 对于其他人:请注意,“ga”和“getAll”函数需要一段时间才能初始化,因此此处的轮询是必要的。 如果您正在进行故障排除,将所有跟踪器发送到循环中(ga.getAll().forEach(function(i) { var tracker = i.get('name');)也可能会有所帮助。虽然这可能不是最好的方法,但在我弄清如何通过GTM / UA发送变量之前,它似乎可以工作。 - Oliver Schimmer

1
这个问题的根本原因似乎是,当您使用标签管理器设置事件并使用Google Analytics设置变量时,实验ID和变体未随您在GTM中设置的事件一起发送。出于某种原因,它只是没有从服务器上设置的实验中获取到。
如果您将GTM设置为不使用GA设置变量,而是将您的设置分别放在每个GA标签中,它确实可以工作。
我们在两个不同的网站上具有相同的Optimize、GA和GTM实现,但在两个不同的GTM容器中。一个设置了GA设置变量,另一个则在每个标签中单独设置了GA设置。在使用GA设置变量的那个上,最初的设置无法正常工作,而在另一个上却可以正常工作。
Milan的答案解决了这个问题。
使用Milan的答案,您不必将您的实验ID和变体放在ga('set', 'exp', ...)中。将其放入数据层,然后将其用作变量也应该可以工作(我还没有测试)。优点是您不必使用一些奇特的自定义JavaScript来再次获取该ID和变体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接