عملکرد را با Google Analytics 4 و BigQuery اندازه گیری و اشکال زدایی کنید

با نحوه ارسال داده های Web Vitals به ویژگی های Google Analytics 4 و صادرات داده ها برای تجزیه و تحلیل در BigQuery و Looker Studio آشنا شوید.

Google تعدادی ابزار - Search Console ، PageSpeed ​​Insights (PSI) و Chrome User Experience Report (CrUX) ارائه می‌کند که به توسعه‌دهندگان اجازه می‌دهد ببینند سایت‌هایشان در برابر معیارهای Core Web Vitals برای کاربران واقعی خود در این زمینه چگونه عمل می‌کنند.

این ابزارها از این جهت عالی هستند که به شما دید سطح بالایی از عملکرد کاربر واقعی سایت شما می دهند و برای شروع استفاده مطلقاً نیازی به تنظیمات ندارند.

با این حال، چند دلیل مهم وجود دارد که چرا نمی‌خواهید برای اندازه‌گیری عملکرد سایت خود به این ابزارها تکیه کنید:

  • ابزارهای مبتنی بر CrUX داده ها را بر اساس دوره های 28 روزه ماهانه یا قبلی گزارش می دهند. این به این معنی است که شما باید پس از انجام هر گونه تغییر مدت زیادی صبر کنید تا بتوانید نتایج را مشاهده کنید.
  • ابزارهای مبتنی بر CrUX را فقط می‌توان با تعداد محدودی از ابعاد، مانند کشور، نوع اتصال و دسته دستگاه (رومیزی یا تلفن همراه) بخش‌بندی کرد. نمی‌توانید داده‌ها را بر اساس ابعاد خاص کسب‌وکارتان (به عنوان مثال: کاربران درگیر، کاربران در یک گروه آزمایشی خاص و غیره) تقسیم کنید.
  • ابزارهای مبتنی بر CrUX می‌توانند به شما بگویند عملکرد شما چیست ، اما نمی‌توانند دلیل آن را به شما بگویند. با ابزارهای تجزیه و تحلیل می توانید داده های اضافی را برای کمک به ردیابی و اشکال زدایی مشکلات ارسال کنید.

به این دلایل، ما به همه صاحبان سایت توصیه می کنیم با استفاده از ابزار تجزیه و تحلیل موجود، معیارهای Core Web Vitals را نظارت کنند. این پست توضیح می دهد که چگونه می توانید از ابزارهای رایگان ارائه شده توسط Google برای انجام این کار استفاده کنید.

هنگامی که همه چیز را تنظیم کردید، می توانید داشبوردهایی مانند این ایجاد کنید:

تصویر صفحه گزارش Web Vitals Connector

تصویر صفحه گزارش Web Vitals Connector

و اگر می‌خواهید یک نمای کلی بصری از تمام مراحل ذکر شده در اینجا داشته باشید، بحث ما از Google I/O '21 را بررسی کنید:

اندازه گیری کنید

اندازه‌گیری عملکرد همیشه با Google Analytics با استفاده از معیارهای سفارشی امکان‌پذیر بوده است، اما چند ویژگی جدید در Google Analytics 4 (GA4) وجود دارد که به‌ویژه توسعه‌دهندگان باید در مورد آنها هیجان‌زده باشند.

در حالی که رابط وب Google Analytics دارای ابزارهای تجزیه و تحلیل قدرتمندی است، شکست دادن قدرت و انعطاف پذیری دسترسی به داده های رویداد خام با استفاده از زبان پرس و جو که احتمالاً قبلاً می شناسید دشوار است.

برای شروع اندازه‌گیری Core Web Vitals با استفاده از Google Analytics 4 و BigQuery، باید سه کار را انجام دهید:

  1. یک ویژگی Google Analytics 4 و یک پروژه BigQuery ایجاد کنید.
  2. صادرات BigQuery را در پیکربندی ویژگی Google Analytics خود فعال کنید، بنابراین تمام داده‌هایی که دریافت می‌کنید به‌طور خودکار در جداول پروژه BigQuery شما پر می‌شوند.
  3. کتابخانه جاوا اسکریپت web-vitals را به سایت خود اضافه کنید تا بتوانید معیارهای Core Web Vitals را اندازه گیری کنید و داده ها را به Google Analytics 4 ارسال کنید ، از جمله داده های انتساب .

