Google Analytics 4 ve BigQuery ile performansı ölçme ve hata ayıklama

Web Vitals'ta yer alan verileri Google Analytics 4 mülklerine nasıl göndereceğinizi ve verileri BigQuery ile Looker Studio'da analiz etmek için nasıl dışa aktaracağınızı öğrenin.

Google, geliştiricilerin sitelerinin sahada gerçek kullanıcıları için Önemli Web Verileri metriklerine göre nasıl performans gösterdiğini görmelerine olanak tanıyan çeşitli araçlar (Search Console, PageSpeed Insights (PSI) ve Chrome Kullanıcı Deneyimi Raporu (CrUX)) sağlar.

Bu araçlar, sitenizin gerçek kullanıcı performansına dair üst düzey bir görünüm sunması ve kullanmaya başlamak için hiçbir kurulum gerektirmemesi açısından mükemmeldir.

Ancak sitenizin performansını ölçmek için yalnızca bu araçlara güvenmek istememenizin birkaç önemli nedeni vardır:

  • CrUX tabanlı araçlar, verileri aylık veya önceki 28 günlük dönemlere göre raporlar. Bu nedenle, değişiklik yaptıktan sonra sonuçları görebilmeniz için uzun süre beklemeniz gerekir.
  • CrUX tabanlı araçlar yalnızca ülke, bağlantı türü ve cihaz kategorisi (masaüstü veya mobil) gibi sınırlı sayıda boyuta göre segmentlere ayrılabilir. Verileri işletmenize özgü boyutlara göre (ör. etkileşimde bulunan kullanıcılar, belirli bir deneme grubundaki kullanıcılar vb.) dilimleyemezsiniz.
  • CrUX tabanlı araçlar, performansınızın ne olduğunu size söyleyebilir ancak nedenini söyleyemez. Analiz araçları sayesinde sorunları tespit etmenize ve hata ayıklamanıza yardımcı olacak ek veriler gönderebilirsiniz.

Bu nedenlerle, tüm site sahiplerinin mevcut analiz araçlarını kullanarak Core Web Vitals metriklerini izlemesini öneririz. Bu gönderide, bunu yapmak için Google tarafından sunulan ücretsiz araçları nasıl kullanabileceğiniz açıklanmaktadır.

Her şeyi ayarladıktan sonra aşağıdaki gibi kontrol panelleri oluşturabilirsiniz:

Web Vitals Connector raporu ekran görüntüsü

Web Vitals Connector raporu ekran görüntüsü

Burada açıklanan tüm adımlara görsel bir genel bakış için Google I/O 2021'deki konuşmamıza göz atın:

Ölçüm

Performansı ölçmek, Google Analytics'te özel metrikler kullanılarak her zaman mümkün olmuştur. Ancak Google Analytics 4'te (GA4) özellikle geliştiricilerin heyecanlanacağı birkaç yeni özellik vardır.

Google Analytics web arayüzünde güçlü analiz araçları olsa da muhtemelen bildiğiniz bir sorgu dili kullanarak ham etkinlik verilerine erişmenin gücünü ve esnekliğini aşmak zordur.

Google Analytics 4 ve BigQuery'yi kullanarak Core Web Vitals'ı ölçmeye başlamak için üç şey yapmanız gerekir:

  1. Bir Google Analytics 4 mülkü ve BigQuery projesi oluşturun.
  2. Aldığınız tüm verilerin BigQuery proje tablolarınıza otomatik olarak doldurulması için Google Analytics mülk yapılandırmanızda BigQuery Export'u etkinleştirin.
  3. Core Web Vitals metriklerini ölçmek ve ilişkilendirme verileri dahil olmak üzere verileri Google Analytics 4'e göndermek için sitenize web-vitals JavaScript kitaplığını ekleyin.

Analiz et

Kurulum tamamlandıktan sonra BigQuery arayüzünde etkinlik verilerinin oluştuğunu görürsünüz ve verileri şu şekilde sorgulayabilirsiniz:

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

Bu sorgunun sonuçlarının önizlemesini aşağıda bulabilirsiniz:

BigQuery'deki Web Vitals etkinlik verileri

