Mengukur dan melakukan debug performa dengan Google Analytics 4 dan BigQuery

Pelajari cara mengirimkan data Web Vitals ke properti Google Analytics 4 dan mengekspor data tersebut untuk dianalisis di BigQuery dan Looker Studio.

Google menyediakan sejumlah alat—Search Console, PageSpeed Insights (PSI), dan Chrome User Experience Report (CrUX)—yang memungkinkan developer melihat performa situs mereka terhadap metrik Core Web Vitals untuk pengguna sesungguhnya di kolom.

Alat ini sangat bagus karena memberi Anda gambaran mendetail tentang performa pengguna sebenarnya di situs Anda, dan tidak memerlukan penyiapan untuk mulai digunakan.

Namun, ada beberapa alasan penting mengapa Anda tidak ingin hanya mengandalkan alat ini untuk mengukur performa situs:

  • Alat berbasis CrUX melaporkan data berdasarkan periode 28 hari bulanan atau sebelumnya. Artinya, Anda harus menunggu lama setelah melakukan perubahan sebelum dapat melihat hasilnya.
  • Alat berbasis CrUX hanya dapat disegmentasikan menurut jumlah dimensi yang terbatas, seperti negara, jenis koneksi, dan kategori perangkat (desktop atau seluler). Anda tidak dapat mengelompokkan data berdasarkan dimensi yang spesifik untuk bisnis Anda (misalnya: pengguna yang berinteraksi, pengguna dalam grup eksperimen tertentu, dsb.).
  • Alat berbasis CrUX dapat mengetahui apa performa Anda, tetapi tidak tahu alasannya. Dengan alat analisis, Anda dapat mengirim data tambahan untuk membantu melacak dan men-debug masalah.

Karena alasan ini, sebaiknya semua pemilik situs memantau metrik Core Web Vitals menggunakan alat analisis yang sudah ada. Postingan ini menjelaskan cara menggunakan alat gratis yang ditawarkan Google.

Setelah semuanya disiapkan, Anda dapat membuat dasbor seperti ini:

Screenshot laporan Web Vitals Connector

Screenshot laporan Web Vitals Connector

Jika Anda ingin mendapatkan ringkasan visual dari semua langkah yang diuraikan di sini, lihat pembicaraan kami dari Google I/O '21:

Ukur

Mengukur performa dapat selalu dilakukan dengan Google Analytics menggunakan metrik kustom, tetapi ada beberapa fitur baru di Google Analytics 4 (GA4) yang secara khusus menarik minat developer.

Meskipun antarmuka web Google Analytics memiliki alat analisis yang canggih, sulit untuk mengalahkan kemampuan dan fleksibilitas akses data peristiwa mentah menggunakan bahasa kueri yang mungkin sudah Anda ketahui.

Untuk mulai mengukur Core Web Vitals menggunakan Google Analytics 4 dan BigQuery, Anda harus melakukan tiga hal:

  1. Buat properti Google Analytics 4 dan project BigQuery.
  2. Aktifkan BigQuery Export di konfigurasi properti Google Analytics Anda, sehingga semua data yang Anda terima akan otomatis diisi di tabel project BigQuery.
  3. Tambahkan library JavaScript web-vitals ke situs Anda, sehingga Anda dapat mengukur metrik Core Web Vitals dan mengirim data ke Google Analytics 4, termasuk data atribusi.

Analisis

Setelah siap, Anda akan melihat data peristiwa terisi di antarmuka BigQuery, dan Anda dapat membuat kueri data seperti ini:

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

Berikut adalah pratinjau hasil kueri tersebut:

Data peristiwa Web Vitals di BigQuery

Membuat kueri data Web Vitals

Sebelum mulai membuat kueri data peristiwa Web Vitals, penting untuk memahami cara data digabungkan.

Hal yang paling penting untuk dipahami adalah, dalam beberapa kasus, beberapa peristiwa dapat diterima untuk metrik yang sama, di halaman yang sama. Hal ini dapat terjadi jika nilai metrik berubah dan nilai yang diperbarui dilaporkan (kejadian umum pada CLS).

Untuk peristiwa Web Vitals, nilai terakhir yang dikirim adalah nilai yang paling akurat, jadi sebelum melakukan analisis apa pun, sebaiknya filter nilai tersebut saja. Cuplikan kode yang disediakan oleh library JavaScript web-vitals untuk mengirim data ke Google Analytics 4 mencakup pengiriman ID unik per metrik, sehingga Anda dapat menggunakan kueri berikut untuk membatasi hasil hanya ke nilai yang terakhir diterima untuk setiap ID metrik:

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

