Đo lường và gỡ lỗi hiệu suất bằng Google Analytics 4 và BigQuery

Tìm hiểu cách gửi dữ liệu Web Vitals đến tài sản Google Analytics 4 và xuất dữ liệu để phân tích trong BigQuery và Looker Studio.

Google cung cấp một số công cụ (Search Console, PageSpeed Insights (PSI) và Báo cáo trải nghiệm người dùng trên Chrome (CrUX)) để nhà phát triển xem hiệu suất của trang web so với các chỉ số Core Web Vitals đối với người dùng thực tế trong thực tế.

Những công cụ này rất hữu ích vì cung cấp cho bạn thông tin tổng quan về hiệu suất của trang web đối với người dùng thực tế và bạn hoàn toàn không cần thiết lập để bắt đầu sử dụng.

Tuy nhiên, có một vài lý do quan trọng khiến bạn không nên chỉ dựa vào các công cụ này để đo lường hiệu suất của trang web:

  • Các công cụ dựa trên CrUX báo cáo dữ liệu theo tháng hoặc theo khoảng thời gian 28 ngày trước đó. Điều này có nghĩa là bạn sẽ phải đợi một thời gian dài sau khi thực hiện thay đổi thì mới có thể thấy kết quả.
  • Bạn chỉ có thể phân đoạn các công cụ dựa trên CrUX theo một số phương diện hạn chế, chẳng hạn như quốc gia, loại kết nối và danh mục thiết bị (máy tính hoặc thiết bị di động). Bạn không thể phân chia dữ liệu theo các phương diện dành riêng cho doanh nghiệp của mình (ví dụ: người dùng tương tác, người dùng trong một nhóm thử nghiệm cụ thể, v.v.).
  • Các công cụ dựa trên CrUX có thể cho bạn biết tình trạng hiệu suất, nhưng không thể cho bạn biết lý do. Với các công cụ phân tích, bạn có thể gửi thêm dữ liệu để theo dõi và gỡ lỗi các vấn đề.

Vì những lý do này, tất cả chủ sở hữu trang web đều nên theo dõi các chỉ số của Các chỉ số quan trọng về trang web bằng công cụ phân tích hiện có. Bài đăng này giải thích cách bạn có thể sử dụng các công cụ miễn phí do Google cung cấp để làm điều đó.

Sau khi thiết lập xong mọi thứ, bạn có thể tạo các trang tổng quan như sau:

Ảnh chụp màn hình báo cáo của Trình kết nối Web Vitals

Ảnh chụp màn hình báo cáo của Trình kết nối Web Vitals

Nếu bạn muốn xem thông tin tổng quan trực quan về tất cả các bước được nêu ở đây, hãy xem buổi trò chuyện của chúng tôi tại Google I/O 2021:

Đo

Bạn luôn có thể đo lường hiệu suất bằng Google Analytics bằng cách sử dụng chỉ số tuỳ chỉnh, nhưng có một số tính năng mới trong Google Analytics 4 (GA4) mà các nhà phát triển đặc biệt nên hào hứng.

Mặc dù giao diện web của Google Analytics có các công cụ phân tích mạnh mẽ, nhưng rất khó để đánh bại sức mạnh và tính linh hoạt của việc truy cập dữ liệu sự kiện thô bằng cách sử dụng ngôn ngữ truy vấn mà bạn có thể đã biết.

Để bắt đầu đo lường Core Web Vitals bằng Google Analytics 4 và BigQuery, bạn cần làm 3 việc sau:

  1. Tạo tài sản Google Analytics 4dự án BigQuery.
  2. Bật tính năng xuất sang BigQuery trong cấu hình tài sản Google Analytics để tất cả dữ liệu bạn nhận được sẽ được tự động điền vào các bảng dự án BigQuery.
  3. Thêm thư viện JavaScript web-vitals vào trang web của bạn để có thể đo lường các chỉ số Core Web Vitals và gửi dữ liệu đến Google Analytics 4, bao gồm cả dữ liệu phân bổ.

Phân tích

Sau khi thiết lập xong, bạn sẽ thấy dữ liệu sự kiện được điền sẵn trong giao diện BigQuery và có thể truy vấn dữ liệu như sau:

SELECT * FROM `my_project_id.analytics_XXXXX.events_*`
WHERE event_name IN ('LCP', 'INP', 'CLS')

Dưới đây là bản xem trước kết quả của truy vấn đó:

