更新同意后未设置任何分析 cookie

No analytics cookies is set upon a consent was updated

我正在使用 Google 标签管理器和一个引用默认 Google Analytics 脚本的标签。我的解决方案基于这些资源中的信息:

代码简单(commit):

index.html:定义gtag()并将拒绝设置为所有存储的默认值

  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag() { window.dataLayer.push(arguments); }
    gtag('consent', 'default', {
      ad_storage: 'denied',
      analytics_storage: 'denied',
      personalization_storage: 'denied',
      functionality_storage: 'granted',
      security_storage: 'granted',
      wait_for_update: 400,
    });

然后从 localStorage 加载用户配置并调用更新:

handleCookies(preferences) {
  console.log('handleCookies callback');
  gtag('consent', 'update', {
    ad_storage: preferences.ad,
    analytics_storage: preferences.analytics,
    personalization_storage: preferences.personalization,
  });
  console.log(window.dataLayer);
},

到目前为止一切顺利,因为我看到事件队列已在 dataLayer:

中更新

设置同意后,我预计现在将为 Google 分析设置 cookie。但是他们不见了。我犯了什么愚蠢的错误?

根据您的屏幕截图,gtm.js 在同意模式的 update 之前执行,因此综合浏览量继续被发送到 Google Analytics 被拒绝。

更新必须在 gtm.js

之前进行

您的 update 命令在浏览器呈现 GTM 容器片段之后发生,因此仅在处理完所有页面触发器后才处理更新命令。

您需要延迟您的代码以在稍后触发时触发(例如 DOM 就绪)或更改脚本的工作方式以更快地推送 'update' 命令。

或者,您可以使用模板库中的意见征求模式标签模板通过 GTM 协调一切。该模板使用 GTM 的同步同意 API,确保立即应用同意状态,而不是仅在处理 dataLayer 队列后才应用。

作为我自己愚蠢的未来的笔记,我会在那里写一些发现和笔记。

  1. 听从 Simo 的建议,尽管如果没有事先的主题定位可能不容易理解
  2. 定义 gtag() 函数并在 gtag 初始化之前设置默认设置
  3. 第一次访问应设置 deniedad_storageanalytics_storagepersonalization_storage
  4. 如果是回访,最好根据用户的内容设置默认值
  5. 但是嘿,您可以稍后发送 update 消息,即使是在 Vue 组件的 mounted 方法中。 wait_for_update 中的值可能在那里有用,因为您想使用 cookie 初始化 Google Analytics,而不是没有它们。
  6. Google Analytics 发送 https://www.google-analytics.com/g/collect 请求。查看负载,缺少 cookie 同意时发送 gcs: G100
  7. 用户接受 cookie 后,在 update 消息中发送新的同意值。值是 denied / granted,不是 true / false,你这个笨蛋!
  8. 此时已创建 GA cookie。但是它们没有发送到服务器,抱歉,轮到你了。那么,如果用户执行某些跟踪操作,例如滚动页面,collect 将与 gcs: G111 一起再次发送。我有点惊讶请求和响应都不包含任何 cookie。为什么?
  9. 一旦我重新加载页面并且默认授予所有存储空间,gcs: G111 仍然存在于 GA 的收集中,但页面的现有 cookie 不存在于请求中。为什么?