تجزیه و تحلیل کنید

پس از راه‌اندازی، باید داده‌های رویداد را در رابط BigQuery مشاهده کنید، و باید بتوانید داده‌ها را به این صورت جستجو کنید:

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

در اینجا پیش نمایشی از نتایج آن پرس و جو آورده شده است:

داده های رویداد Web Vitals در BigQuery

داده های Web Vitals را پرس و جو کنید

قبل از شروع جستجوی داده‌های رویداد Web Vitals خود، مهم است که بدانید چگونه داده‌ها جمع‌آوری می‌شوند.

مهمترین چیزی که باید درک کنید این است که در برخی موارد ممکن است چندین رویداد برای یک متریک در یک صفحه دریافت شود . اگر مقدار متریک تغییر کند و یک مقدار به‌روزرسانی شده گزارش شود، این اتفاق می‌افتد (یک اتفاق رایج در CLS).

برای رویدادهای Web Vitals، آخرین مقدار ارسالی همیشه دقیق‌ترین مقدار است، بنابراین قبل از انجام هر تحلیلی، مهم است که فقط آن مقادیر را فیلتر کنید. قطعه کد ارائه شده توسط کتابخانه جاوا اسکریپت web-vitals برای ارسال داده ها به Google Analytics 4 شامل ارسال یک شناسه منحصر به فرد در هر متریک است، بنابراین می توانید از جستجوی زیر برای محدود کردن نتایج خود به آخرین مقدار دریافتی برای هر شناسه متریک استفاده کنید:

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

توجه داشته باشید که سایر پرس و جوهایی که در این پست به آنها ارجاع داده شده است با این پرسش فرعی شروع می شوند.

پرس و جوهای نمونه

چند بخش بعدی چند نمونه از پرس و جوهای متداول 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 *, 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