Perhatikan bahwa semua kueri lain yang dirujuk dalam postingan ini akan dimulai dengan subkueri ini.

Contoh kueri

Beberapa bagian selanjutnya menunjukkan beberapa contoh kueri Data Web umum yang mungkin ingin Anda jalankan.

LCP, INP, dan CLS dengan persentil 75% (p75) di seluruh situs

# 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

Semua nilai LCP individual dari tertinggi hingga terendah

# 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 halaman teratas dengan CLS terburuk (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

Men-debug

Kueri sebelumnya menunjukkan cara membuat kueri data metrik Data Web, yang berguna untuk memahami performa Anda saat ini dan trennya dari waktu ke waktu. Namun, apa yang dapat dilakukan jika performa Anda lebih buruk dari yang diharapkan, tetapi Anda tidak yakin mengapa?

Mengetahui berapa skor tidak akan membantu jika Anda tidak dapat mengambil tindakan dan memperbaiki masalah.

Performa debug di kolom menjelaskan cara mengirim informasi debug tambahan dengan data analisis. Jika Anda mengikuti petunjuk yang dijelaskan dalam postingan tersebut, Anda akan melihat bahwa informasi debug juga muncul di BigQuery.

Contoh kueri

Kueri berikut menunjukkan cara menggunakan parameter peristiwa debug_target untuk membantu mengidentifikasi penyebab utama masalah performa.

Elemen teratas yang berkontribusi pada CLS

debug_target adalah string pemilih CSS yang sesuai dengan elemen di halaman yang paling relevan dengan nilai metrik.

Dengan CLS, debug_target akan merepresentasikan elemen terbesar dari pergeseran tata letak terbesar yang berkontribusi pada nilai CLS. Jika tidak ada elemen yang digeser, nilai debug_target akan menjadi null.

Kueri berikut akan mencantumkan halaman dari yang terburuk hingga terbaik berdasarkan CLS-nya di persentil ke-75, yang dikelompokkan menurut 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

Hasil kueri untuk elemen teratas yang berkontribusi pada CLS

Mengetahui elemen apa pada halaman yang berubah akan mempermudah proses identifikasi dan memperbaiki penyebab utama masalah.

Perlu diingat bahwa elemen yang dilaporkan di sini mungkin bukan elemen yang sama dengan yang Anda lihat berubah saat Anda men-debug halaman secara lokal. Itulah sebabnya sangat penting untuk mengambil data ini sejak awal. Sangat sulit untuk memperbaiki hal-hal yang tidak Anda sadari adalah masalah!

Men-debug metrik lainnya

Kueri sebelumnya menunjukkan hasil untuk metrik CLS, tetapi teknik yang sama persis dapat digunakan untuk melaporkan target debug untuk LCP dan INP. Cukup ganti klausa where dengan metrik yang relevan untuk di-debug:

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

Sekali lagi, Anda dapat melihat Performa debug di kolom untuk mendapatkan petunjuk tentang cara mengumpulkan dan mengirim informasi debug untuk setiap metrik Core Web Vitals.

Memvisualisasikan

Mungkin sulit untuk mendapatkan insight hanya dengan melihat hasil kueri saja. Misalnya, kueri berikut mencantumkan nilai persentil ke-75 harian untuk LCP dalam set data.

# 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

Dari hasil kueri ini, sulit untuk mengidentifikasi tren atau pencilan hanya dengan melihat datanya.

Hasil kueri nilai metrik harian

Dalam kasus seperti itu, memvisualisasikan data dapat membantu Anda mendapatkan wawasan dengan lebih cepat.

Memvisualisasikan hasil kueri di Looker Studio

BigQuery menyediakan cara cepat untuk memvisualisasikan hasil kueri apa pun melalui Data Studio. Looker Studio adalah alat dasbor dan visualisasi data yang gratis digunakan. Untuk memvisualisasikan hasil kueri, setelah menjalankan kueri di UI BigQuery, klik tombol Explore Data dan pilih Explore with Looker Studio.

Opsi Jelajahi dengan Looker Studio di BigQuery

Tindakan ini akan membuat link langsung dari BigQuery ke Looker Studio dalam tampilan eksplorasi. Dalam tampilan ini, Anda dapat memilih kolom yang ingin divisualisasikan, memilih jenis diagram, menyiapkan filter, dan membuat diagram ad hoc untuk analisis visual yang cepat. Dari hasil kueri sebelumnya, Anda dapat membuat diagram garis ini untuk melihat tren nilai LCP dari waktu ke waktu:

