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 Laporan Pengalaman Pengguna Chrome (CrUX)—yang memungkinkan developer melihat performa situs mereka berdasarkan metrik Core Web Vitals untuk pengguna sebenarnya di lapangan.

Alat ini sangat bagus karena memberikan tampilan tingkat tinggi tentang performa pengguna sebenarnya di situs Anda, dan tidak memerlukan penyiapan apa pun untuk mulai menggunakannya.

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

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

Oleh karena itu, sebaiknya semua pemilik situs memantau metrik Core Web Vitals menggunakan alat analisis yang sudah ada. Postingan 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 ingin mendapatkan ringkasan visual dari semua langkah yang diuraikan di sini, lihat pembicaraan kami dari Google I/O '21:

Ukur

Anda selalu dapat mengukur performa dengan Google Analytics menggunakan metrik kustom, tetapi ada beberapa fitur baru di Google Analytics 4 (GA4) yang akan sangat menarik bagi 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 dari kueri tersebut:

Data peristiwa Data Web di BigQuery

Membuat kueri data Data Web

Sebelum mulai membuat kueri data peristiwa Web Vitals, sebaiknya Anda 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 (hal yang umum terjadi dengan CLS).

Untuk peristiwa Web Vitals, nilai terakhir yang dikirim selalu merupakan nilai yang paling akurat, jadi sebelum melakukan analisis apa pun, penting untuk memfilter hanya 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', '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 pada persentil ke-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 ke 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

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 Anda lakukan jika performa Anda lebih buruk dari yang diharapkan, tetapi Anda tidak yakin alasannya?

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

Men-debug performa di lapangan menjelaskan cara mengirim informasi debug tambahan dengan data analisis Anda. Jika mengikuti petunjuk yang dijelaskan dalam postingan tersebut, Anda akan melihat informasi debug tersebut 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 yang mengalami perubahan di halaman akan memudahkan Anda mengidentifikasi dan memperbaiki akar 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 penting untuk mengambil data ini sejak awal. Memperbaiki masalah yang tidak Anda sadari sangat sulit.

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 klausul where dengan metrik yang relevan untuk melakukan debug:

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

Sekali lagi, Anda dapat membaca Men-debug performa di lapangan untuk mengetahui petunjuk 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', '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 outlier hanya dengan melihat data.

Hasil kueri nilai metrik harian

Dalam kasus tersebut, memvisualisasikan data dapat membantu Anda mendapatkan insight dengan lebih cepat.

Memvisualisasikan hasil kueri di Looker Studio

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

Opsi Explore with 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 secara bertahap:

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, Anda mungkin ingin melihat beberapa diagram di dasbor interaktif untuk mendapatkan tampilan yang lebih menyeluruh atau untuk melihat perincian data. Dengan adanya dasbor yang praktis ini, 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 sebelumnya, menggunakan set data ekspor Google Analytics 4 secara langsung bukanlah cara yang efisien. Karena struktur data GA4 dan pra-pemrosesan yang diperlukan untuk metrik Data Web, bagian kueri Anda akan berakhir dengan 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 per bulan tidak akan dipungut biaya. Untuk metode analisis yang dibahas dalam postingan ini, Anda dapat tetap berada dalam batas gratis ini setiap bulan kecuali Anda menggunakan set data yang sangat besar atau sering membuat kueri set data secara rutin. 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 memproses data BigQuery (tabel sumber) terlebih dahulu dan membuat tabel yang diwujudkan (tabel target). Saat menggunakan kueri ini untuk set data Anda sendiri, sebaiknya tentukan juga 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 diratakan 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 engagement sesi tersedia langsung di kolom.
  • Tabel tersebut dipartisi berdasarkan tanggal dan dikelompokkan berdasarkan nama metrik. Hal ini biasanya mengurangi jumlah data yang diproses untuk setiap kueri.
  • Anda tidak perlu menggunakan karakter pengganti untuk membuat kueri pada tabel ini sehingga hasil kueri dapat di-cache hingga 24 jam. Hal ini dapat mengurangi biaya dari pengulangan kueri yang sama.
  • Jika menggunakan BigQuery BI Engine, Anda dapat menjalankan fungsi dan operator SQL yang dioptimalkan pada tabel ini.

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

Menggunakan Web Vitals Connector

Karena membuat dasbor dari awal memakan banyak 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 ingin membuat beberapa dasbor dari berbagai set data.

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 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 ringkasan. 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 di bawah perkiraan. Setelah memilih halaman menggunakan diagram sebar pada tabel Jalur halaman, Anda dapat melihat perincian lebih lanjut pada area masalah 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

Setelah lebih memahami set data, Anda dapat mengedit dasbor dan menambahkan diagram Anda sendiri untuk analisis yang lebih kaya dan ditargetkan. Agar dasbor lebih berguna, Anda dapat melakukan langkah-langkah berikut:

  • Siapkan kueri terjadwal di BigQuery untuk mendapatkan data yang diperbarui. Kueri materialisasi yang kami jalankan sebelumnya hanya mengambil snapshot data Anda pada saat itu. Jika ingin terus memperbarui dasbor dengan data baru, Anda dapat menjalankan kueri terjadwal yang akan berjalan setiap hari dan menambahkan tabel yang diwujudkan dengan data baru.
  • Menggabungkan data pihak pertama (misalnya CRM) untuk mendapatkan insight bisnis. Dalam tabel terwujud, Anda dapat menambahkan user_id sebagai kolom terpisah. Tindakan ini akan memungkinkan Anda menggabungkan data 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 yang diwujudkan. Kemudian, Anda dapat menambahkan data versi tersebut sebagai dimensi dalam diagram untuk mempermudah melihat dampak perubahan versi terhadap performa.
  • Jika Anda memperkirakan penggunaan set data yang sangat berat 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 sebenarnya yang dikumpulkan di lapangan. 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 sebenarnya sangat penting untuk memahami, men-debug, dan mengoptimalkan situs Anda.
  • Anda bisa mendapatkan insight yang lebih mendalam jika metrik performa dan metrik bisnis berada dalam sistem yang sama. Google Analytics dan BigQuery memungkinkan hal ini.
  • Ekspor BigQuery dari data mentah Google Analytics memberi Anda potensi yang tidak terbatas untuk analisis kustom 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.