如何使用 Google Tag Manager 和 Google Analytics 设置表单跟踪分析
已发表: 2022-04-12转化率是衡量营销效率的最简单同时也是最重要的衡量标准之一。 它显示有多少用户完成了目标操作:购买、注册电子邮件、请求电话等。为了记录和分析电子商务销售,我们有 Google Analytics,它相对容易配置。 然而,需要更多的努力来跟踪网站上提交的表单。
这是因为表单碰巧属于不同的类型,并且使用不同的技术将数据发送到服务器。 数据发送成功后,会更新一些表单字段。 其他显示一个弹出窗口。 第三种类型将用户重定向到感谢页面。 表单跟踪的方法取决于所使用的技术。
在本文中,我们将告诉您如何以不同的方式收集表单数据并将其传输到 Google Analytics。
目录
- 方法 1. 单独的感谢页面
- 方法 2. 在 Google Tag Manager 中提交表单触发器
- 步骤 1. 激活表单变量
- 步骤 2. 调整触发器
- Step 3. 检查触发器是否有效
- 步骤 4. 创建标签
- 第 5 步。在 Google Analytics(分析)中设置您的目标
- 方法 3. Google Tag Manager 中的元素可用性触发器
- 方法 4. 跟踪使用 AJAX 的表单
- 第 1 步。创建标签以检查表单的工作方式
- 步骤 2. 创建数据层变量
- 步骤 3. 创建触发器
- 方法 5. DataLayer 事件作为触发器
- 用户填写表单的时间
方法 1. 单独的感谢页面
如果用户在完成表单后被重定向到具有不同 URL 的单独页面,则跟踪对该 URL 的访问是跟踪表单提交的最简单方法。 在 Google Analytics 中创建一个类型为“Landing Page”的目标就足够了。
假设您要跟踪网络研讨会的注册情况。 注册成功后的感谢页面如下所示:https://www.site.com/registration/thankyou
在管理面板的View Settings中的 Targets 下,点击Target,然后点击Custom 。 指定目标名称,选择目标类型,输入感谢页面地址:

需要考虑的重要事项:感谢页面的 URL 应该是唯一的——也就是说,网站上应该只有一个页面具有这样的地址,并且用户应该无法在不填写表格的情况下访问该页面。 否则,Google Analytics(分析)可能会记录有关您实现目标的不准确数据。


最佳 OWOX BI 营销案例
下载方法 2. 在 Google Tag Manager 中提交表单触发器
如果您的程序员通过提交按钮正确配置了表单的数据传输,那么对于表单跟踪提交,您可以使用内置的 Google 跟踪代码管理器触发器。 从网上的评论来看,这种情况很少遇到,但值得一试。
使用此方法,当用户填写并发送表单时,触发器会向 dataLayer 数组发送 gtm.formSubmit 事件。
注意:在进入设置之前,请确保在 Google 跟踪代码管理器中为网站上的所有页面启用了页面浏览标记。
步骤 1. 激活表单变量
为此,在 GTM 中打开变量菜单,单击配置,然后选择表单部分中的所有变量:

步骤 2. 调整触发器
您需要一个表单 ID 或表单类属性来创建触发器。 您可以通过右键单击表单并单击 Firefox 中的浏览项目或 Chrome 中的查看代码来在 HTML 代码中查看它们:

在我们的示例中,表单 id 是 send-request-form,我们将在配置触发器时使用它。
转到Triggers菜单,单击New ,打开Trigger Settings ,然后选择Submit Form :

在打开的窗口中,您会看到两个复选框:
等待标签- 如果启用此选项,则在与其关联的所有标签都被激活或您指定的时间到期之前,不会发送表单。
检查验证- 最好启用此选项。 否则,即使用户没有填写必填字段,触发器也会触发。
激活错误检查后,会出现其他设置。 如果您启用触发器,请指定包含您的表单的页面的 URL。 如果您激活触发器,请指定我们上面提到的表单 ID:

