Leistung mit Google Analytics 4 und BigQuery messen und Fehler beheben

Erfahren Sie, wie Sie Web Vitals-Daten an Google Analytics 4-Properties senden und diese für Analysen in BigQuery und Looker Studio exportieren.

Google bietet eine Reihe von Tools an, mit denen Entwickler die Leistung ihrer Websites im Hinblick auf die Core Web Vitals-Messwerte für ihre echten Nutzer in der Praxis analysieren können: Search Console, PageSpeed Insights (PSI) und der Bericht zur Nutzererfahrung in Chrome (CrUX).

Diese Tools sind insofern hilfreich, als sie Ihnen einen Überblick über die Leistung Ihrer Website aus Sicht echter Nutzer bieten. Außerdem sind sie absolut ohne Einrichtung einsatzbereit.

Es gibt jedoch einige wichtige Gründe, warum Sie sich nicht nur auf diese Tools verlassen sollten, um die Leistung Ihrer Website zu messen:

  • In CrUX-basierten Tools werden Daten entweder nach Monaten oder nach den letzten 28 Tagen erfasst. Das bedeutet, dass Sie nach einer Änderung lange warten müssen, bis Sie die Ergebnisse sehen.
  • CrUX-basierte Tools können nur nach einer begrenzten Anzahl von Dimensionen segmentiert werden, z. B. nach Land, Verbindungstyp und Gerätekategorie (Desktop oder Mobilgerät). Sie können die Daten nicht nach Dimensionen aufschlüsseln, die für Ihr Unternehmen spezifisch sind, z. B. nach aktiven Nutzern oder Nutzern in einer bestimmten Testgruppe.
  • Mit CrUX-basierten Tools können Sie zwar sehen, wie Ihre Leistung ist, aber nicht ermitteln, warum das so ist. Mit Analysetools können Sie zusätzliche Daten senden, um Probleme zu finden und zu beheben.

Aus diesen Gründen empfehlen wir allen Websiteinhabern, die Core Web Vitals-Messwerte mit ihrem vorhandenen Analysetool zu beobachten. In diesem Beitrag erfahren Sie, wie Sie mit kostenlosen Tools von Google genau das tun können.

Sobald Sie alles eingerichtet haben, können Sie Dashboards wie diese erstellen:

Screenshot des Web Vitals-Connector-Berichts

Screenshot des Web Vitals-Connector-Berichts

Eine visuelle Übersicht über alle hier beschriebenen Schritte finden Sie in unserem Vortrag von der Google I/O '21:

Messen

Die Leistung lässt sich in Google Analytics schon immer mithilfe von benutzerdefinierten Messwerten messen. In Google Analytics 4 (GA4) gibt es jedoch einige neue Funktionen, die vor allem für Entwickler interessant sind.

Die Google Analytics-Weboberfläche bietet zwar leistungsstarke Analysetools, aber der Zugriff auf Rohereignisdaten mit einer Abfragesprache, die Sie wahrscheinlich bereits kennen, ist noch leistungsfähiger und flexibler.

Wenn Sie Core Web Vitals mit Google Analytics 4 und BigQuery erfassen möchten, müssen Sie drei Dinge tun:

  1. Erstellen Sie eine Google Analytics 4-Property und ein BigQuery-Projekt.
  2. Aktivieren Sie in der Konfiguration Ihrer Google Analytics-Property die Option BigQuery Export, damit alle empfangenen Daten automatisch in Ihren BigQuery-Projekttabellen eingefügt werden.
  3. Fügen Sie Ihrer Website die JavaScript-Bibliothek web-vitals hinzu, damit Sie die Core Web Vitals-Messwerte erfassen und die Daten einschließlich der Attributionsdaten an Google Analytics 4 senden können.

Analysieren

Nach der Einrichtung sollten Ereignisdaten in der BigQuery-Benutzeroberfläche angezeigt werden. Sie können die Daten dann so abfragen:

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

Hier eine Vorschau der Ergebnisse dieser Abfrage:

Web Vitals-Ereignisdaten in BigQuery

Web Vitals-Daten abfragen

Bevor Sie Ihre Web Vitals-Ereignisdaten abfragen, sollten Sie wissen, wie die Daten zusammengefasst werden.