Web Vitals verilerini sorgulayın

Web Vitals etkinlik verilerinizi sorgulamadan önce verilerin nasıl toplandığını anlamanız önemlidir.

Anlamanız gereken en önemli nokta, bazı durumlarda aynı sayfada aynı metrik için birden fazla etkinlik alınabileceğidir. Bu durum, metrik değeri değişirse ve güncellenmiş bir değer raporlanırsa (CLS ile sık karşılaşılan bir durumdur) ortaya çıkabilir.

Web Vitals etkinlikleri için gönderilen son değer her zaman en doğru değerdir. Bu nedenle, herhangi bir analiz gerçekleştirmeden önce yalnızca bu değerleri filtrelemek önemlidir. Google Analytics 4'e veri göndermek için web-vitals JavaScript kitaplığı tarafından sağlanan kod snippet'i, metrik başına benzersiz bir kimlik göndermeyi içerir. Aşağıdaki sorguyu kullanarak sonuçlarınızı her metrik kimliği için yalnızca son alınan değerle sınırlandırabilirsiniz:

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

Bu yayında atıfta bulunulan diğer tüm sorguların bu alt sorguyla başlayacağını unutmayın.

Örnek sorgular

Sonraki birkaç bölümde, çalıştırmak isteyebileceğiniz yaygın Web Vitals sorgularına dair birkaç örnek verilmiştir.

Tüm site genelinde% 75'lik yüzdelik dilimde (p75) LCP, INP ve CLS

# 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

En yüksekten en düşüğe tüm LCP değerleri

# 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

En kötü CLS'ye sahip ilk 10 sayfa (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

Hata Ayıklama

Önceki sorgular, Web Vitals metrik verilerinin nasıl sorgulandığını gösterir. Bu veriler, mevcut performansınızı ve zaman içindeki trendini anlamanıza yardımcı olur. Peki, performansınız beklenenden daha kötüyse ancak nedeninden emin değilseniz ne yapabilirsiniz?

Harekete geçip sorunları çözemiyorsanız puanlarınızın ne olduğunu bilmek faydalı olmaz.

Alandaki performansta hata ayıklama başlıklı makalede, analiz verilerinizle nasıl ek hata ayıklama bilgileri gönderebileceğiniz açıklanmaktadır. Bu yayında ayrıntılı olarak verilen talimatları uygularsanız hata ayıklama bilgilerinin BigQuery'de de görüntülendiğini görürsünüz.

Örnek sorgular

Aşağıdaki sorgular, performans sorunlarının temel nedenini belirlemeye yardımcı olmak için debug_target etkinlik parametresinin nasıl kullanılacağını gösterir.

CLS'ye katkıda bulunan en önemli öğeler

debug_target, sayfadaki metrik değeriyle en alakalı öğeye karşılık gelen bir CSS seçici dizesidir.

CLS'de debug_target, CLS değerine katkıda bulunan en büyük düzen kaymasında en büyük öğeyi temsil eder. Hiçbir öğe kaydırılmazsa debug_target değeri null olur.

Aşağıdaki sorgu, debug_target boyutuna göre gruplandırılmış sayfaları 75. yüzdelik dilimdeki CLS'lerine göre en kötüden en iyiye doğru listeler:

# 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'ye katkıda bulunan en önemli öğeler için sorgu sonucu

Sayfadaki hangi öğelerin değiştiğini bilmek, sorunun temel nedenini belirlemeyi ve düzeltmeyi çok daha kolay hale getirecektir.

Burada raporlanan öğelerin, sayfalarınızı yerel olarak hata ayıkladığınızda kaydırıldığını gördüğünüz öğelerle aynı olmayabileceğini unutmayın. Bu nedenle, bu verileri ilk başta yakalamak çok önemlidir. Farkına varmadığınız şeyleri düzeltmek çok zordur!

Diğer metriklerde hata ayıklama

Önceki sorgu, CLS metriğinin sonuçlarını gösterir ancak LCP ve INP için hata ayıklama hedefleri hakkında rapor oluşturmak amacıyla tamamen aynı teknik kullanılabilir. Hata ayıklama için where yan tümcesini ilgili metrikle değiştirmeniz yeterlidir:

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