Dữ liệu sự kiện Web Vitals trong BigQuery

Truy vấn dữ liệu về các chỉ số quan trọng về trang web

Trước khi bắt đầu truy vấn dữ liệu sự kiện về chỉ số Vitals trên web, bạn cần hiểu cách dữ liệu được tổng hợp.

Điều quan trọng nhất cần hiểu là trong một số trường hợp, có thể nhận được nhiều sự kiện cho cùng một chỉ số trên cùng một trang. Điều này có thể xảy ra nếu giá trị chỉ số thay đổi và giá trị mới được báo cáo (thường xảy ra với CLS).

Đối với các sự kiện Web Vitals, giá trị được gửi gần đây nhất luôn là giá trị chính xác nhất. Vì vậy, trước khi thực hiện bất kỳ hoạt động phân tích nào, điều quan trọng là bạn chỉ lọc những giá trị đó. Đoạn mã do thư viện JavaScript web-vitals cung cấp để gửi dữ liệu đến Google Analytics 4 bao gồm việc gửi một mã nhận dạng duy nhất cho mỗi chỉ số. Vì vậy, bạn có thể sử dụng truy vấn sau để chỉ giới hạn kết quả ở giá trị nhận được gần đây nhất cho mỗi mã chỉ số:

# 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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
)

Xin lưu ý rằng tất cả các truy vấn khác được tham chiếu trong bài đăng này sẽ bắt đầu bằng truy vấn phụ này.

Cụm từ tìm kiếm mẫu

Vài phần tiếp theo sẽ trình bày một số ví dụ về các truy vấn Web Vitals phổ biến mà bạn có thể muốn chạy.

LCP, INP và CLS ở phân vị thứ 75 (p75) trên toàn bộ trang web

# 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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

Tất cả giá trị LCP riêng lẻ từ cao nhất đến thấp nhất

# 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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
# 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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