Diagram garis nilai LCP harian di Looker Studio

Dengan link langsung antara BigQuery dan Looker Studio ini, Anda dapat membuat diagram cepat dari semua kueri dan melakukan analisis visual. Namun, jika ingin melakukan analisis tambahan, sebaiknya lihat beberapa diagram di dasbor interaktif untuk mendapatkan tampilan yang lebih menyeluruh atau untuk melihat perincian data. Dengan memiliki dasbor yang praktis, Anda tidak perlu menulis kueri dan membuat diagram secara manual setiap kali ingin menganalisis metrik.

Anda dapat membuat dasbor di Looker Studio menggunakan konektor BigQuery native. Untuk melakukannya, buka datastudio.google.com, buat sumber data baru, pilih konektor BigQuery, lalu pilih set data yang ingin Anda gunakan:

Menggunakan konektor native BigQuery di Looker Studio

Mewujudkan data Web Vitals

Saat membuat dasbor data peristiwa Web Vitals seperti yang dijelaskan sebelumnya, menggunakan set data ekspor Google Analytics 4 secara langsung tidak efisien. Karena struktur data GA4 dan prapemrosesan yang diperlukan untuk metrik Data Web, bagian dari kueri Anda akan berjalan beberapa kali. Hal ini menimbulkan dua masalah: performa dasbor dan biaya BigQuery.

Anda dapat menggunakan mode sandbox BigQuery tanpa biaya. Dengan paket penggunaan gratis BigQuery, 1 TB data kueri pertama yang diproses setiap bulan tidak dikenai biaya. Untuk metode analisis yang dibahas dalam postingan ini, kecuali jika Anda menggunakan set data yang sangat besar atau sering membuat kueri set data secara rutin, Anda dapat tetap berada dalam batas gratis ini setiap bulan. Namun, jika Anda memiliki situs dengan traffic tinggi dan ingin memantau berbagai metrik secara rutin menggunakan dasbor interaktif yang cepat, sebaiknya lakukan pemrosesan awal dan realisasikan data web vitals Anda sambil memanfaatkan fitur efisiensi BigQuery seperti partisi, pengelompokan, dan cache.

Skrip berikut akan melakukan prapemrosesan data BigQuery (tabel sumber) dan membuat tabel terwujud (tabel target). Saat menggunakan kueri ini untuk set data Anda sendiri, Anda juga dapat menentukan rentang tanggal untuk tabel sumber guna menurunkan jumlah data yang diproses.

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

Set data terwujud ini memiliki beberapa keuntungan:

  • Struktur data sudah diratakan dan lebih mudah untuk dikueri.
  • Data ini hanya mempertahankan peristiwa Web Vitals dari set data GA4 asli.
  • ID sesi, jenis pengguna (baru versus yang kembali), dan informasi engagement sesi tersedia langsung di kolom.
  • Tabel partitioned berdasarkan tanggal dan dikelompokkan berdasarkan nama metrik. Hal ini biasanya mengurangi jumlah data yang diproses untuk setiap kueri.
  • Karena Anda tidak perlu menggunakan karakter pengganti untuk membuat kueri tabel ini, hasil kueri dapat di-cache hingga 24 jam. Hal ini mengurangi biaya dari pengulangan kueri yang sama.
  • Jika menggunakan mesin BigQuery BI, Anda dapat menjalankan fungsi dan operator SQL yang dioptimalkan pada tabel ini.

Anda dapat langsung mengkueri tabel terwujud ini dari dalam UI BigQuery atau menggunakannya di Looker Studio menggunakan konektor BigQuery.

Menggunakan Web Vitals Connector

Karena membuat dasbor dari awal memakan waktu, kami mengembangkan solusi terpaket yang akan membuat dasbor template untuk Anda. Pertama, pastikan Anda telah mewujudkan tabel Data Web menggunakan kueri sebelumnya. Kemudian, akses konektor Web Vitals untuk Looker Studio menggunakan link ini: goo.gle/web-vitals-connector

Setelah memberikan otorisasi satu kali, Anda akan melihat layar konfigurasi berikut:

Layar otorisasi Web Vitals Connector