为触发器想一个方便且易于理解的名称,例如提交请求,然后保存。
Step 3. 检查触发器是否有效
在容器中发布更改之前,请使用 Google 跟踪代码管理器中的预览模式。 打开包含表单的页面,填写并点击发送。 在调试控制台中,应该会出现一个 gtm.formSubmit 事件。

如果此事件未出现,则此跟踪方法将不适合您。 在这种情况下,请尝试本文中描述的其他方法之一。
如果事件确实出现了,还需要再进行一次测试,以检查触发器是否正常工作。 打开一个表格,将一些必填字段留空,然后提交表格。 如果 gtm.formSubmit 事件再次出现在调试控制台中,则内置触发器无法正常工作,无法帮助您。 如果事件没有转移,那就太好了! 转到下一步。
步骤 4. 创建标签
现在您需要创建一个标签,该标签将向 Google Analytics 发送表单已发送的信息。 为此,请转到标签菜单,单击新建,打开标签配置,然后选择Google Analytics - Universal Analytics。
为清楚起见,您可以将标签命名为与触发器相同的名称。 接下来,填写以下字段:
- 标记类型 - 选择 {{Google Analytics Settings}}
- 曲目类型 - 选择“事件”
- 类别——为了方便起见,与标签和触发器相同
- 行动 - 发送
- 标签 - 例如,{{Form ID}})
- 非交互——留下“假”
如果要激活标签,请选择您在步骤 3 中创建的触发器,然后单击Save :

准备好了! 在使用 Google Tag Manager 预览模式或使用 Google Analytics 中的实时事件报告提交表单时,您可以检查生成的标签是如何工作的。
第 5 步。在 Google Analytics(分析)中设置您的目标
发布包含更改的容器后,您需要在 Google Analytics(分析)中设置目标以将提交表单视为转化。 为此,请在 Google Analytics(分析)视图设置中添加您自己的新目标。 就像您在 Google 跟踪代码管理器中配置代码一样,选择事件类型并填写类别、操作和快捷方式字段:

保存目标。 完毕。 您已设置表单跟踪,而无需更改您网站上的任何代码!
方法 3. Google Tag Manager 中的元素可用性触发器
如果在发送表单后网站上弹出一个窗口并显示感谢或有关成功提交的消息,您可以尝试另一个内置的 GTM 触发器。 它在屏幕上出现特定项目时触发(在我们的例子中是一个弹出窗口),并将 gtm.elementVisibility 事件分派给 dataLayer。
要配置此触发器,您必须知道被监控项的 CSS 选择器。 要查找此选择器,请右键单击窗口并选择查看代码。 您正在寻找以下行:

要复制 CSS 选择器,请右键单击该行并选择复制 - 复制选择器:

在我们的示例中,选择器如下所示:#webinar_marketing_automation > div。
然后通过选择Element Visibility类型创建一个新触发器:

填写以下字段:
- 触发器名称 - 例如,“获取网络研讨会记录”
- 选择方法——CSS选择器
- 元素选择器 - 插入您从弹出窗口的 HTML 代码中复制的值。
- 触发规则 – 如果页面上有一个表单,请保留“每页一次”选项。 如果有多个表单并弹出一条消息,您可以选择“每个元素一次”。

- 然后选中“注册 DOM 更改”框。
- 触发激活条件——通过选择“一些可见性事件”,您可以指定弹出消息或文本出现的页面。
- 保存触发器。