Wichtig ist, dass in einigen Fällen für denselben Messwert auf derselben Seite mehrere Ereignisse empfangen werden können. Das kann passieren, wenn sich der Messwert ändert und ein aktualisierter Wert erfasst wird. Das ist bei CLS häufig der Fall.

Bei Web Vitals-Ereignissen ist der zuletzt gesendete Wert immer der genaueste. Bevor Sie eine Analyse ausführen, sollten Sie daher nur nach diesen Werten filtern. Das Code-Snippet der Web Vitals-JavaScript-Bibliothek zum Senden von Daten an Google Analytics 4 enthält das Senden einer eindeutigen ID pro Messwert. Mit der folgenden Abfrage können Sie Ihre Ergebnisse auf den jeweils zuletzt empfangenen Wert für jede Messwert-ID beschränken:

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

Alle anderen Abfragen, auf die in diesem Beitrag verwiesen wird, beginnen mit dieser Unterabfrage.

Beispielabfragen

In den nächsten Abschnitten finden Sie einige Beispiele für gängige Web Vitals-Abfragen, die Sie ausführen können.

LCP, INP und CLS liegen auf der gesamten Website im 75. Perzentil (p75).

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
 
SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
   
SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION
BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
     
ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
   
) = 1, true, false) AS is_last_received_value
   
FROM `bigquery_project_id.analytics_XXXXX.events_*`
   
WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX
BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
 
) WHERE is_last_received_value
)
# Main query logic
SELECT
  metric_name
,
  APPROX_QUANTILES
(metric_value, 100)[OFFSET(75)] AS p75,
  COUNT