تمام مقادیر 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 *, 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 صفحه برتر با بدترین CLS (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

اشکال زدایی

جستارهای قبلی نشان می دهد که چگونه می توان از داده های متریک Web Vitals پرس و جو کرد، که برای درک عملکرد فعلی شما و چگونگی روند آن در طول زمان مفید است. اما اگر عملکرد شما بدتر از حد انتظار باشد اما مطمئن نیستید که چرا چه کاری می توانید انجام دهید؟

اگر نتوانید اقدامی انجام دهید و مشکلات را برطرف کنید، دانستن نمرات شما مفید نیست.

عملکرد اشکال زدایی در این زمینه توضیح می دهد که چگونه می توانید اطلاعات اشکال زدایی اضافی را با داده های تجزیه و تحلیل خود ارسال کنید. اگر دستورالعمل‌های مشروح در آن پست را دنبال کنید، باید ببینید که اطلاعات اشکال‌زدایی در BigQuery نیز ظاهر می‌شود.

پرس و جوهای نمونه

جستارهای زیر نحوه استفاده از پارامتر رویداد debug_target را برای کمک به شناسایی علت اصلی مشکلات عملکرد نشان می دهد.

عناصر برتر در CLS

debug_target یک رشته انتخابگر CSS است که با عنصری در صفحه مطابقت دارد که بیشترین ارتباط را با مقدار متریک دارد.

با CLS، debug_target بزرگترین عنصر را از بزرگترین تغییر طرح‌بندی نشان می‌دهد که به مقدار CLS کمک کرده است. اگر هیچ عنصری جابجا نشود، مقدار debug_target null خواهد بود.

پرس و جوی زیر صفحات را از بدترین به بهترین بر اساس CLS در صدک 75 فهرست می کند که بر اساس 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

نتیجه جستجو برای عناصر برتر در CLS

دانستن اینکه چه عناصری در صفحه تغییر می‌کنند، شناسایی و رفع علت اصلی مشکل را بسیار آسان‌تر می‌کند.

به خاطر داشته باشید که عناصر گزارش شده در اینجا ممکن است همان عناصری نباشند که هنگام اشکال زدایی صفحات خود به صورت محلی تغییر می کنند، به همین دلیل است که در وهله اول گرفتن این داده ها بسیار مهم است. خیلی سخته که چیزایی رو درست کنی که نمیدونی مشکل دارن!

سایر معیارها را اشکال زدایی کنید

پرس و جو قبلی نتایج را برای متریک CLS نشان می دهد، اما دقیقاً از همان تکنیک می توان برای گزارش اهداف اشکال زدایی برای LCP و INP استفاده کرد. برای اشکال‌زدایی، فقط عبارت Where را با متریک مربوطه جایگزین کنید:

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

مجدداً، می‌توانید برای دستورالعمل‌های نحوه جمع‌آوری و ارسال اطلاعات اشکال‌زدایی برای هر یک از معیارهای Core Web Vitals به عملکرد اشکال‌زدایی در فیلد مراجعه کنید.

تجسم کنید

تنها با نگاه کردن به نتایج پرس و جو می تواند چالش برانگیز باشد. به عنوان مثال، پرس و جو زیر مقادیر صدک 75 روزانه را برای 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 *, 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

از این نتایج پرس و جو، تشخیص روندها یا موارد پرت فقط با نگاه کردن به داده ها دشوار است.

نتایج پرس و جو مقدار متریک روزانه

در چنین مواردی، تجسم داده‌ها می‌تواند به شما کمک کند تا بینش را سریع‌تر به دست آورید.

نتایج پرس و جو را در Looker Studio تجسم کنید

BigQuery یک راه سریع برای تجسم هر نتیجه پرس و جو از طریق Data Studio ارائه می دهد. Looker Studio یک ابزار تجسم داده و داشبورد است که استفاده از آن رایگان است. برای تجسم نتایج جستجوی خود، پس از اجرای پرس و جو در رابط کاربری BigQuery، روی دکمه Explore Data کلیک کنید و Explore with Looker Studio را انتخاب کنید.

با گزینه Looker Studio در BigQuery کاوش کنید

این یک پیوند مستقیم از BigQuery به استودیوی Looker در نمای کاوش ایجاد می کند. در این نما، می‌توانید فیلدهایی را که می‌خواهید تجسم کنید، انتخاب کنید، انواع نمودارها، فیلترهای راه‌اندازی را انتخاب کنید و نمودارهای موردی را برای تحلیل سریع بصری ایجاد کنید. از نتایج پرس و جو قبلی، می توانید این نمودار خطی را ایجاد کنید تا روند مقادیر LCP را در طول زمان ببینید:

نمودار خطی مقادیر LCP روزانه در Looker Studio

با این پیوند مستقیم بین BigQuery و Looker Studio، می توانید نمودارهای سریعی را از هر یک از جستجوهای خود ایجاد کنید و تجزیه و تحلیل بصری انجام دهید. با این حال، اگر می‌خواهید تجزیه و تحلیل بیشتری انجام دهید، ممکن است بخواهید به چندین نمودار در یک داشبورد تعاملی نگاه کنید تا دید جامع‌تری داشته باشید یا بتوانید داده‌ها را بررسی کنید. داشتن یک داشبورد مفید به این معنی است که لازم نیست هر بار که می خواهید معیارهای خود را تجزیه و تحلیل کنید، پرس و جو بنویسید و نمودارها را به صورت دستی ایجاد کنید.

می توانید با استفاده از رابط اصلی BigQuery یک داشبورد در Looker Studio ایجاد کنید. برای انجام این کار، به datastudio.google.com بروید، یک منبع داده جدید ایجاد کنید، رابط BigQuery را انتخاب کنید و مجموعه داده‌ای را که می‌خواهید با آن کار کنید انتخاب کنید:

استفاده از رابط اصلی BigQuery در Looker Studio

داده های Web Vitals را مادی کنید

هنگام ایجاد داشبورد داده‌های رویداد Web Vitals همانطور که قبلاً توضیح داده شد، استفاده مستقیم از مجموعه داده صادراتی Google Analytics 4 کارآمد نیست. با توجه به ساختار داده‌های GA4 و پیش‌پردازش مورد نیاز برای معیارهای Web Vitals، بخش‌هایی از پرس و جو شما چندین بار اجرا می‌شود. این دو مشکل ایجاد می کند: عملکرد داشبورد و هزینه BigQuery.

شما می توانید از حالت جعبه ایمنی BigQuery بدون پرداخت هزینه استفاده کنید. با سطح استفاده رایگان BigQuery، اولین 1 ترابایت داده پرس و جو پردازش شده در ماه رایگان است. برای روش‌های تحلیلی که در این پست مورد بحث قرار گرفته‌اند، مگر اینکه از یک مجموعه داده بسیار بزرگ استفاده می‌کنید یا به‌شدت به طور مرتب مجموعه داده را پرس و جو می‌کنید، باید بتوانید هر ماه در این محدودیت رایگان بمانید. اما اگر وب‌سایت پر بازدیدی دارید و می‌خواهید به طور منظم معیارهای مختلف را با استفاده از داشبورد تعاملی سریع نظارت کنید، پیشنهاد می‌کنیم همزمان با استفاده از ویژگی‌های کارآمدی BigQuery مانند پارتیشن‌بندی، خوشه‌بندی و ذخیره‌سازی، داده‌های حیاتی وب خود را از قبل پردازش و عملی کنید.

اسکریپت زیر داده های 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');

این مجموعه داده واقعی چندین مزیت دارد:

  • ساختار داده مسطح است و پرس و جو آسان تر است.
  • فقط رویدادهای Web Vitals را از مجموعه داده اصلی GA4 حفظ می کند.
  • شناسه جلسه، نوع کاربر (جدید در مقابل بازگشت)، و اطلاعات تعامل جلسه مستقیماً در ستون ها موجود است.
  • جدول بر اساس تاریخ تقسیم شده و با نام متریک خوشه بندی شده است . این معمولاً میزان داده های پردازش شده برای هر پرس و جو را کاهش می دهد.
  • از آنجایی که برای جستجو در این جدول نیازی به استفاده از حروف عام ندارید، نتایج پرس و جو می توانند حداکثر تا 24 ساعت در حافظه پنهان شوند. این باعث کاهش هزینه های تکرار یک پرس و جو می شود.
  • اگر از موتور BigQuery BI استفاده می کنید، می توانید توابع و عملگرهای SQL بهینه شده را روی این جدول اجرا کنید.

می‌توانید مستقیماً از داخل BigQuery UI از این جدول واقعی پرس و جو کنید یا با استفاده از رابط BigQuery از آن در Looker Studio استفاده کنید.

از رابط Web Vitals استفاده کنید

از آنجایی که ساخت داشبورد از ابتدا زمان بر است، ما یک راه حل بسته بندی شده ایجاد کردیم که یک داشبورد قالب برای شما ایجاد می کند. ابتدا مطمئن شوید که جدول Web Vitals خود را با استفاده از پرس و جو قبلی مادیت کرده اید. سپس با استفاده از این پیوند به رابط Web Vitals برای Looker Studio دسترسی پیدا کنید: goo.gle/web-vitals-connector

پس از ارائه مجوز یک بار مصرف، باید صفحه پیکربندی زیر را مشاهده کنید:

صفحه مجوز Web Vitals Connector

شناسه جدول BigQuery (یعنی جدول هدف) و شناسه پروژه صورتحساب BigQuery خود را ارائه دهید. پس از کلیک بر روی اتصال، Looker Studio یک داشبورد قالب جدید ایجاد می کند و داده های شما را با آن مرتبط می کند. می توانید داشبورد را هر طور که دوست دارید ویرایش، تغییر دهید و به اشتراک بگذارید. اگر یک داشبورد یک بار ایجاد کنید، لازم نیست دوباره به پیوند رابط مراجعه کنید، مگر اینکه بخواهید چندین داشبورد از مجموعه داده های مختلف ایجاد کنید.

همانطور که در داشبورد پیمایش می کنید، می توانید روندهای روزانه معیارهای Web Vitals و برخی اطلاعات استفاده از وب سایت خود مانند کاربران و جلسات را در برگه خلاصه مشاهده کنید.

در برگه تجزیه و تحلیل کاربر ، می‌توانید یک معیار را انتخاب کنید و سپس به تفکیک صدک معیارها و همچنین تعداد کاربران بر اساس معیارهای مختلف استفاده و کسب‌وکار برسید.

تب Page Path Analysis به شما کمک می کند تا مناطق مشکل دار وب سایت خود را شناسایی کنید. در اینجا، برای مشاهده نمای کلی، می‌توانید معیاری را انتخاب کنید. اما شما همچنین نقشه پراکندگی تمام مسیرهای صفحه را با مقدار صدک در محور y و تعداد رکورد در محور x می بینید. نقشه پراکندگی می تواند به شناسایی صفحاتی که مقادیر متریک کمتر از حد انتظار دارند کمک کند. هنگامی که صفحات را با استفاده از نمودار پراکندگی جدول مسیر صفحه انتخاب کردید، می توانید با مشاهده جدول Debug Target ناحیه مشکل را بیشتر بررسی کنید.

برگه تجزیه و تحلیل درآمد نمونه ای از نحوه نظارت بر معیارهای کسب و کار و عملکرد خود در یک مکان است. این بخش تمام جلساتی را که کاربر خرید کرده است ترسیم می کند. می توانید درآمد کسب شده را با تجربه کاربر در طول یک جلسه خاص مقایسه کنید.

استفاده پیشرفته

همانطور که با مجموعه داده بیشتر آشنا می شوید، می توانید داشبورد را ویرایش کنید و نمودارهای خود را برای تجزیه و تحلیل غنی تر و هدفمند اضافه کنید. برای مفیدتر کردن داشبورد، می توانید مراحل زیر را انجام دهید:

  • برای دریافت داده های به روز، پرس و جو برنامه ریزی شده را در BigQuery راه اندازی کنید. جستجوی مادیت‌سازی که قبلاً اجرا کردیم، فقط یک عکس فوری از داده‌های شما در آن لحظه می‌گیرد. اگر می‌خواهید داشبورد خود را با داده‌های جدید به‌روز نگه دارید، می‌توانید یک پرس‌وجو زمان‌بندی شده را اجرا کنید که هر روز اجرا می‌شود و جدول واقعی‌شده‌تان را با داده‌های جدید اضافه می‌کند.
  • برای اطلاعات بینش تجاری به داده های شخص اول (مانند CRM) بپیوندید. در جدول متریال شده، می توانید user_id به عنوان یک ستون جداگانه اضافه کنید. این به شما امکان می دهد به داده های حزب اول خود بپیوندید. اگر داده‌های شخص اول شما از قبل در BigQuery نیست، می‌توانید داده‌ها را بارگیری کنید یا از یک منبع داده فدرال استفاده کنید.
  • نسخه سایت یا برنامه خود را به عنوان پارامتر در داده هایی که به Google Analytics ارسال می کنید گزارش دهید و آن را به عنوان یک ستون در جدول واقعی اضافه کنید. سپس می توانید داده های نسخه را به عنوان یک بعد در نمودارهای خود اضافه کنید تا مشاهده تغییرات نسخه بر عملکرد آسان تر شود.
  • اگر انتظار استفاده زیاد از مجموعه داده از طریق پرس و جو مستقیم یا داشبورد را دارید، می توانید از نسخه پولی BigQuery BI Engine استفاده کنید.

خلاصه

این پست اصول اولیه نحوه استفاده از Google Analytics 4 و BigQuery را برای اندازه‌گیری و اشکال‌زدایی عملکرد با داده‌های کاربر واقعی جمع‌آوری‌شده در این زمینه را پوشش می‌دهد. همچنین توضیح داد که چگونه می توان گزارش ها و داشبوردهای خودکار را با استفاده از Looker Studio و Web Vitals Connector ساخت تا تجسم داده ها را تا حد امکان آسان کند.

چند نکته کلیدی از این پست:

  • اندازه گیری عملکرد با داده های واقعی کاربر برای درک، اشکال زدایی و بهینه سازی سایت شما بسیار مهم است.
  • وقتی معیارهای عملکرد و معیارهای کسب و کار شما در یک سیستم باشند، می توانید بینش عمیق تری دریافت کنید. گوگل آنالیتیکس و BigQuery این امکان را فراهم می کنند.
  • صادرات BigQuery از داده های خام Google Analytics به شما پتانسیل نامحدودی برای تجزیه و تحلیل عمیق و سفارشی با استفاده از زبان پرس و جو که احتمالاً قبلاً می دانید، می دهد.
  • گوگل تعدادی API و ابزارهای تجسمی مانند استودیو Looker دارد که به شما این آزادی را می‌دهد تا گزارش‌های خود را دقیقاً همانطور که می‌خواهید بسازید.