创建元素可用性触发器后,您必须调整方法 2 中详细描述的相同设置:
- 向 GTM 添加一个新标签,它将表单提交数据发送到 Google Analytics 并将创建的触发器附加到它。
- 提交表单时预览标签的工作方式。
- 在 Google Analytics 中,设置事件目标以跟踪转化。
方法 4. 跟踪使用 AJAX 的表单
如果您网站上的表单使用 AJAX 技术,则数据会在后台从浏览器传输到服务器,并且页面不会重新加载。 要配置 AJAX 表单提交的跟踪,您可以使用 Lunametrics 中的此脚本:
<script id="gtm-jq-ajax-listen" type="text/javascript"> (function() { 'use strict' var $; var n = 0; init(); function init(n) { // Ensure jQuery is available before anything if (typeof jQuery !== 'undefined') { // Define our $ shortcut locally $ = jQuery; bindToAjax(); // Check for up to 10 seconds } else if (n < 20) { n++; setTimeout(init, 500); } } function bindToAjax() { $(document).bind('ajaxComplete', function(evt, jqXhr, opts) { // Create a fake element for magically simple URL parsing var fullUrl = document.createElement('a'); fullUrl.href = opts.url; // IE9+ strips the leading slash from a.pathname because who wants to get home on time on Friday anyways var pathname = fullUrl.pathname[0] === '/' ? fullUrl.pathname : '/' + fullUrl.pathname; // Manually remove the leading question mark, if there is one var queryString = fullUrl.search[0] === '?' ? fullUrl.search.slice(1) : fullUrl.search; // Turn params and headers into objects for easier reference var queryParameters = objMap(queryString, '&', '=', true); var headers = objMap(jqXhr.getAllResponseHeaders(), '\n', ':'); // Blindly push to the dataLayer because this fires within GTM dataLayer.push({ 'event': 'ajaxComplete', 'attributes': { // Return empty strings to prevent accidental inheritance of old data 'type': opts.type || '', 'url': fullUrl.href || '', 'queryParameters': queryParameters, 'pathname': pathname || '', 'hostname': fullUrl.hostname || '', 'protocol': fullUrl.protocol || '', 'fragment': fullUrl.hash || '', 'statusCode': jqXhr.status || '', 'statusText': jqXhr.statusText || '', 'headers': headers, 'timestamp': evt.timeStamp || '', 'contentType': opts.contentType || '', // Defer to jQuery's handling of the response 'response': (jqXhr.responseJSON || jqXhr.responseXML || jqXhr.responseText || '') } }); }); } function objMap(data, delim, spl, decode) { var obj = {}; // If one of our parameters is missing, return an empty object if (!data || !delim || !spl) { return {}; } var arr = data.split(delim); var i; if (arr) { for (i = 0; i < arr.length; i++) { // If the decode flag is present, URL decode the set var item = decode ? decodeURIComponent(arr[i]) : arr[i]; var pair = item.split(spl); var key = trim_(pair[0]); var value = trim_(pair[1]); if (key && value) { obj[key] = value; } } } return obj; } // Basic .trim() polyfill function trim_(str) { if (str) { return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } } })(); /* * v0.1.0 * Created by the Google Analytics consultants at http://lunametrics15.staging.wpengine.com * Written by @notdanwilkerson * Documentation: http://lunametrics15.staging.wpengine.com/blog/2015/08/27/ajax-event-listener-google-tag-manager/ * Licensed under the Creative Commons 4.0 Attribution Public License */ </script>
<script id="gtm-jq-ajax-listen" type="text/javascript"> (function() { 'use strict' var $; var n = 0; init(); function init(n) { // Ensure jQuery is available before anything if (typeof jQuery !== 'undefined') { // Define our $ shortcut locally $ = jQuery; bindToAjax(); // Check for up to 10 seconds } else if (n < 20) { n++; setTimeout(init, 500); } } function bindToAjax() { $(document).bind('ajaxComplete', function(evt, jqXhr, opts) { // Create a fake element for magically simple URL parsing var fullUrl = document.createElement('a'); fullUrl.href = opts.url; // IE9+ strips the leading slash from a.pathname because who wants to get home on time on Friday anyways var pathname = fullUrl.pathname[0] === '/' ? fullUrl.pathname : '/' + fullUrl.pathname; // Manually remove the leading question mark, if there is one var queryString = fullUrl.search[0] === '?' ? fullUrl.search.slice(1) : fullUrl.search; // Turn params and headers into objects for easier reference var queryParameters = objMap(queryString, '&', '=', true); var headers = objMap(jqXhr.getAllResponseHeaders(), '\n', ':'); // Blindly push to the dataLayer because this fires within GTM dataLayer.push({ 'event': 'ajaxComplete', 'attributes': { // Return empty strings to prevent accidental inheritance of old data 'type': opts.type || '', 'url': fullUrl.href || '', 'queryParameters': queryParameters, 'pathname': pathname || '', 'hostname': fullUrl.hostname || '', 'protocol': fullUrl.protocol || '', 'fragment': fullUrl.hash || '', 'statusCode': jqXhr.status || '', 'statusText': jqXhr.statusText || '', 'headers': headers, 'timestamp': evt.timeStamp || '', 'contentType': opts.contentType || '', // Defer to jQuery's handling of the response 'response': (jqXhr.responseJSON || jqXhr.responseXML || jqXhr.responseText || '') } }); }); } function objMap(data, delim, spl, decode) { var obj = {}; // If one of our parameters is missing, return an empty object if (!data || !delim || !spl) { return {}; } var arr = data.split(delim); var i; if (arr) { for (i = 0; i < arr.length; i++) { // If the decode flag is present, URL decode the set var item = decode ? decodeURIComponent(arr[i]) : arr[i]; var pair = item.split(spl); var key = trim_(pair[0]); var value = trim_(pair[1]); if (key && value) { obj[key] = value; } } } return obj; } // Basic .trim() polyfill function trim_(str) { if (str) { return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } } })(); /* * v0.1.0 * Created by the Google Analytics consultants at http://lunametrics15.staging.wpengine.com * Written by @notdanwilkerson * Documentation: http://lunametrics15.staging.wpengine.com/blog/2015/08/27/ajax-event-listener-google-tag-manager/ * Licensed under the Creative Commons 4.0 Attribution Public License */ </script> 此代码检查您的表单是否真的使用 AJAX,然后在 Google 跟踪代码管理器中创建变量和触发器。

第 1 步。创建标签以检查表单的工作方式
在 Google Tag Manager 中,打开Tags ,点击New ,点击Tag Configuration ,然后选择Custom HTML 。 复制上面的代码并将其粘贴到文本框中。 将所有页面指定为触发器:

然后开启GTM预览,打开表单页面,填写表单,提交。

如果在调试控制台中出现 ajaxComplete 事件(如上面的屏幕截图所示),那么您的表单使用 AJAX,并且这种跟踪方法适合您。 在这种情况下,请进一步阅读。
步骤 2. 创建数据层变量
如果您在预览控制台中单击 ajaxComplete 事件,然后打开 Data Layer 选项卡,您将看到在提交表单后将哪些信息传递到数据层数组。
我们对此代码中的响应行感兴趣; 它包含说明表单已成功提交的文本:

此行可用于在 Google 跟踪代码管理器中创建变量和触发器。 在 GTM 中打开变量部分,单击创建,然后在变量配置屏幕上,选择数据层变量。 在 Data Layer Variable Name 字段中,写入 attributes.response(可以将两个变量命名为相同的东西)并保存设置。

为什么输入attributes.response而不是response ? 因为 attributes 是一个包含响应键及其值的对象。 通过这样做,我们将 GTM 指向我们感兴趣的数据的确切路径。
创建变量后,需要对其进行检查。 为此,请在预览模式下提交表单。 单击 ajaxComplete 事件并在 Google 跟踪代码管理器中打开变量选项卡。 如果您看到 attributes.response 变量和有关成功发送表单的文本,则表示您已正确配置所有内容。
步骤 3. 创建触发器
在触发器配置部分中,单击创建,然后单击触发器配置并选择用户事件类型。 在事件名称字段中指定 ajaxComplete。 然后作为激活触发器的条件,选择一些自定义事件并注册一个条件: attributes.response变量包含{输入您的自定义文本关于成功发送表单}。

之后,剩下的就是:
- 向 GTM 添加新的事件跟踪代码,将表单提交信息发送到 Google Analytics 并将创建的触发器附加到它。
- 在提交表单时使用预览模式检查标签的工作方式。
- 设置事件目标以跟踪 Google Analytics 中的转化。
我们在上面的方法 2. 在 Google 跟踪代码管理器中发送表单触发器部分详细描述了这些设置。
方法 5. DataLayer 事件作为触发器
在我们看来,使用 dataLayer .push 方法跟踪表单是最可靠和通用的解决方案。 唯一的缺点是,如果您不了解代码,则需要开发人员的帮助。
为开发人员准备技术规范
成功提交表单后,在dataLayer中列出您要传输的设置。 要求您的开发人员将此代码添加到您要监视的表单的所有页面:
数据层.push({
'事件':'表格',
“变量”:“值”
})
在哪里:
- 事件是事件的名称。 您可以将其替换为您方便的任何活动。
- 变量是您要与事件一起传输的所有变量的集合。
在您的程序员为所有表单配置 dataLayer.push 方法后,您可以检查它是如何工作的。 为此,请在 Google 跟踪代码管理器中包含预览并在您的网站上填写表格。 在调试控制台中,应该有一个新事件(在我们的示例中,它称为 OWOX)。 单击事件并转到 dataLayer 选项卡时,您将看到传输到数据数组的所有参数:

在上面截图中的事件示例中(从博客下载 PDF 文件),我们考虑如何使用 GTM 配置跟踪。
首先,创建所有必需的用户变量:eventCategory、eventAction、eventLabel 等。然后在 User-Defined Variables 部分选择变量类型并在大括号中输入变量名称:{{eventCategory}}:

接下来,创建自定义事件类型的触发器。 在设置中,指定事件名称并将触发器设置为在所有自定义事件上触发:

然后创建一个将事件转发到 Google Analytics 的标签。 将标签类型设置为 Google Analytics – Universal Analytics,并将跟踪类型设置为事件。
此外,填写以下字段:
- 类别 – {{eventCategory}}
- 动作 - {{eventAction}}
- 标签 - {{eventLabel}}
接下来,选择一个变量 {{Google Analytics settings}} 和您在上一步中创建的触发器:

全部都准备好了。 剩下的就是检查标签是否在 GTM 预览模式和实时谷歌分析报告中工作。
用户填写表单的时间
现在您可以了解有多少用户已成功完成表单,这将有助于了解未完成表单的用户遇到了哪些问题。
您的开发人员需要将表单分析所需的所有参数的名称和值添加到 dataLayer。 这将帮助您跟踪:
- 从页面打开到字段激活的时间
- 从场激活到场停用的时间
- 从第一个字段激活到第一次提交表单的时间
- 从激活第一个字段到成功提交表单的时间
- 从第一个字段激活到表单提交失败的时间
- 是时候从服务器获得关于成功提交表单的响应了
- 是时候从服务器获取有关未成功提交表单的响应了
- 从表单激活到用户离开表单(未成功提交)的时间
一旦您在 Google Analytics 中设置了这些数据的收集,您就可以将该数据导入 Google BigQuery——例如,使用 OWOX BI。 然后,您可以使用免费的 OWOX BI BigQuery 报告插件在 Google 表格中构建任何表单分析报告。
这些报告将帮助您发现和解决表单可用性方面的问题,从而提高您的转化率。
以下是此类报告的一些示例以及他们可以回答的问题:
1. 用户在与哪些表单域交互时最常遇到错误?

2. 用户填写表单需要多长时间?

3. 用户填写表单的时间是多少,取决于什么?

PS 如果您需要帮助设置表单分析和为您的业务创建自定义指标系统,请发送电子邮件至[email protected] 或填写 OWOX 网站上的联系表。
