Перейти к содержимому

Как сделать первый запрос к данным GA4 в BigQuery

После связки Google Analytics 4 с BigQuery в вашем хранилище каждый день появляются сырые события: каждый просмотр страницы, клик и заявка со всеми параметрами. Это даёт свободу, которой нет в интерфейсе Analytics, но данные устроены непривычно, и первые запросы часто ставят в тупик.

Показываю, как устроены таблицы GA4 в BigQuery, разбираю три первых SQL-запроса — по дням, страницам и источникам — и объясняю, как не переплатить за обработку данных.


Значок базы данных в окне браузера, чек-лист шагов и знак вопроса — инструкция по первым запросам к данным GA4 в BigQuery

Что должно быть готово

Ресурс GA4 связан с проектом Google Cloud через раздел связей с BigQuery в «Администраторе», и экспорт работает хотя бы сутки. Учтите: выгрузка начинается с момента связки, прошлые данные задним числом не появятся.

Как устроены данные

  • Набор данных называется analytics_ плюс номер ресурса, например analytics_123456789.
  • Ежедневная выгрузка — это таблицы events_ГГГГММДД, по одной на день. Если включена потоковая выгрузка, текущий день лежит в events_intraday_ГГГГММДД.
  • Одна строка — одно событие: page_view, first_visit, generate_lead и так далее.
  • Параметры события — адрес страницы, заголовок и другие — лежат не в отдельных колонках, а во вложенном списке event_params из пар «ключ — значение». Чтобы их достать, нужен UNNEST.

Запрос 1. События и пользователи по дням

SELECT
  event_date,
  COUNT(*) AS events,
  COUNT(DISTINCT user_pseudo_id) AS users
FROM `ваш-проект.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261007'
GROUP BY event_date
ORDER BY event_date;

events_* берёт все дневные таблицы сразу, а условие по _TABLE_SUFFIX оставляет только нужные даты. Без этого условия запрос прочитает всю историю, и за это придётся заплатить. Учтите, что user_pseudo_id — это браузер или устройство, а не человек.

Запрос 2. Самые просматриваемые страницы

SELECT
  (SELECT value.string_value FROM UNNEST(event_params)
   WHERE key = 'page_location') AS page,
  COUNT(*) AS views
FROM `ваш-проект.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261007'
  AND event_name = 'page_view'
GROUP BY page
ORDER BY views DESC
LIMIT 20;

Подзапрос с UNNEST достаёт из списка параметров значение с ключом page_location. Так же достаются и другие параметры: page_title, page_referrer. Числовые значения лежат в value.int_value, а не в string_value.

Запрос 3. Откуда пришли новые пользователи

SELECT
  traffic_source.source AS source,
  traffic_source.medium AS medium,
  COUNT(DISTINCT user_pseudo_id) AS new_users
FROM `ваш-проект.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261007'
  AND event_name = 'first_visit'
GROUP BY source, medium
ORDER BY new_users DESC;

Поле traffic_source хранит источник первого визита пользователя, а не текущего сеанса. Для новых пользователей оно подходит, а для анализа сеансов используют другие поля, например collected_traffic_source.

Почему цифры не совпадают с интерфейсом GA4

  • Интерфейс Analytics использует моделирование и пороги данных, а в BigQuery лежат только фактически собранные события.
  • Пользователи в BigQuery считаются по устройствам и браузерам, а отчёты GA4 могут объединять их иначе.
  • event_date записан в часовом поясе ресурса, а event_timestamp — в UTC.

Как не переплатить

  • Всегда ограничивайте даты через _TABLE_SUFFIX.
  • Выбирайте только нужные колонки. BigQuery берёт плату за объём прочитанных данных, а не за число строк в результате, поэтому LIMIT не экономит, а SELECT * — самый дорогой запрос.
  • Перед запуском смотрите оценку в редакторе: BigQuery показывает, сколько данных обработает запрос.
  • Бесплатный уровень BigQuery — 1 ТБ обработки запросов в месяц и 10 ГБ хранения. Небольшому сайту этого обычно хватает.
  • В песочнице BigQuery без подключённой оплаты таблицы удаляются через 60 дней. Для долгого хранения нужен проект с платёжным аккаунтом.
  • У стандартных ресурсов GA4 ежедневная выгрузка ограничена миллионом событий в день; если лимит постоянно превышается, выгрузка приостанавливается.

Коротко

  1. Одна строка в таблице — одно событие, параметры — во вложенном event_params.
  2. Берите таблицы через events_* и всегда фильтруйте _TABLE_SUFFIX.
  3. Параметры достаются подзапросом с UNNEST.
  4. traffic_source — источник первого визита, не сеанса.
  5. Платите за прочитанные данные: выбирайте только нужные колонки.

Если выгрузку ещё предстоит настроить или нужны готовые отчёты на сырых данных, мы можем настроить выгрузку Google Analytics 4 в BigQuery: создадим проект, свяжем его с GA4, проверим данные и настроим контроль расходов. Результаты запросов удобно выводить в отчёт в Data Studio.