Yine, Core Web Vitals metriklerinin her biri için hata ayıklama bilgilerinin nasıl toplanıp gönderileceğiyle ilgili talimatlar için Alandaki performansta hata ayıklama başlıklı makaleyi inceleyebilirsiniz.

Görselleştir

Yalnızca sorgu sonuçlarına bakarak analiz elde etmek zor olabilir. Örneğin, aşağıdaki sorgu veri kümesinde LCP için günlük 75. yüzdelik değer değerlerini listeler.

# 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

Bu sorgu sonuçlarından, yalnızca verilere bakarak trendleri veya aykırı değerleri belirlemek zordur.

Günlük metrik değeri sorgu sonuçları

Böyle durumlarda verileri görselleştirmek, daha hızlı analizler elde etmenize yardımcı olabilir.

Sorgu sonuçlarını Looker Studio'da görselleştirme

BigQuery, tüm sorgu sonuçlarını Data Studio aracılığıyla görselleştirmenin hızlı bir yolunu sunar. Looker Studio, kullanımı ücretsiz bir veri görselleştirme ve kontrol paneli aracıdır. Sorgu sonuçlarınızı görselleştirmek için BigQuery kullanıcı arayüzünde sorgunuzu çalıştırdıktan sonra Verileri Keşfet düğmesini tıklayın ve Looker Studio ile keşfet'i seçin.

BigQuery'deki Looker Studio ile keşfet seçeneği

Bu işlem, keşif görünümünde BigQuery'den Looker Studio'ya doğrudan bir bağlantı oluşturur. Bu görünümde, görselleştirmek istediğiniz alanları seçebilir, grafik türlerini belirleyebilir, filtreler oluşturabilir ve hızlı görsel analiz için özel grafikler oluşturabilirsiniz. Önceki sorgu sonuçlarından, LCP değerlerinin zaman içindeki trendini görmek için aşağıdaki çizgi grafiği oluşturabilirsiniz:

Looker Studio'da günlük LCP değerlerinin çizgi grafiği

BigQuery ile Looker Studio arasındaki bu doğrudan bağlantı sayesinde, sorgularınızdan hızlı grafikler oluşturabilir ve görsel analizler yapabilirsiniz. Ancak ek analiz yapmak istiyorsanız daha bütünsel bir görünüm elde etmek veya verileri ayrıntılı olarak incelemek için etkileşimli bir kontrol panelindeki çeşitli grafiklere bakabilirsiniz. Kullanışlı bir kontrol paneline sahip olmak, metriklerinizi analiz etmek istediğinizde her seferinde sorgu yazmanız ve grafik oluşturmanız gerekmediği anlamına gelir.

Yerel BigQuery bağlayıcısını kullanarak Looker Studio'da kontrol paneli oluşturabilirsiniz. Bunu yapmak için datastudio.google.com adresine gidin, yeni bir veri kaynağı oluşturun, BigQuery bağlayıcısını seçin ve çalışmak istediğiniz veri kümesini seçin:

Looker Studio'da BigQuery yerel bağlayıcısını kullanma

Web Verileri verilerini somutlaştırma

Daha önce açıklandığı gibi Web Vitals etkinlik verilerinin kontrol panellerini oluştururken Google Analytics 4 dışa aktarma veri kümesini doğrudan kullanmak verimli değildir. GA4 verilerinin yapısı ve Web Verileri metrikleri için gereken ön işleme nedeniyle, sorgunuzun bazı bölümleri birden fazla kez çalışır. Bu durum iki soruna yol açar: gösterge tablosu performansı ve BigQuery maliyetleri.

BigQuery korumalı alan modunu ücretsiz olarak kullanabilirsiniz. BigQuery'nin ücretsiz kullanım katmanı sayesinde, her ay işlenen ilk 1 TB sorgu verisi ücretsizdir. Bu yayında açıklanan analiz yöntemleri için, önemli ölçüde büyük bir veri kümesi kullanmıyorsanız veya veri kümesini düzenli olarak yoğun şekilde sorguluyorsanız her ay bu ücretsiz sınırın altında kalabilirsiniz. Ancak trafiği yüksek bir web siteniz varsa ve hızlı, etkileşimli bir kontrol paneli kullanarak farklı metrikleri düzenli olarak izlemek istiyorsanız bölümleme, kümeleme ve önbelleğe alma gibi BigQuery verimlilik özelliklerinden yararlanırken web temel metrikleri verilerinizi önceden işlemenizi ve somutlaştırmanızı öneririz.

