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—Konsol Search, PageSpeed Insights (PSI), dan Laporan Pengalaman Pengguna Chrome (CrUX)—yang memungkinkan developer melihat performa situs mereka terhadap metrik Vital Web Core untuk pengguna sebenarnya di kolom.

Alat-alat ini sangat bagus karena memberi Anda gambaran tingkat tinggi tentang performa situs yang nyata bagi pengguna, dan sama sekali tidak memerlukan penyiapan untuk mulai digunakan.

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

  • Alat berbasis CrUX melaporkan data dalam periode bulanan atau 28 hari sebelumnya. Ini berarti 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 menurut dimensi khusus untuk bisnis Anda (misalnya: pengguna yang berinteraksi, pengguna dalam grup eksperimen tertentu, dsb.).
  • Alat berbasis CrUX dapat memberi tahu performa, tetapi tidak dapat memberi 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 Data Web Inti menggunakan alat analisis yang sudah ada. Artikel ini menjelaskan cara menggunakan alat gratis yang ditawarkan oleh Google untuk melakukannya.

Setelah menyiapkan semuanya, Anda dapat membuat dasbor seperti ini:

Screenshot laporan Web Vitals Connector

Screenshot laporan Web Vitals Connector

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

Ukur

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

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

Untuk mulai mengukur Data Web Inti menggunakan Google Analytics 4 dan BigQuery, Anda perlu 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 dalam tabel project BigQuery Anda.
  3. Tambahkan library JavaScript web-vitals ke situs Anda, sehingga Anda dapat mengukur metrik Data Web Inti dan mengirimkan data ke Google Analytics 4.

Analisis

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

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

Berikut adalah pratinjau hasil kueri tersebut:

Data peristiwa Data Web di BigQuery

Membuat kueri data Data Web

Sebelum mulai membuat kueri data peristiwa Data Web, Anda perlu memahami cara data digabungkan.

Hal terpenting yang perlu 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 (kemunculan umum dengan CLS).

Untuk peristiwa Data Web, nilai terakhir yang dikirim selalu merupakan nilai yang paling akurat. Jadi, sebelum melakukan analisis, sebaiknya filter hanya untuk nilai tersebut. 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', 'FID', '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.

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

Contoh kueri

LCP, FID, dan CLS pada 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', 'FID', '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 masing-masing dari yang 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', 'FID', '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', 'FID', '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', 'FID', '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 di atas menunjukkan cara membuat kueri data metrik Data Web, yang berguna untuk memahami performa saat ini dan trennya dari waktu ke waktu. Namun, apa yang dapat dilakukan jika performa lebih buruk dari yang diharapkan, tetapi Anda tidak yakin mengapa?

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

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

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

Contoh kueri

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 mewakili 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 pada 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', 'FID', '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 bergeser akan mempermudah identifikasi dan perbaikan akar penyebab masalahnya.

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

Men-debug metrik lainnya

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

WHERE metric_name = 'CLS'
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 Data Web Inti.

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', 'FID', '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 tersebut, sulit untuk mengidentifikasi tren atau pencilan hanya dengan melihat data.

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 melalui Data Studio. Looker Studio adalah alat dasbor dan visualisasi data yang gratis untuk digunakan. Untuk memvisualisasikan hasil kueri, setelah menjalankan kueri di UI BigQuery, klik tombol Explore Data lalu pilih Explore with Looker Studio.

Menjelajah dengan opsi 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 di atas, 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 kueri apa pun dan melakukan analisis visual. Namun, jika ingin melakukan analisis tambahan, Anda dapat melihat beberapa diagram di dasbor interaktif untuk mendapatkan tampilan yang lebih menyeluruh atau untuk melihat perincian data. Dengan dasbor 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 Data Web

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

Anda dapat menggunakan mode sandbox BigQuery secara gratis. Dengan paket penggunaan gratis BigQuery, gratis 1 TB data kueri pertama yang diproses setiap bulan. 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 secara rutin memantau berbagai metrik menggunakan dasbor interaktif yang cepat, sebaiknya lakukan pra-pemrosesan dan buat data web vitals sambil memanfaatkan fitur efisiensi BigQuery seperti partisi, pengelompokan, dan caching.

Skrip berikut akan memproses pra-pemrosesan data BigQuery Anda (tabel sumber) dan membuat tabel terwujud (tabel target). Saat menggunakan kueri ini untuk set data Anda sendiri, sebaiknya tentukan 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', 'FID', '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');

{i>Dataset<i} yang terwujud ini memiliki beberapa keuntungan:

  • Struktur data disatukan dan lebih mudah untuk dikueri.
  • Data ini hanya mempertahankan peristiwa Data Web dari set data GA4 asli.
  • ID sesi, jenis pengguna (baru versus yang kembali), dan informasi interaksi sesi tersedia langsung dalam kolom.
  • Tabel partitioned menurut 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 pengulangan kueri yang sama.
  • Jika menggunakan mesin BI BigQuery, Anda dapat menjalankan fungsi dan operator SQL yang dioptimalkan di tabel ini.

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

Menggunakan Konektor Data Web

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 di atas. Kemudian, akses konektor Data Web 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 ID project penagihan BigQuery Anda. Setelah mengklik hubungkan, Looker Studio akan membuat dasbor dengan 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 Anda, seperti pengguna dan sesi, di tab Ringkasan.

Di tab Analisis Pengguna, Anda dapat memilih sebuah 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 Anda. Di sini, Anda dapat memilih metrik untuk melihat ringkasannya. Namun, Anda juga akan melihat peta sebar semua jalur halaman dengan nilai persentil pada sumbu y dan jumlah data pada sumbu x. Peta sebar dapat membantu mengidentifikasi halaman yang memiliki nilai metrik lebih rendah dari yang diharapkan. Setelah memilih halaman menggunakan diagram sebar dari tabel Jalur halaman, Anda dapat melihat perincian area masalah lebih lanjut dengan melihat tabel Target Debug.

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

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

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

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 lapangan. Bagian ini juga menjelaskan cara membuat laporan dan dasbor otomatis menggunakan Looker Studio dan Konektor Data Web agar visualisasi data menjadi semudah mungkin.

Beberapa poin penting dari postingan ini:

  • Mengukur performa dengan data pengguna 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 dalam sistem yang sama. Google Analytics dan BigQuery memungkinkan hal ini.
  • BigQuery Export data mentah Google Analytics 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 persis seperti yang Anda inginkan.