10 trang có CLS tệ nhất (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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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

Gỡ lỗi

Các truy vấn trước đây cho biết cách truy vấn dữ liệu chỉ số Web Vitals. Dữ liệu này sẽ giúp bạn hiểu rõ hiệu suất hiện tại và xu hướng hiệu suất theo thời gian. Nhưng bạn có thể làm gì nếu hiệu suất kém hơn dự kiến nhưng không rõ lý do?

Việc biết mức điểm của bạn sẽ không hữu ích nếu bạn không thể hành động và khắc phục vấn đề.

Bài viết Gỡ lỗi hiệu suất trong trường giải thích cách bạn có thể gửi thêm thông tin gỡ lỗi cùng với dữ liệu phân tích. Nếu làm theo hướng dẫn chi tiết trong bài đăng đó, bạn cũng sẽ thấy thông tin gỡ lỗi đó xuất hiện trong BigQuery.

Cụm từ tìm kiếm mẫu

Các truy vấn sau đây cho biết cách sử dụng tham số sự kiện debug_target để giúp xác định nguyên nhân gốc rễ của các vấn đề về hiệu suất.

Các phần tử hàng đầu đóng góp vào CLS

debug_target là một chuỗi bộ chọn CSS tương ứng với phần tử trên trang liên quan nhất đến giá trị chỉ số.

Với CLS, debug_target đại diện cho phần tử lớn nhất từ lần thay đổi bố cục lớn nhất đóng góp vào giá trị CLS. Nếu không có phần tử nào được dịch chuyển, thì giá trị debug_target sẽ là null.

Truy vấn sau đây sẽ liệt kê các trang từ tệ nhất đến tốt nhất theo CLS ở phân vị thứ 75, được nhóm theo 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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

Kết quả truy vấn cho các phần tử hàng đầu đóng góp vào CLS

Việc biết được những phần tử nào trên trang đang thay đổi sẽ giúp bạn dễ dàng xác định và khắc phục nguyên nhân gốc rễ của vấn đề.

Xin lưu ý rằng các phần tử được báo cáo ở đây có thể không phải là các phần tử mà bạn thấy thay đổi khi gỡ lỗi trang trên máy. Đó là lý do tại sao việc thu thập dữ liệu này ngay từ đầu là rất quan trọng. Rất khó để khắc phục những vấn đề mà bạn không nhận ra!

Gỡ lỗi các chỉ số khác

Truy vấn trước đó cho thấy kết quả của chỉ số CLS, nhưng bạn có thể sử dụng chính kỹ thuật này để báo cáo về các mục tiêu gỡ lỗi cho LCP và INP. Bạn chỉ cần thay thế mệnh đề where bằng chỉ số có liên quan để gỡ lỗi:

WHERE metric_name = 'INP'
WHERE metric_name
= 'LCP'

Xin nhắc lại, bạn có thể tham khảo phần Gỡ lỗi hiệu suất trong trường để biết hướng dẫn về cách thu thập và gửi thông tin gỡ lỗi cho từng chỉ số trong Các chỉ số quan trọng về trang web.

Hình ảnh hóa

Bạn có thể gặp khó khăn khi chỉ xem kết quả truy vấn. Ví dụ: truy vấn sau đây liệt kê các giá trị phân vị thứ 75 hằng ngày cho LCP trong tập dữ liệu.

# 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 *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) 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

Từ những kết quả truy vấn này, bạn khó có thể xác định xu hướng hoặc dữ liệu ngoại lai chỉ bằng cách xem dữ liệu.

Kết quả truy vấn giá trị chỉ số hằng ngày

Trong những trường hợp như vậy, việc trực quan hoá dữ liệu có thể giúp bạn rút ra thông tin chi tiết nhanh hơn.

Hình ảnh hoá kết quả truy vấn trong Looker Studio

BigQuery cung cấp một cách nhanh chóng để trực quan hoá mọi kết quả truy vấn thông qua Data Studio. Looker Studio là một công cụ tạo hình ảnh dữ liệu và trang tổng quan miễn phí. Để trực quan hoá kết quả truy vấn, sau khi chạy truy vấn trong giao diện người dùng BigQuery, hãy nhấp vào nút Khám phá dữ liệu rồi chọn Khám phá bằng Looker Studio.

Khám phá bằng tuỳ chọn Looker Studio trong BigQuery

Thao tác này sẽ tạo một đường liên kết trực tiếp từ BigQuery đến Looker Studio trong chế độ xem khám phá. Trong chế độ xem này, bạn có thể chọn các trường mà bạn muốn trực quan hoá, chọn loại biểu đồ, thiết lập bộ lọc và tạo biểu đồ đặc biệt để phân tích nhanh bằng hình ảnh. Từ kết quả truy vấn trước, bạn có thể tạo biểu đồ đường này để xem xu hướng của các giá trị LCP theo thời gian:

Biểu đồ đường về các giá trị LCP hằng ngày trong Looker Studio

Với mối liên kết trực tiếp này giữa BigQuery và Looker Studio, bạn có thể tạo biểu đồ nhanh từ bất kỳ truy vấn nào và phân tích trực quan. Tuy nhiên, nếu muốn phân tích thêm, bạn nên xem một số biểu đồ trong trang tổng quan tương tác để có được thông tin tổng quan hơn hoặc có thể xem chi tiết dữ liệu. Khi có một trang tổng quan tiện lợi, bạn không cần phải viết truy vấn và tạo biểu đồ theo cách thủ công mỗi khi muốn phân tích các chỉ số của mình.

Bạn có thể tạo trang tổng quan trong Looker Studio bằng trình kết nối BigQuery gốc. Để thực hiện việc này, hãy truy cập vào datastudio.google.com, tạo một nguồn dữ liệu mới, chọn trình kết nối BigQuery rồi chọn tập dữ liệu mà bạn muốn làm việc:

Sử dụng trình kết nối gốc BigQuery trong Looker Studio

Tạo bản chất hoá dữ liệu về Chỉ số quan trọng của web

Khi tạo trang tổng quan về dữ liệu sự kiện trong Các chỉ số quan trọng về trang như mô tả trước đó, bạn không nên sử dụng trực tiếp tập dữ liệu xuất của Google Analytics 4. Do cấu trúc của dữ liệu GA4 và quá trình xử lý trước bắt buộc đối với các chỉ số về chỉ số quan trọng của web, nên một số phần của truy vấn sẽ chạy nhiều lần. Điều này gây ra hai vấn đề: hiệu suất của trang tổng quan và chi phí BigQuery.

Bạn có thể sử dụng chế độ hộp cát BigQuery mà không mất phí. Với cấp sử dụng miễn phí của BigQuery, 1 TB dữ liệu truy vấn đầu tiên được xử lý mỗi tháng sẽ miễn phí. Đối với các phương pháp phân tích được thảo luận trong bài đăng này, trừ phi bạn đang sử dụng một tập dữ liệu lớn đáng kể hoặc thường xuyên truy vấn tập dữ liệu này, thì bạn có thể sử dụng trong giới hạn miễn phí này mỗi tháng. Tuy nhiên, nếu bạn có một trang web có lưu lượng truy cập cao và muốn thường xuyên theo dõi các chỉ số khác nhau bằng cách sử dụng một trang tổng quan tương tác nhanh, bạn nên xử lý trước và hiện thực hoá dữ liệu về chỉ số quan trọng của web trong khi sử dụng các tính năng hiệu quả của BigQuery như phân vùng, cụm và lưu vào bộ nhớ đệm.

Tập lệnh sau đây sẽ xử lý trước dữ liệu BigQuery (bảng nguồn) và tạo một bảng được tạo bản sao (bảng đích). Khi sử dụng truy vấn này cho tập dữ liệu của riêng mình, bạn cũng nên xác định phạm vi ngày cho bảng nguồn để giảm lượng dữ liệu được xử lý.

# 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');

Tập dữ liệu được tạo bản sao này có một số ưu điểm:

  • Cấu trúc dữ liệu được làm phẳng và dễ truy vấn hơn.
  • Bộ lọc này chỉ giữ lại các sự kiện Web Vitals trong tập dữ liệu GA4 ban đầu.
  • Mã phiên, loại người dùng (mới so với cũ) và thông tin về mức độ tương tác trong phiên hoạt động có sẵn ngay trong các cột.
  • Bảng này được phân vùng theo ngày và nhóm lại theo tên chỉ số. Điều này thường làm giảm lượng dữ liệu được xử lý cho mỗi truy vấn.
  • Vì bạn không cần sử dụng ký tự đại diện để truy vấn bảng này, nên kết quả truy vấn có thể được lưu vào bộ nhớ đệm trong tối đa 24 giờ. Điều này giúp giảm chi phí lặp lại cùng một truy vấn.
  • Nếu sử dụng công cụ BigQuery BI, bạn có thể chạy các hàm và toán tử SQL được tối ưu hoá trên bảng này.

Bạn có thể truy vấn trực tiếp bảng đã tạo bản sao này từ giao diện người dùng BigQuery hoặc sử dụng bảng này trong Looker Studio bằng trình kết nối BigQuery.

Sử dụng Trình kết nối chỉ số quan trọng trên web

Vì việc tạo một trang tổng quan từ đầu sẽ mất nhiều thời gian, nên chúng tôi đã phát triển một giải pháp đóng gói để tạo trang tổng quan mẫu cho bạn. Trước tiên, hãy đảm bảo rằng bạn đã hiện thực hoá bảng Web Vitals bằng truy vấn trước đó. Sau đó, hãy truy cập vào trình kết nối Web Vitals cho Looker Studio bằng đường liên kết này: goo.gle/web-vitals-connector

Sau khi cung cấp quyền uỷ quyền một lần, bạn sẽ thấy màn hình cấu hình sau:

Màn hình uỷ quyền cho Trình kết nối Web Vitals

Cung cấp mã bảng BigQuery đã được hiện thực hoá (tức là bảng mục tiêu) và mã dự án thanh toán BigQuery của bạn. Sau khi bạn nhấp vào kết nối, Looker Studio sẽ tạo một trang tổng quan mới theo mẫu và liên kết dữ liệu của bạn với trang tổng quan đó. Bạn có thể chỉnh sửa, sửa đổi và chia sẻ trang tổng quan theo ý muốn. Nếu tạo một trang tổng quan một lần, bạn không cần truy cập lại đường liên kết của trình kết nối, trừ phi bạn muốn tạo nhiều trang tổng quan từ các tập dữ liệu khác nhau.

Khi di chuyển trên trang tổng quan, bạn có thể xem xu hướng hằng ngày của các chỉ số về chỉ số Hiệu suất quan trọng trên web và một số thông tin về mức sử dụng trang web của bạn như số người dùng và số phiên trong thẻ Tóm tắt.

Trong thẻ Phân tích người dùng, bạn có thể chọn một chỉ số rồi xem bảng chi tiết về tỷ lệ phần trăm chỉ số cũng như số người dùng theo các chỉ số sử dụng và kinh doanh khác nhau.

Thẻ Phân tích đường dẫn của trang sẽ giúp bạn xác định các khu vực có vấn đề trên trang web. Tại đây, bạn có thể chọn một chỉ số để xem thông tin tổng quan. Tuy nhiên, bạn cũng thấy bản đồ tán xạ của tất cả các đường dẫn trang có giá trị phần trăm trên trục y và số bản ghi trên trục x. Bản đồ tán xạ có thể giúp xác định những trang có giá trị chỉ số thấp hơn dự kiến. Sau khi chọn các trang bằng biểu đồ tán xạ của bảng Đường dẫn trang, bạn có thể xem xét kỹ hơn khu vực có vấn đề bằng cách xem bảng Mục tiêu gỡ lỗi.

Thẻ Phân tích doanh thu là một ví dụ về cách bạn có thể theo dõi hoạt động kinh doanh và các chỉ số hiệu suất ở cùng một nơi. Phần này trình bày tất cả các phiên mà người dùng đã thực hiện giao dịch mua. Bạn có thể so sánh doanh thu kiếm được với trải nghiệm người dùng trong một phiên cụ thể .

Cách sử dụng nâng cao

Khi đã quen thuộc hơn với tập dữ liệu, bạn có thể chỉnh sửa trang tổng quan và thêm biểu đồ của riêng mình để có được thông tin phân tích chi tiết và phù hợp hơn. Để trang tổng quan trở nên hữu ích hơn, bạn có thể thực hiện các bước sau:

  • Thiết lập truy vấn định kỳ trong BigQuery để nhận dữ liệu mới nhất. Truy vấn hiện thực hoá mà chúng ta đã chạy trước đó chỉ chụp nhanh dữ liệu của bạn tại thời điểm đó. Nếu muốn trang tổng quan luôn được cập nhật dữ liệu mới, bạn có thể chạy một truy vấn theo lịch sẽ chạy hằng ngày và thêm dữ liệu mới vào bảng đã tạo bản sao.
  • Kết hợp dữ liệu của bên thứ nhất (ví dụ: CRM) để có thông tin chi tiết về doanh nghiệp. Trong bảng được tạo bản sao, bạn có thể thêm user_id dưới dạng một cột riêng biệt. Điều này sẽ cho phép bạn kết hợp dữ liệu của bên thứ nhất. Nếu dữ liệu của bên thứ nhất chưa có trong BigQuery, bạn có thể tải dữ liệu hoặc sử dụng nguồn dữ liệu liên kết.
  • Báo cáo phiên bản trang web hoặc ứng dụng dưới dạng tham số trong dữ liệu bạn gửi đến Google Analytics và thêm phiên bản đó dưới dạng cột trong bảng được tạo bản sao. Sau đó, bạn có thể thêm dữ liệu phiên bản đó làm một phương diện trong biểu đồ để dễ dàng xem các thay đổi về phiên bản ảnh hưởng đến hiệu suất.
  • Nếu dự kiến sẽ sử dụng tập dữ liệu này một cách đáng kể thông qua truy vấn trực tiếp hoặc trang tổng quan, bạn có thể thử sử dụng phiên bản có tính phí của BigQuery BI Engine.

Tóm tắt

Bài đăng này trình bày thông tin cơ bản về cách sử dụng Google Analytics 4 và BigQuery để đo lường và gỡ lỗi hiệu suất bằng dữ liệu người dùng thực tế được thu thập trong thực tế. Bài viết này cũng giải thích cách tạo báo cáo và trang tổng quan tự động bằng Looker Studio và Trình kết nối Web Vitals để giúp bạn dễ dàng trực quan hoá dữ liệu nhất có thể.

Một số điểm chính cần ghi nhớ từ bài đăng này:

  • Việc đo lường hiệu suất bằng dữ liệu người dùng thực là yếu tố quan trọng để hiểu rõ, gỡ lỗi và tối ưu hoá trang web của bạn.
  • Bạn có thể nhận được thông tin chi tiết chuyên sâu hơn khi các chỉ số hiệu suất và chỉ số kinh doanh nằm trong cùng một hệ thống. Google Analytics và BigQuery giúp bạn làm được điều này.
  • Tính năng xuất dữ liệu thô của Google Analytics sang BigQuery giúp bạn có thể phân tích chuyên sâu và tuỳ chỉnh bằng ngôn ngữ truy vấn mà có thể bạn đã biết.
  • Google có một số API và công cụ trực quan hoá như Looker Studio, cho phép bạn tự do tạo báo cáo theo đúng cách mình muốn.