Aşağıdaki komut dosyası, BigQuery verilerinizi (kaynak tablo) ön işleme alır ve somutlaştırılmış bir tablo (hedef tablo) oluşturur. Bu sorguyu kendi veri kümeniz için kullanırken, işlenen veri miktarını azaltmak amacıyla kaynak tablo için bir tarih aralığı da tanımlayabilirsiniz.

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

Bu somutlaştırılmış veri kümesinin birkaç avantajı vardır:

  • Veri yapısı düzleştirilir ve sorgulanması kolaylaştırılır.
  • Yalnızca orijinal GA4 veri kümesindeki Web Vitals etkinliklerini saklar.
  • Oturum kimliği, kullanıcı türü (yeni/geri gelen) ve oturum etkileşimi bilgileri doğrudan sütunlarda bulunur.
  • Tablo, tarihe göre bölümlendirilmiş ve metrik adına göre kümelenmiş. Bu, genellikle her sorgu için işlenen veri miktarını azaltır.
  • Bu tabloyu sorgulamak için joker karakter kullanmanız gerekmediğinden sorgu sonuçları 24 saate kadar önbelleğe alınabilir. Bu sayede aynı sorgunun tekrarlanmasıyla ilgili maliyetler azalır.
  • BigQuery BI Engine'ı kullanıyorsanız bu tabloda optimize edilmiş SQL işlevleri ve operatörleri çalıştırabilirsiniz.

Bu somutlaştırılmış tabloyu doğrudan BigQuery kullanıcı arayüzünden sorgulayabilir veya BigQuery bağlayıcısını kullanarak Looker Studio'da kullanabilirsiniz.

Web Vitals Bağlayıcısı'nı kullanma

Kontrol panelini sıfırdan oluşturmak zaman aldığından, sizin için şablon kontrol paneli oluşturacak paketlenmiş bir çözüm geliştirdik. Öncelikle, önceki sorguyu kullanarak Web Vitals tablonuzu somutlaştırdığınızdan emin olun. Ardından, şu bağlantıyı kullanarak Looker Studio için Web Vitals bağlayıcısına erişin: goo.gle/web-vitals-connector

Tek seferlik yetkilendirme yaptıktan sonra aşağıdaki yapılandırma ekranını görürsünüz:

Web Vitals Connector yetkilendirme ekranı

Somutlaştırılmış BigQuery tablo kimliğini (ör. hedef tablo) ve BigQuery faturalandırma proje kimliğinizi sağlayın. Bağlan'ı tıkladıktan sonra Looker Studio yeni bir şablon kontrol paneli oluşturur ve verilerinizi bu panelle ilişkilendirir. Kontrol panelini istediğiniz gibi düzenleyebilir, değiştirebilir ve paylaşabilirsiniz. Bir kez kontrol paneli oluşturursanız farklı veri kümelerinden birden fazla kontrol paneli oluşturmak istemiyorsanız bağlayıcı bağlantısını tekrar ziyaret etmeniz gerekmez.

Kontrol panelinde gezinirken Özet sekmesinde, Web Vitals metriklerinin günlük trendlerini ve web sitenizle ilgili kullanıcı sayısı ve oturum sayısı gibi bazı kullanım bilgilerini görebilirsiniz.

Kullanıcı Analizi sekmesinde bir metrik seçebilir, ardından farklı kullanım ve iş metriklerine göre kullanıcı sayısının yanı sıra metrik yüzdelik diliminin dökümünü alabilirsiniz.

