了解如何将 Web Vitals 数据发送到 Google Analytics 4 媒体资源,并将数据导出以在 BigQuery 和 Looker Studio 中进行分析。
Google 提供了许多工具——Search Console、PageSpeed Insights (PSI) 和 Chrome 用户体验报告 (CrUX)——让开发者可以了解他们的网站在 Core Web Vitals 指标方面的实际用户表现 在实际应用中。
这些工具非常棒,因为它们为您提供了网站真实用户性能的概览,并且无需任何设置即可开始使用。
但是,有一些关键原因说明您不应仅依靠这些工具来衡量网站的性能
- 基于 CrUX 的工具按月度或之前 28 天的周期报告数据。这意味着您需要等待很长时间才能看到进行任何更改后的结果。
- 基于 CrUX 的工具只能按有限数量的维度进行细分,例如国家/地区、连接类型和设备类别(桌面设备或移动设备)。您无法按特定于您业务的维度(例如:参与用户、特定实验组中的用户等)对数据进行切片。
- 基于 CrUX 的工具可以告诉您性能如何,但无法告诉您原因。借助分析工具,您可以发送其他数据来帮助您跟踪和调试问题。
由于这些原因,我们建议所有网站所有者使用其现有的分析工具监控 Core Web Vitals 指标。这篇文章解释了如何使用 Google 提供的免费工具来做到这一点。
一旦您完成所有设置,您将能够创建像这样的信息中心
如果您想要查看此处概述的所有步骤的可视化概览,请查看我们在 Google I/O '21 上的演讲
衡量
一直以来都可以使用 Google Analytics 通过自定义指标来衡量性能,但 Google Analytics 4 (GA4) 中有一些新功能尤其会让开发者感到兴奋。
- 零配置、自定义事件参数
- 免费的 BigQuery 导出,因此您可以使用 SQL 查询您的数据
虽然 Google Analytics Web 界面确实具有强大的分析工具,但使用您可能已经熟悉的查询语言访问原始事件数据的强大功能和灵活性是难以匹敌的。
要开始使用 Google Analytics 4 和 BigQuery 衡量 Core Web Vitals,您需要执行三件事
- 创建 Google Analytics 4 媒体资源 和 BigQuery 项目。
- 在您的 Google Analytics 媒体资源配置中启用 BigQuery 导出,这样您收到的所有数据都将自动填充到您的 BigQuery 项目表中。
- 将 web-vitals JavaScript 库添加到您的网站,这样您就可以衡量 Core Web Vitals 指标并将数据发送到 Google Analytics 4,包括归因数据。
分析
完成所有设置后,您应该会在 BigQuery 界面中看到事件数据正在填充,并且您应该能够像这样查询数据
SELECT * FROM `my_project_id.analytics_XXXXX.events_*`
WHERE event_name IN ('LCP', 'INP', 'CLS')
以下是该查询结果的预览
查询 Web Vitals 数据
在开始查询 Web Vitals 事件数据之前,务必了解数据的聚合方式。
最重要的是要理解,在某些情况下,同一指标在同一页面上可能会收到多个事件。如果指标值发生变化并报告了更新后的值(CLS 的常见情况),则可能会发生这种情况。
对于 Web Vitals 事件,最后发送的值始终是最准确的值,因此在执行任何分析之前,务必仅筛选这些值。web-vitals JavaScript 库提供的用于将数据发送到 Google Analytics 4 的代码片段包括为每个指标发送唯一 ID,因此您可以使用以下查询将结果限制为每个指标 ID 最后收到的值
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
请注意,本文中引用的所有其他查询都将从此子查询开始。
示例查询
接下来的几个部分将展示一些您可能想要运行的常见 Web Vitals 查询示例。
整个网站的 LCP、INP 和 CLS 百分位数 75% (p75)
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
metric_name,
APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS p75,
COUNT(1) as count
FROM (
SELECT
metric_name,
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
)
GROUP BY 1
所有 LCP 单个值,从最高到最低
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'LCP'
ORDER BY metric_value DESC
10 个最受欢迎页面的 LCP 分数 (p75)
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
page_path,
APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS LCP,
COUNT(1) as count
FROM (
SELECT
REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'LCP'
)
GROUP BY 1
ORDER BY count DESC
LIMIT 10
CLS 最差的 10 个页面 (p75)
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
page_path,
APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
COUNT(1) as count
FROM (
SELECT
REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'CLS'
)
GROUP BY 1
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC
LIMIT 10
调试
之前的查询显示了如何查询 Web Vitals 指标数据,这有助于了解您当前的性能以及性能随时间变化的趋势。但是,如果您的性能比预期差,但不确定原因,该怎么办?
如果您无法采取行动并解决问题,那么知道您的分数是多少并没有帮助。
在实际应用中调试性能解释了如何使用您的分析数据发送其他调试信息。如果您按照该帖子中详述的说明进行操作,您应该也会在 BigQuery 中看到该调试信息。
示例查询
以下查询显示了如何使用 debug_target
事件参数来帮助识别性能问题的根本原因。
导致 CLS 的主要元素
debug_target
是一个 CSS 选择器字符串,它对应于页面上与指标值最相关的元素。
对于 CLS,debug_target
表示导致 CLS 值的最大布局偏移中的最大元素。如果没有元素偏移,则 debug_target
值将为 null
。
以下查询将按百分位数 75% 的 CLS 从最差到最好列出页面,并按 debug_target
分组
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
page_path,
debug_target,
APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
COUNT(1) as count
FROM (
SELECT
REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = "debug_target") as debug_target,
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
*
FROM web_vitals_events
WHERE metric_name = 'CLS'
)
GROUP BY 1, 2
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC
了解页面上的哪些元素正在偏移应该可以更容易地识别和修复问题的根本原因。
请记住,此处报告的元素可能与您在本地调试页面时看到的偏移元素不同,这就是为什么首先捕获此数据如此重要。修复您没有意识到的问题非常困难!
调试其他指标
之前的查询显示了 CLS 指标的结果,但完全相同的技术可用于报告 LCP 和 INP 的调试目标。只需将 where 子句替换为要调试的相关指标即可
WHERE metric_name = 'INP'
WHERE metric_name = 'LCP'
同样,您可以参考在实际应用中调试性能以获取有关如何收集和发送每个 Core Web Vitals 指标的调试信息的说明。
可视化
仅查看查询结果可能很难获得见解。例如,以下查询列出了数据集中 LCP 的每日百分位数 75% 值。
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id') ORDER BY (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'metric_start_time') DESC
) = 1 AS is_last_received_value
FROM `bigquery_project_id.analytics_XXXXX.events_*`
WHERE event_name in ('CLS', 'INP', 'LCP') AND
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
) WHERE is_last_received_value
)
# Main query logic
SELECT
event_date,
metric_name,
APPROX_QUANTILES(ROUND(metric_value, 2), 100)[OFFSET(75)] AS p75
FROM
(
SELECT
event_date,
metric_name,
ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value'), 3) AS metric_value
FROM web_vitals_events
WHERE
metric_name = 'LCP'
)
GROUP BY
1, 2
ORDER BY event_date
从这些查询结果来看,仅通过查看数据很难识别趋势或异常值。
在这种情况下,可视化数据可以帮助您更快地获得见解。
在 Looker Studio 中可视化查询结果
BigQuery 提供了一种通过 Data Studio 可视化任何查询结果的快速方法。Looker Studio 是一款免费使用的数据可视化和信息中心工具。要可视化您的查询结果,在 BigQuery UI 中运行查询后,单击探索数据按钮并选择使用 Looker Studio 探索。
这将创建一个从 BigQuery 到 Looker Studio 探索视图的直接链接。在此视图中,您可以选择要可视化的字段、选择图表类型、设置过滤器以及创建临时图表以进行快速可视化分析。从之前的查询结果中,您可以创建此折线图以查看 LCP 值随时间变化的趋势
通过 BigQuery 和 Looker Studio 之间的这种直接链接,您可以从任何查询创建快速图表并进行可视化分析。但是,如果您想进行其他分析,您可能希望查看交互式信息中心中的多个图表,以获得更全面的视图或能够向下钻取数据。拥有方便的信息中心意味着您不必每次想要分析指标时都手动编写查询和生成图表。
您可以使用 原生 BigQuery 连接器在 Looker Studio 中创建信息中心。为此,请导航到 datastudio.google.com,创建一个新的数据源,选择 BigQuery 连接器,然后选择您要使用的数据集
物化 Web Vitals 数据
在像之前描述的那样创建 Web Vitals 事件数据的信息中心时,直接使用 Google Analytics 4 导出数据集效率不高。由于 GA4 数据的结构以及 Web Vitals 指标所需的预处理,您的查询部分最终会多次运行。这会产生两个问题:信息中心性能和 BigQuery 成本。
您可以免费使用 BigQuery 沙盒模式。借助 BigQuery 的 免费使用层级,每月处理的首个 1 TB 查询数据是免费的。对于本文中讨论的分析方法,除非您使用非常大的数据集或经常大量查询数据集,否则您应该能够每月保持在此免费限额内。但是,如果您有高流量网站并希望使用快速交互式信息中心定期监控不同的指标,我们建议您在利用 BigQuery 效率功能(如分区、聚类和缓存)的同时,预处理和物化您的 Web Vitals 数据。
以下脚本将预处理您的 BigQuery 数据(源表)并创建一个物化表(目标表)。当将此查询用于您自己的数据集时,您可能还需要为源表定义日期范围,以减少处理的数据量。
# Materialize Web Vitals metrics from GA4 event export data
# Replace target table name
CREATE OR REPLACE TABLE bigquery_project_id.ga4_demo_dev.web_vitals_summary
PARTITION BY DATE(event_timestamp)
CLUSTER BY metric_name
AS
SELECT
ga_session_id,
IF(
EXISTS(SELECT 1 FROM UNNEST(events) AS e WHERE e.event_name = 'first_visit'),
'New user',
'Returning user') AS user_type,
IF(
(SELECT MAX(session_engaged) FROM UNNEST(events)) > 0, 'Engaged', 'Not engaged')
AS session_engagement,
evt.* EXCEPT (session_engaged, event_name),
event_name AS metric_name,
FORMAT_TIMESTAMP('%Y%m%d', event_timestamp) AS event_date
FROM
(
SELECT
ga_session_id,
ARRAY_AGG(custom_event) AS events
FROM
(
SELECT
ga_session_id,
STRUCT(
country,
device_category,
device_os,
traffic_medium,
traffic_name,
traffic_source,
page_path,
debug_target,
event_timestamp,
event_name,
metric_id,
IF(event_name = 'LCP', metric_value / 1000, metric_value) AS metric_value,
user_pseudo_id,
session_engaged,
session_revenue) AS custom_event
FROM
(
SELECT
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
AS ga_session_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
AS metric_id,
ANY_VALUE(device.category) AS device_category,
ANY_VALUE(device.operating_system) AS device_os,
ANY_VALUE(traffic_source.medium) AS traffic_medium,
ANY_VALUE(traffic_source.name) AS traffic_name,
ANY_VALUE(traffic_source.source) AS traffic_source,
ANY_VALUE(
REGEXP_SUBSTR(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
r'^[^?]+')) AS page_path,
ANY_VALUE(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'debug_target'))
AS debug_target,
ANY_VALUE(user_pseudo_id) AS user_pseudo_id,
ANY_VALUE(geo.country) AS country,
ANY_VALUE(event_name) AS event_name,
SUM(ecommerce.purchase_revenue) AS session_revenue,
MAX(
(
SELECT
COALESCE(
value.double_value, value.int_value, CAST(value.string_value AS NUMERIC))
FROM UNNEST(event_params)
WHERE key = 'session_engaged'
)) AS session_engaged,
TIMESTAMP_MICROS(MAX(event_timestamp)) AS event_timestamp,
MAX(
(
SELECT COALESCE(value.double_value, value.int_value)
FROM UNNEST(event_params)
WHERE key = 'metric_value'
)) AS metric_value,
FROM
# Replace source table name
`bigquery_project_id.analytics_XXXXX.events_*`
WHERE
event_name IN ('LCP', 'INP', 'CLS', 'first_visit', 'purchase')
GROUP BY
1, 2
)
)
WHERE
ga_session_id IS NOT NULL
GROUP BY ga_session_id
)
CROSS JOIN UNNEST(events) AS evt
WHERE evt.event_name NOT IN ('first_visit', 'purchase');
此物化数据集具有多个优点
- 数据结构被展平,更易于查询。
- 它仅保留原始 GA4 数据集中的 Web Vitals 事件。
- 会话 ID、用户类型(新用户与回访用户)和会话互动信息直接在列中可用。
- 该表按日期进行分区,并按指标名称进行聚类。这通常会减少每次查询处理的数据量。
- 由于您不需要使用通配符来查询此表,因此查询结果可以缓存长达 24 小时。这降低了重复相同查询的成本。
- 如果您使用 BigQuery BI 引擎,您可以在此表上运行优化的 SQL 函数和运算符。
您可以直接从 BigQuery UI 中查询此物化表,或者在 Looker Studio 中使用 BigQuery 连接器。
使用 Web Vitals 连接器
由于从头开始制作信息中心非常耗时,因此我们开发了一个打包解决方案,将为您创建一个模板信息中心。首先,请确保您已使用之前的查询物化了您的 Web Vitals 表。然后使用此链接访问 Looker Studio 的 Web Vitals 连接器:goo.gle/web-vitals-connector
在提供一次性授权后,您应该会看到以下配置屏幕
提供物化的 BigQuery 表 ID(即目标表)和您的 BigQuery 结算项目 ID。单击连接后,Looker Studio 将创建一个新的模板化信息中心并将您的数据与之关联。您可以根据需要编辑、修改和共享信息中心。如果您创建一次信息中心,则不必再次访问连接器链接,除非您想从不同的数据集创建多个信息中心。
导航信息中心
当您导航信息中心时,您可以在摘要选项卡中看到 Web Vitals 指标的每日趋势以及网站的一些使用情况信息,如用户和会话。
在用户分析选项卡中,您可以选择一个指标,然后按不同的使用情况和业务指标获取指标百分位数以及用户数量的细分。
页面路径分析选项卡将帮助您识别网站上的问题区域。在这里,您可以选择一个指标来查看概览。但您还可以看到所有页面路径的散点图,y 轴为百分位数,x 轴为记录数。散点图可以帮助识别指标值低于预期的页面。一旦您使用页面路径表的散点图选择页面,您可以通过查看调试目标表来进一步向下钻取问题区域。
收入分析选项卡是如何在同一位置监控您的业务和绩效指标的示例。本节绘制了用户进行购买的所有会话。您可以比较特定会话期间获得的收入与用户体验。
高级用法
随着您越来越熟悉数据集,您可以编辑信息中心并添加自己的图表以进行更丰富和更有针对性的分析。为了使信息中心更有用,您可以采取以下步骤
- 在 BigQuery 中设置计划查询以获取更新的数据。我们之前运行的物化查询仅获取了您当时数据的快照。如果您想使用新数据保持信息中心更新,您可以运行计划查询,该查询将每天运行并将新数据附加到您的物化表。
- 加入第一方数据(例如 CRM)以获得业务洞察。在物化表中,您可以添加
user_id
作为单独的列。这将使您可以加入您的第一方数据。如果您的第一方数据尚未在 BigQuery 中,您可以加载数据或使用联合数据源。 - 在您发送到 Google Analytics 的数据中报告您的网站或应用版本作为参数,并将其作为列添加到物化表中。然后,您可以将该版本数据添加为图表中的维度,以便更轻松地查看版本更改如何影响性能。
- 如果您预计通过直接查询或信息中心大量使用数据集,您可以尝试使用BigQuery BI Engine的付费版本。
摘要
这篇文章介绍了如何使用 Google Analytics 4 和 BigQuery 衡量和调试在实际应用中收集的真实用户数据的性能的基础知识。它还解释了如何使用 Looker Studio 和 Web Vitals 连接器构建自动化报告和信息中心,以尽可能轻松地可视化数据。
这篇文章的一些主要要点
- 使用真实用户数据衡量性能对于了解、调试和优化您的网站至关重要。
- 当您的性能指标和业务指标在同一系统中时,您可以获得更深入的见解。Google Analytics 和 BigQuery 使之成为可能。
- 原始 Google Analytics 数据的 BigQuery 导出为您提供了使用您可能已经熟悉的查询语言进行深入自定义分析的无限潜力。
- Google 拥有许多 API 和可视化工具(如 Looker Studio),让您可以自由地按照您希望的方式构建报告。