Berikan ID tabel BigQuery yang terwujud (yaitu tabel target) dan project ID penagihan BigQuery Anda. Setelah mengklik hubungkan, Looker Studio akan membuat dasbor template baru dan mengaitkan data Anda dengan dasbor tersebut. Anda dapat mengedit, mengubah, dan membagikan dasbor sesuai keinginan. Jika membuat dasbor satu kali, Anda tidak perlu mengunjungi link konektor lagi, kecuali jika Anda ingin membuat beberapa dasbor dari set data yang berbeda.

Saat membuka dasbor, Anda dapat melihat tren harian metrik Data Web dan beberapa informasi penggunaan untuk situs seperti pengguna dan sesi, di tab Ringkasan.

Di tab Analisis Pengguna, Anda dapat memilih metrik, lalu mendapatkan perincian persentil metrik serta jumlah pengguna berdasarkan berbagai metrik penggunaan dan bisnis.

Tab Analisis Jalur Halaman akan membantu Anda mengidentifikasi area masalah di situs. Di sini, Anda dapat memilih metrik untuk melihat ringkasan. Anda juga akan melihat peta sebar semua jalur halaman dengan nilai persentil pada sumbu y dan mencatat jumlah pada sumbu x. Peta sebar dapat membantu mengidentifikasi halaman yang memiliki nilai metrik yang lebih rendah dari yang diharapkan. Setelah memilih halaman menggunakan diagram sebar pada tabel Page path, Anda dapat melihat perincian area masalah lebih lanjut dengan melihat tabel Debug Target.

Tab Analisis Pendapatan adalah contoh cara memantau metrik bisnis dan performa di tempat yang sama. Bagian ini merencanakan semua sesi saat pengguna melakukan pembelian. Anda dapat membandingkan pendapatan yang diperoleh dengan pengalaman pengguna selama sesi tertentu .

Penggunaan lanjutan

Saat makin terbiasa dengan set data, Anda dapat mengedit dasbor dan menambahkan diagram sendiri untuk analisis yang lebih terperinci dan bertarget. Untuk membuat dasbor lebih berguna, Anda dapat melakukan langkah-langkah berikut:

  • Siapkan kueri terjadwal di BigQuery untuk mendapatkan data yang diperbarui. Kueri materialisasi yang kita jalankan sebelumnya hanya mengambil snapshot data Anda saat itu. Jika ingin dasbor terus diperbarui dengan data baru, Anda dapat menjalankan kueri terjadwal yang akan berjalan setiap hari dan menambahkan tabel baru dengan data baru.
  • Gabungkan data pihak pertama (misalnya, CRM) untuk mendapatkan insight bisnis. Dalam tabel terwujud, Anda dapat menambahkan user_id sebagai kolom terpisah. Hal ini akan memungkinkan Anda untuk menggabungkan data pihak pertama Anda. Jika data pihak pertama Anda belum ada di BigQuery, Anda dapat memuat data atau menggunakan sumber data gabungan.
  • Laporkan situs atau versi aplikasi Anda sebagai parameter dalam data yang Anda kirim ke Google Analytics, lalu tambahkan sebagai kolom di tabel terwujud. Kemudian, Anda dapat menambahkan data versi tersebut sebagai dimensi dalam diagram untuk memudahkan Anda melihat perubahan versi yang memengaruhi performa.
  • Jika Anda memperkirakan penggunaan set data yang signifikan melalui kueri langsung atau dasbor, Anda dapat mencoba menggunakan BigQuery BI Engine versi berbayar.

Ringkasan

Postingan ini membahas dasar-dasar cara menggunakan Google Analytics 4 dan BigQuery untuk mengukur dan men-debug performa dengan data pengguna nyata yang dikumpulkan di kolom. Bagian ini juga menjelaskan cara membuat laporan dan dasbor otomatis menggunakan Looker Studio dan Web Vitals Connector agar memvisualisasikan data menjadi semudah mungkin.

Beberapa poin penting dari postingan ini:

  • Mengukur performa dengan data pengguna yang sebenarnya sangat penting untuk memahami, melakukan proses debug, dan mengoptimalkan situs Anda.
  • Anda bisa mendapatkan insight yang lebih mendalam saat metrik performa dan metrik bisnis Anda berada di sistem yang sama. Google Analytics dan BigQuery memungkinkan hal ini.
  • BigQuery Export data Google Analytics mentah memberi Anda potensi tak terbatas untuk analisis kustom yang mendalam menggunakan bahasa kueri yang mungkin sudah Anda ketahui.
  • Google memiliki sejumlah API dan alat visualisasi seperti Looker Studio yang memberi Anda kebebasan untuk membuat laporan sesuai keinginan Anda.