Sayfa Yolu Analizi sekmesi, web sitenizdeki sorunlu alanları belirlemenize yardımcı olur. Burada, genel bakışı görmek için bir metrik seçebilirsiniz. Ancak y ekseninde yüzdelik değer ve x ekseninde kayıt sayısıyla tüm sayfa yollarının dağılım haritasını da görürsünüz. Dağılım haritası, beklenen metriği değerlerinin altında olan sayfaları belirlemenize yardımcı olabilir. Sayfa yolu tablosunun dağılım grafiğini kullanarak sayfaları seçtikten sonra, Hata Ayıklama Hedefi tablosunu görüntüleyerek sorunlu alanı daha ayrıntılı olarak inceleyebilirsiniz.

Gelir Analizi sekmesi, işletmenizi ve performans metriklerini aynı yerden nasıl izleyebileceğinize dair bir örnektir. Bu bölümde, kullanıcının satın alma işlemi gerçekleştirdiği tüm oturumlar gösterilir. Belirli bir oturum sırasında elde edilen gelir ile kullanıcı deneyimini karşılaştırabilirsiniz .

İleri düzey kullanım

Veri kümesini daha iyi tanıdıkça kontrol panelini düzenleyebilir, daha zengin ve hedeflenmiş analizler için kendi grafiklerinizi ekleyebilirsiniz. Kontrol panelini daha kullanışlı hale getirmek için aşağıdaki adımları uygulayabilirsiniz:

  • Güncellenmiş veriler almak için BigQuery'de planlı sorgu oluşturun. Daha önce çalıştırdığımız somutlaştırma sorgusu, verilerinizin yalnızca o anki anlık görüntüsünü alır. Kontrol panelinizin yeni verilerle güncel kalmasını istiyorsanız her gün çalıştırılacak planlanmış bir sorgu çalıştırabilir ve gerçekleştirilmiş tablonuzu yeni verileri ekleyebilirsiniz.
  • İşletme analizleri için birinci taraf verilerini (ör. CRM) birleştirin. Somutlaştırılmış tabloya user_id'yi ayrı bir sütun olarak ekleyebilirsiniz. Bu sayede birinci taraf verilerinizi birleştirebilirsiniz. Birinci taraf verileriniz BigQuery'de yoksa verileri yükleyebilir veya federe veri kaynağı kullanabilirsiniz.
  • Site veya uygulama sürümünüzü Google Analytics'e gönderdiğiniz verilerde parametre olarak raporlayın ve somutlaştırılmış tabloya sütun olarak ekleyin. Ardından, sürüm değişikliklerinin performansı nasıl etkilediğini daha kolay görebilmek için bu sürüm verilerini grafiklerinize boyut olarak ekleyebilirsiniz.
  • Doğrudan sorgu veya kontrol paneli aracılığıyla veri kümesinin önemli ölçüde yoğun bir şekilde kullanılmasını bekliyorsanız BigQuery BI Engine'in ücretli sürümünü kullanmayı deneyebilirsiniz.

Özet

Bu yayında, sahada toplanan gerçek kullanıcı verileriyle performansı ölçmek ve hata ayıklamak için Google Analytics 4 ve BigQuery'nin temel kullanım alanları ele alınmıştır. Verileri görselleştirmeyi mümkün olduğunca kolaylaştırmak için Looker Studio ve Web Vitals Bağlayıcısı'nı kullanarak otomatik raporların ve kontrol panellerinin nasıl oluşturulacağı da açıklandı.

Bu yayından çıkarılan bazı önemli noktalar:

  • Performansı gerçek kullanıcı verileriyle ölçmek, sitenizi anlamak, hata ayıklamak ve optimize etmek için kritik öneme sahiptir.
  • Performans metrikleriniz ve işletme metrikleriniz aynı sistemde olduğunda daha ayrıntılı analizler elde edebilirsiniz. Google Analytics ve BigQuery bunu mümkün kılar.
  • Ham Google Analytics verilerinin BigQuery'ye aktarılması, muhtemelen zaten bildiğiniz bir sorgu dilini kullanarak derinlemesine ve özel analiz için sınırsız potansiyel sunar.
  • Google, raporlarınızı tam olarak oluşturulmalarını istediğiniz şekilde oluşturmanıza olanak tanıyan Looker Studio gibi çeşitli API'lere ve görselleştirme araçlarına sahiptir.