(1) as count
FROM (
 
SELECT
    metric_name
,
    ROUND
((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
 
FROM web_vitals_events
)
GROUP BY 1

Alle einzelnen LCP-Werte vom höchsten zum niedrigsten

# 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

Die zehn Seiten mit dem schlechtesten CLS (Seite 75)

# 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

Fehlerbehebung

In den vorherigen Abfragen wird gezeigt, wie Sie die Messwertdaten für Web Vitals abfragen. So können Sie Ihre aktuelle Leistung und die Entwicklung im Zeitverlauf besser nachvollziehen. Was können Sie aber tun, wenn die Leistung schlechter als erwartet ist, Sie aber nicht sicher sind, warum das so ist?

Es ist nicht hilfreich zu wissen, wie hoch Ihre Bewertungen sind, wenn Sie nicht in der Lage sind, Maßnahmen zu ergreifen und die Probleme zu beheben.

Im Hilfeartikel Fehlerbehebung bei der Leistung im Außendienst erfahren Sie, wie Sie zusätzliche Informationen zur Fehlerbehebung mit Ihren Analysedaten senden. Wenn Sie der Anleitung in diesem Beitrag folgen, sollten die Informationen zur Fehlerbehebung auch in BigQuery angezeigt werden.

Beispielabfragen

Die folgenden Abfragen zeigen, wie Sie mit dem Ereignisparameter debug_target die Ursache von Leistungsproblemen ermitteln können.

Elemente mit dem größten Beitrag zur CLS

debug_target ist ein CSS-Selektor-String, der dem Element auf der Seite entspricht, das für den Messwert am relevantesten ist.

Bei der CLS steht debug_target für das größte Element der größten Layoutverschiebung, die zum CLS-Wert beigetragen hat. Wenn keine Elemente verschoben wurden, ist der Wert für debug_target null.

Mit der folgenden Abfrage werden Seiten nach ihrem CLS im 75. Perzentil aufgelistet, gruppiert nach 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

Abfrageergebnis für die wichtigsten Elemente, die zur CLS beitragen

Wenn Sie wissen, welche Elemente auf der Seite verschoben werden, lässt sich die Grundursache des Problems viel leichter ermitteln und beheben.

Beachten Sie, dass es sich bei den hier gemeldeten Elementen möglicherweise nicht um dieselben Elemente handelt, die sich beim lokalen Debuggen Ihrer Seiten verschieben. Deshalb ist es so wichtig, diese Daten überhaupt zu erfassen. Es ist sehr schwierig, Probleme zu beheben, die Sie nicht als solche erkennen.

Andere Messwerte debuggen

In der vorherigen Abfrage werden die Ergebnisse für den Messwert „CLS“ angezeigt. Mit derselben Methode können jedoch auch Berichte zu den Debug-Zielen für LCP und INP erstellt werden. Ersetzen Sie dazu einfach die Where-Bedingung durch den entsprechenden Messwert, den Sie debuggen möchten:

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

Wie Sie Debug-Informationen für jeden der Core Web Vitals-Messwerte erfassen und senden, erfahren Sie unter Fehlerbehebung im Feld.

Visualisieren

Es kann schwierig sein, nur anhand der Abfrageergebnisse Erkenntnisse zu gewinnen. Die folgende Abfrage listet beispielsweise die täglichen Werte des 75. Perzentil für LCP im Dataset auf.

# 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

Anhand dieser Abfrageergebnisse ist es schwierig, Trends oder Ausreißer nur anhand der Daten zu erkennen.

Abfrageergebnisse für den Tagesmesswert

In solchen Fällen können Sie durch Visualisierung der Daten schneller Erkenntnisse gewinnen.

Abfrageergebnisse in Looker Studio visualisieren

Mit BigQuery können Sie Abfrageergebnisse schnell in Data Studio visualisieren. Looker Studio ist ein kostenloses Tool für die Datenvisualisierung und das Dashboarding. Wenn Sie die Abfrageergebnisse visualisieren möchten, klicken Sie nach dem Ausführen der Abfrage in der BigQuery-Benutzeroberfläche auf die Schaltfläche Daten analysieren und wählen Sie Mit Looker Studio analysieren aus.

Option „Mit Looker Studio auswerten“ in BigQuery

Dadurch wird in der explorativen Datenanalyse eine direkte Verknüpfung von BigQuery nach Looker Studio erstellt. In dieser Ansicht können Sie die Felder auswählen, die Sie visualisieren möchten, Diagrammtypen auswählen, Filter einrichten und Ad-hoc-Diagramme für eine schnelle visuelle Analyse erstellen. Anhand der vorherigen Suchergebnisse können Sie dieses Liniendiagramm erstellen, um den Trend der LCP-Werte im Zeitverlauf zu sehen:

Liniendiagramm mit täglichen LCP-Werten in Looker Studio

Über diese direkte Verknüpfung zwischen BigQuery und Looker Studio können Sie schnell Diagramme aus Ihren Abfragen erstellen und visuelle Analysen durchführen. Wenn Sie jedoch zusätzliche Analysen durchführen möchten, sollten Sie sich mehrere Diagramme in einem interaktiven Dashboard ansehen, um einen umfassenderen Überblick zu erhalten oder die Daten aufzuschlüsseln. Mit einem praktischen Dashboard müssen Sie nicht jedes Mal, wenn Sie Ihre Messwerte analysieren möchten, Abfragen schreiben und Diagramme manuell erstellen.

Sie können ein Dashboard in Looker Studio mit dem nativen BigQuery-Connector erstellen. Rufen Sie dazu datastudio.google.com auf, erstellen Sie eine neue Datenquelle, wählen Sie den BigQuery-Connector und dann das Dataset aus, mit dem Sie arbeiten möchten:

Nativen BigQuery-Connector in Looker Studio verwenden

Web Vitals-Daten erfassen

Wenn Sie wie oben beschrieben Dashboards mit den Web Vitals-Ereignisdaten erstellen, ist es nicht effizient, den Google Analytics 4-Exportdatensatz direkt zu verwenden. Aufgrund der Struktur der GA4-Daten und der für die Web Vitals-Messwerte erforderlichen Vorverarbeitung werden Teile Ihrer Abfrage mehrmals ausgeführt. Das führt zu zwei Problemen: Dashboardleistung und BigQuery-Kosten.

Sie können den Sandbox-Modus von BigQuery kostenlos nutzen. Mit der kostenlosen Stufe von BigQuery sind die ersten 1 TB an Abfragedaten, die pro Monat verarbeitet werden, kostenlos. Sofern Sie nicht einen sehr großen Datensatz verwenden oder den Datensatz regelmäßig intensiv abfragen, sollten Sie mit den in diesem Beitrag beschriebenen Analysemethoden jeden Monat unter diesem kostenlosen Limit bleiben. Wenn Sie jedoch eine Website mit hohem Traffic haben und verschiedene Messwerte regelmäßig mithilfe eines schnellen interaktiven Dashboards im Blick behalten möchten, empfehlen wir, Ihre Web Vitals-Daten vorzuverarbeiten und zu materialisieren und dabei BigQuery-Effizienzfunktionen wie Partitionierung, Clustering und Caching zu nutzen.

Mit dem folgenden Script werden Ihre BigQuery-Daten (Quelltabelle) vorverarbeitet und eine materialisierte Tabelle (Zieltabelle) erstellt. Wenn Sie diese Abfrage für Ihren eigenen Datensatz verwenden, können Sie auch einen Zeitraum für die Quelltabelle definieren, um die Menge der verarbeiteten Daten zu verringern.

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

Dieser materialisierte Datensatz bietet mehrere Vorteile:

  • Die Datenstruktur ist flach und lässt sich leichter abfragen.
  • Es werden nur die Web Vitals-Ereignisse aus dem ursprünglichen GA4-Datensatz beibehalten.
  • Sitzungs-ID, Nutzertyp (neuer oder wiederkehrender Nutzer) und Informationen zur Sitzungsinteraktion sind direkt in den Spalten verfügbar.
  • Die Tabelle ist nach Datum partitioniert und nach Messwertname geclustert. Dadurch wird in der Regel die für jede Abfrage verarbeitete Datenmenge reduziert.
  • Da Sie keine Platzhalter verwenden müssen, um diese Tabelle abzufragen, können Abfrageergebnisse bis zu 24 Stunden lang im Cache gespeichert werden. So werden die Kosten für wiederholte Abfragen gesenkt.
  • Wenn Sie die BigQuery BI Engine verwenden, können Sie optimierte SQL-Funktionen und ‑Operatoren auf dieser Tabelle ausführen.

Sie können diese materialisierte Tabelle direkt über die BigQuery-Benutzeroberfläche abfragen oder mit dem BigQuery-Connector in Looker Studio verwenden.

Web Vitals-Connector verwenden

Da das Erstellen eines Dashboards von Grund auf zeitaufwendig ist, haben wir eine Lösung entwickelt, mit der Sie ein Vorlagen-Dashboard erstellen können. Achten Sie zuerst darauf, dass Sie Ihre Web Vitals-Tabelle mit der vorherigen Abfrage materialisiert haben. Rufen Sie dann über diesen Link den Web Vitals-Connector für Looker Studio auf: goo.gle/web-vitals-connector

Nachdem Sie eine einmalige Autorisierung erteilt haben, sollte der folgende Konfigurationsbildschirm angezeigt werden:

Autorisierungsbildschirm für den Web Vitals-Connector

Geben Sie die ID der materialisierten BigQuery-Tabelle (d.h. die Zieltabelle) und die ID Ihres BigQuery-Abrechnungsprojekts an. Nachdem Sie auf „Verbinden“ geklickt haben, wird in Looker Studio ein neues Dashboard mit Vorlage erstellt und Ihre Daten werden damit verknüpft. Sie können das Dashboard bearbeiten, ändern und freigeben. Wenn Sie ein Dashboard einmal erstellt haben, müssen Sie den Connector-Link nicht noch einmal aufrufen, es sei denn, Sie möchten mehrere Dashboards aus verschiedenen Datensätzen erstellen.

Auf dem Tab Zusammenfassung sehen Sie die täglichen Trends der Web Vitals-Messwerte und einige Nutzungsinformationen für Ihre Website, z. B. Nutzer und Sitzungen.

Auf dem Tab Nutzeranalyse können Sie einen Messwert auswählen und dann eine Aufschlüsselung des Messwert-Perzentilwerts sowie der Nutzeranzahl nach verschiedenen Nutzungs- und Geschäftsmesswerten abrufen.

Auf dem Tab Seitenpfadanalyse können Sie Problembereiche auf Ihrer Website identifizieren. Hier können Sie einen Messwert auswählen, um die Übersicht aufzurufen. Außerdem sehen Sie die Streuungskarte aller Seitenpfade mit dem Prozentrang auf der y-Achse und der Datensatzanzahl auf der x-Achse. Mithilfe der Streudiagramme können Sie Seiten mit niedrigeren als erwarteten Messwerten identifizieren. Nachdem Sie die Seiten mithilfe des Streudiagramms in der Tabelle Seitenpfad ausgewählt haben, können Sie die Problembereiche weiter aufschlüsseln, indem Sie sich die Tabelle Debug-Ziel ansehen.

Auf dem Tab Umsatzanalyse können Sie beispielsweise Ihre Unternehmens- und Leistungsmesswerte an einem Ort im Blick behalten. In diesem Abschnitt werden alle Sitzungen dargestellt, in denen der Nutzer etwas gekauft hat. Sie können den erzielten Umsatz mit der Nutzererfahrung während einer bestimmten Sitzung vergleichen .

Fortgeschrittene Nutzung

Wenn Sie sich mit dem Datensatz vertraut gemacht haben, können Sie das Dashboard bearbeiten und eigene Diagramme hinzufügen, um eine umfassendere und zielgerichtetere Analyse durchzuführen. So können Sie das Dashboard noch nützlicher machen:

  • Richten Sie eine geplante Abfrage in BigQuery ein, um aktuelle Daten zu erhalten. Die Materialisierungsabfrage, die wir zuvor ausgeführt haben, erstellt nur einen Snapshot Ihrer Daten zu diesem Zeitpunkt. Wenn Sie Ihr Dashboard mit neuen Daten aktualisieren möchten, können Sie eine geplante Abfrage ausführen, die jeden Tag ausgeführt wird, und die neuen Daten an die materialisierte Tabelle anhängen.
  • Selbst erhobene Daten (z.B. CRM-Daten) zusammenführen, um Geschäftsinformationen zu erhalten. In der materialisierten Tabelle können Sie user_id als separate Spalte hinzufügen. So können Sie Ihre selbst erhobenen Daten zusammenführen. Wenn sich Ihre selbst erhobenen Daten noch nicht in BigQuery befinden, können Sie sie entweder hochladen oder eine föderierte Datenquelle verwenden.
  • Geben Sie die Website- oder App-Version als Parameter in den Daten an, die Sie an Google Analytics senden, und fügen Sie sie als Spalte in die materialisierte Tabelle ein. Anschließend können Sie diese Versionsdaten als Dimension in Ihre Diagramme einfügen, um die Auswirkungen von Versionsänderungen auf die Leistung besser nachvollziehen zu können.
  • Wenn Sie eine stark erhöhte Nutzung des Datensatzes über eine direkte Abfrage oder das Dashboard erwarten, können Sie die kostenpflichtige Version der BigQuery BI-Engine verwenden.

Zusammenfassung

In diesem Beitrag haben wir die Grundlagen der Leistungsmessung und -behebung mit Google Analytics 4 und BigQuery anhand von Daten echter Nutzer erläutert. Außerdem wurde erläutert, wie Sie mit Looker Studio und dem Web Vitals-Connector automatisierte Berichte und Dashboards erstellen, um die Visualisierung der Daten so einfach wie möglich zu gestalten.

Die wichtigsten Erkenntnisse aus diesem Beitrag:

  • Die Leistung mit echten Nutzerdaten zu messen, ist entscheidend, um Ihre Website zu verstehen, zu beheben und zu optimieren.
  • Wenn sich Ihre Leistungsmesswerte und Geschäftsmesswerte im selben System befinden, erhalten Sie detailliertere Informationen. Google Analytics und BigQuery machen das möglich.
  • Der BigQuery-Export von Rohdaten aus Google Analytics bietet Ihnen unbegrenzte Möglichkeiten für detaillierte, benutzerdefinierte Analysen mit einer Abfragesprache, die Sie wahrscheinlich bereits kennen.
  • Google bietet eine Reihe von APIs und Visualisierungstools wie Looker Studio, mit denen Sie Ihre Berichte genau so erstellen können, wie Sie es möchten.