0

我们有一个单页 Angular 应用程序,其中包含通过 GTM 注入的 Facebook 像素。在第一次注入中,我们传递了以下内容:

<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '<OUR ID>'); // Insert your pixel ID here. 
</script>

请注意,没有浏览量事件。然后,我们将一个自定义的“虚拟浏览量”事件推送到 GTM 数据层,该事件导致一个标签,该标签将浏览量发送到 Google Analytics(工作正常),并触发以下代码的注入:

<script>
fbq('track', 'PageView', {
    dim1:{{dim 1 macro}},
    dim2:{{dim 2 macro}},
    dim3:{{dim 2 macro}} 
});
</script>

在每个页面浏览中,上面的 fbq 被附加到 DOM 并填充了适当的尺寸(通过查看页面的源)。

在 FIRST 网页浏览 HIT 到 Facebook 时,维度存在于调用中(通过查看网络选项卡),但在 SUBSEQUENT 网页浏览中,点击发送到 Facebook,但没有发送维度,即使它们存在于代码中附加到 DOM。

在大多数情况下,这些维度不会因点击而改变,但可能会根据用户在整个会话期间所做的操作而改变。

关于为什么后续点击不包含自定义维度的任何想法?

4

2 回答 2

0

每次 Angular 应用程序中发生历史更改时,您都尝试更新有效负载并使用更新后的有效负载再次执行 fb 代码?

我会在你的前端实现一个数据层:

<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
  event: 'virtualPageView',
  pagePath: '/newPath', //update this path from your angular route,
                        //or use GTMs built in history-change trigger
                        //and a variable that gets the URL fragment
                        //to update your pageview's path variable.
  customDimenson1: 'value1',
  customDimenson2: 'value2',
  customDimenson3: 'value3'
});
</script>

创建一个名为virtualPageView的自定义事件类型的触发器。为pagePathcustomDimension1-3创建 4 个数据层变量类型的变量。创建包含您的 fbq 事件的自定义 HTML 标记:

<script>
fbq('track', 'PageView', {
    dim1:{{customDimenson1}},
    dim2:{{customDimenson2}},
    dim3:{{customDimenson3}} 
});
</script>

创建另一个在内置触发器All Pages上触发的自定义 HTML标记,因为它只需要为您的单页应用程序执行一次,并使用您的基本代码:

<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '<OUR ID>'); // Insert your pixel ID here. 
</script>

我在 SPA 中遇到了更新变量的问题。有时这是一种竞争条件,有时是 GTM 或您的代码中的错误。您还可以尝试使用 100 毫秒计时器来延迟执行(不好的建议)。

于 2017-12-28T04:14:04.503 回答
0

收到 Facebook 官方团队的反馈,看来这是设计使然。在任何带有 Pageview 事件的后续调用中,都不会在有效负载中发送自定义数据。

于 2018-01-10T01:40:59.643 回答