Leistung mit Google Analytics 4 und BigQuery messen und Fehler beheben

Hier erfahren Sie, wie Sie Web Vitals-Daten an Google Analytics 4-Properties senden und die Daten zur Analyse 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 zur Messung der Leistung Ihrer Website nicht ausschließlich auf diese Tools verlassen sollten:

  • 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. Land, Verbindungstyp und Gerätekategorie (Computer 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 genau das mit kostenlosen Tools von Google erreichen 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 die 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. Dies kann passieren, wenn sich der Messwert ändert und ein aktualisierter Wert gemeldet wird (dies ist häufig bei CLS 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 findest du einige Beispiele für häufige Web Vitals-Abfragen, die du möglicherweise ausführen möchtest.

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

Top-10-Seiten mit dem schlechtesten CLS (S. 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. Aber was können Sie tun, wenn Ihre Leistung schlechter als erwartet ist, Sie sich aber nicht sicher sind, warum?

Es ist nicht hilfreich, zu wissen, was Ihre Punktzahlen 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 wird beschrieben, wie Sie zusätzliche Informationen zur Fehlerbehebung mit Ihren Analysedaten senden können. Wenn Sie der Anleitung in diesem Beitrag folgen, sollten auch in BigQuery Informationen zur Fehlerbehebung 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 von schlechtesten zu besten aufgelistet und nach debug_target gruppiert:

# 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 zu 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 wahrnehmen.

Andere Messwerte debuggen

Die vorherige Abfrage zeigt die Ergebnisse für den CLS-Messwert, aber Sie können genau dieselbe Methode verwenden, um Berichte zu den Fehlerbehebungszielen für LCP und INP zu erstellen. Ersetzen Sie dazu einfach die Where-Bedingung durch den entsprechenden Messwert:

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

Unter Fehler in der Leistung beheben finden Sie eine Anleitung zum Erfassen und Senden von Debug-Informationen für die einzelnen Core Web Vitals-Messwerte.

Visualisieren

Es kann schwierig sein, nur anhand der Abfrageergebnisse Erkenntnisse zu gewinnen. Durch die folgende Abfrage werden beispielsweise die täglichen LCP-Werte für das 75. Perzentil im Dataset aufgelistet.

# 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 täglichen Messwertwert

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 Abfrageergebnisse 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 weitere Analysen durchführen möchten, können Sie sich mehrere Diagramme in einem interaktiven Dashboard ansehen, um eine ganzheitlichere Ansicht 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.

Mit dem nativen BigQuery-Connector können Sie ein Dashboard in Looker Studio 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-Export-Datensatz 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 stark frequentierte Website haben und regelmäßig verschiedene Messwerte über ein schnelles interaktives Dashboard überwachen möchten, empfehlen wir Ihnen, Ihre Web Vitals-Daten vorzuverarbeiten und zu erfassen und gleichzeitig BigQuery-Effizienzfeatures 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 vereinfacht 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 Messwertnamen geclustert. Dadurch wird in der Regel die für jede Abfrage verarbeitete Datenmenge reduziert.
  • Da Sie für die Abfrage dieser Tabelle keine Platzhalter verwenden müssen, können Abfrageergebnisse bis zu 24 Stunden 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-UI 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. Prüfen Sie zuerst, ob Sie Ihre Web Vitals-Tabelle anhand 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:

Bildschirm für die Web Vitals-Connector-Autorisierung

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 erstellen, müssen Sie den Connector-Link nur dann erneut aufrufen, wenn Sie mehrere Dashboards aus verschiedenen Datasets erstellen möchten.

Während der Navigation im Dashboard kannst du auf dem Tab Zusammenfassung die täglichen Trends der Web Vitals-Messwerte und einige Nutzungsinformationen für deine Website wie Nutzer und Sitzungen sehen.

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 lassen sich 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 entweder die Daten laden oder eine Verbunddatenquelle 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, damit Sie leichter feststellen können, wie sich Versionsänderungen auf die Leistung auswirken.
  • Wenn Sie eine sehr intensive Nutzung des Datasets über eine direkte Abfrage oder das Dashboard erwarten, können Sie die kostenpflichtige Version von 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.
  • Sie erhalten detailliertere Informationen, wenn sich Ihre Leistungsmesswerte und Ihre Geschäftsmesswerte im selben System befinden. Google Analytics und BigQuery machen dies 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.