Google analytics

Как подключить GA4 к BigQuery

Пошаговое подключение Google Analytics 4 к BigQuery: бесплатный tier (10 GB + 1 TB), BigQuery Links, схема таблиц events_*, streaming vs daily export и первый SQL-запрос.

Автор: Андрій Коваленко 10 мин чтения
Содержание

GA4 BigQuery Export — это встроенная функция Google Analytics 4, которая отправляет сырые данные о каждом событии в Google BigQuery. Вместо сводных отчётов интерфейса GA4 вы получаете доступ к каждому hit-у: какой пользователь, какое событие, какие параметры, какая сессия. Подключение занимает 10-15 минут и доступно бесплатно в рамках бесплатного tier BigQuery (10 GB хранения + 1 TB запросов).

Эта статья — пошаговая инструкция: от создания GCP-проекта до первого SQL-запроса. Плюс объяснение схемы таблиц, разница между daily и streaming export, и типичные ошибки.

Зачем подключать GA4 к BigQuery

Стандартные отчёты GA4 — это агрегаты. Вы видите «1200 сессий», но не можете узнать, какая именно последовательность действий привела к покупке у конкретного сегмента. BigQuery Export разблокирует:

  • Сырые данные без семплирования. GA4 семплирует в отчётах при больших объёмах трафика. BigQuery — нет: вы анализируете 100% событий.
  • Нелинейные воронки. В GA4 воронки — линейные и фиксированные. В SQL можно построить любую последовательность и разрешить «пропуски» между шагами.
  • Объединение с другими источниками. JOIN GA4-событий с таблицей CRM-заказов, рекламными расходами или складом товаров — в GA4-интерфейсе это невозможно.
  • Бесконечный горизонт данных. Стандартный GA4 хранит данные 2 или 14 месяцев в зависимости от настроек. BigQuery-копия хранится столько, сколько вы хотите.
  • Собственная атрибуция. Написать собственную модель атрибуции на SQL — реально. В GA4 выбор ограничен встроенными моделями.

Типичный кейс: интернет-магазин хочет понять, какие категории просматривает пользователь до первой покупки. В GA4-интерфейсе — невозможно. В BigQuery — один JOIN и GROUP BY.

BigQuery бесплатный tier: сколько реально

У Google BigQuery есть бесплатный уровень (free tier), который действует в любом проекте — в том числе и в том, где подключён биллинг:

РесурсБесплатно в месяц
Хранение активных данных10 GB
Хранение долгосрочных данных10 GB
Обработка запросов (queries)1 TB

Что это означает на практике:

  • Сайт с 500k событий в месяц генерирует примерно 2-4 GB данных GA4. Вписывается в 10 GB бесплатно.
  • 1 TB обработки — это очень много для SQL-запросов по нескольким месяцам. Если использовать партиционирование (фильтр по дате), реальное потребление будет в 10-50x меньше максимума.
  • Streaming export (realtime) — НЕ входит в бесплатный уровень. Стоит ~$0.05 за 200 MB вставленных данных.

Sandbox vs биллинг. «BigQuery Sandbox» — это режим БЕЗ подключённого биллинга (с авто-удалением таблиц примерно через 60 дней). GA4-экспорт требует включить биллинг (привязать карту) → как только вы это сделали, проект уже НЕ sandbox, но лимиты 10 GB / 1 TB остаются бесплатными. То есть платёжная карта нужна, однако в пределах бесплатного tier вы ничего не платите.

Практический вывод: для большинства проектов до 2-3 млн событий в месяц BigQuery можно использовать бесплатно. Платить начинаете, когда либо превышаете storage/query quota, либо включаете streaming.

Подготовка: что нужно перед подключением

Перед тем как идти в GA4 → BigQuery Links, подготовьте:

  1. Google Cloud Platform (GCP) проект. Если нет — создайте на console.cloud.google.com. Один GCP-проект может обслуживать несколько GA4-свойств.
  2. Активированный Billing. GA4 BigQuery Links не активируются без подключённого платёжного метода. Привязав карту, вы выходите из режима sandbox, но в пределах бесплатного tier (10 GB / 1 TB) реальных расходов не будет — карту нужно привязать именно как условие экспорта.
  3. Включённый BigQuery API. GCP → APIs & Services → Enable APIs → BigQuery API. Обычно включается автоматически при первом использовании, но лучше проверить.
  4. Права в GA4. Нужна роль Editor или Administrator на уровне GA4-свойства. Viewer не сможет создать BigQuery Link.
  5. Определить регион BigQuery (Location). США (US) или Евросоюз (EU) — выбирается один раз при создании датасета и не меняется. Если аудитория преимущественно в ЕС и есть GDPR-ограничения — выбирайте EU.
  1. Зайдите в Google Analytics 4 → Admin (шестерёнка внизу слева).
  2. В столбце Property найдите секцию Product Links.
  3. Нажмите BigQuery Links.
  4. Кликните Link (кнопка вверху справа).

Шаг 2. Выбрать GCP-проект

  1. В диалоге нажмите Choose a BigQuery project.
  2. Появится список проектов, к которым у вашего Google-аккаунта есть доступ.
  3. Выберите нужный GCP-проект.
  4. Нажмите Confirm.

Если проект не появляется — проверьте, что аккаунт GA4 и GCP-проект привязаны к одному Google-аккаунту, или что у вас есть IAM-роль BigQuery Admin или BigQuery Data Editor в этом проекте.

Шаг 3. Настроить параметры экспорта

На этом шаге два ключевых параметра:

BigQuery dataset location (регион)

Выбирайте между US и EU. Для европейских сайтов с GDPR-требованиями — EU. Смена региона требует удаления датасета и повторного подключения, поэтому выбирайте осознанно.

Export type (тип экспорта)

ТипЧастотаСтоимостьКогда использовать
Daily1 раз в день (на следующий день)Бесплатно (free tier)Ретроспективный анализ, воронки, когорты
StreamingПочти реальное время (2-3 ч задержка)~$0.05 / 200 MBОперационные дашборды, алерты

Рекомендую начинать с Daily. Если нужен realtime — включить streaming можно позже.

Включить/выключить конкретные типы событий

По умолчанию GA4 отправляет все события. Можно исключить отдельные типы, если они не нужны — например технические события __t или debug-события. Для начала оставляйте всё включённым.

Шаг 4. Подтвердить и сохранить

Просмотрите настройки и нажмите Submit. GA4 автоматически:

  1. Создаст датасет в вашем BigQuery-проекте (название по умолчанию — analytics_<PROPERTY_ID>).
  2. Предоставит своему сервисному аккаунту права BigQuery Data Editor на этот датасет.
  3. Начнёт первый daily export на следующий день (данные за текущий день в UTC).

Первая таблица появится на следующий день после подключения — это нормально. Events за сегодня попадут в BigQuery завтра утром.

Шаг 5. Проверить подключение

Через 24-48 часов после подключения:

  1. Откройте console.cloud.google.com/bigquery.
  2. В левом дереве выберите ваш проект → датасет analytics_<PROPERTY_ID>.
  3. Вы увидите таблицы вида events_20260624 (одна таблица на один день).

Если таблиц нет через 48 часов — перейдите к разделу «Типичные ошибки» ниже.

Схема таблиц events_*

Каждая таблица events_YYYYMMDD содержит одну строку на одно событие. Основные поля:

events_20260624
├── event_date          STRING        '20260624'
├── event_timestamp     INTEGER       микросекунды UTC (1719187200000000)
├── event_name          STRING        'page_view', 'purchase', 'click'
├── event_params        RECORD (REPEATED) — массив пар key/value
│   ├── key             STRING        'page_location', 'session_id', 'value'
│   └── value           RECORD
│       ├── string_value   STRING
│       ├── int_value      INTEGER
│       ├── float_value    FLOAT
│       └── double_value   FLOAT
├── user_pseudo_id      STRING        анонимный идентификатор (~client_id)
├── user_id             STRING        если User-ID настроен
├── user_properties     RECORD (REPEATED) — аналогично event_params
├── user_first_touch_timestamp  INTEGER
├── device              RECORD
│   ├── category        STRING        'mobile', 'desktop', 'tablet'
│   ├── operating_system STRING
│   ├── browser         STRING
│   └── language        STRING
├── geo                 RECORD
│   ├── country         STRING        'Ukraine'
│   ├── region          STRING
│   └── city            STRING
├── traffic_source      RECORD
│   ├── source          STRING        'google'
│   ├── medium          STRING        'organic'
│   └── name            STRING        название кампании
└── ecommerce           RECORD        — заполнено для e-commerce событий
    ├── transaction_id  STRING
    ├── total_item_quantity INTEGER
    └── purchase_revenue FLOAT

Важная деталь: event_params — это массив (REPEATED RECORD). Чтобы получить конкретный параметр, нужен UNNEST.

Daily export vs Streaming export: что выбрать

Daily export

Данные за день UTC появляются следующим утром. Google запускает загрузку между 0:00 и 8:00 UTC.

  • Таблица за день: events_20260624
  • Также есть events_intraday_20260624 — частичный снимок текущего дня (обновляется несколько раз, после окончания дня удаляется и заменяется финальной таблицей).
  • Бесплатно в рамках бесплатного tier BigQuery (10 GB / 1 TB).
  • Достаточно для 95% аналитических задач.

Streaming export

События попадают в BigQuery с задержкой ~2-3 часа.

  • Таблица остаётся той же (events_YYYYMMDD), строки добавляются непрерывно.
  • Стоимость: ~$0.05 за 200 MB (Google считает как $0.05/GB, где 1 GB = 200 MB экспортированных данных) — ставка фиксированная, не зависит от региона.
  • Для сайта со 100k событий в день — примерно $1-5 в месяц.
  • Полезно если нужен realtime-дашборд или алерты на аномалии трафика.

Вывод: если конкретной задачи с realtime нет — используйте Daily. Streaming можно включить позже.

Первый SQL-запрос в BigQuery

Откройте BigQuery → ваш датасет → Query (или кнопка + → New query).

Количество событий по типу за последнюю неделю

SELECT
  event_name,
  COUNT(*) AS event_count
FROM `your-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN
  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
  AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
GROUP BY event_name
ORDER BY event_count DESC
LIMIT 20;

Замените your-project.analytics_123456789 на ваш project ID и dataset ID (видно в дереве слева).

_TABLE_SUFFIX — специальный псевдоним для суффикса шардированных таблиц. Фильтр BETWEEN ограничивает сканирование только нужными днями и экономит TB quota.

Извлечь URL страниц из page_view

SELECT
  event_date,
  (SELECT value.string_value
   FROM UNNEST(event_params) WHERE key = 'page_location') AS page_url,
  COUNT(*) AS pageviews
FROM `your-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
  AND event_name = 'page_view'
GROUP BY event_date, page_url
ORDER BY pageviews DESC
LIMIT 50;

UNNEST(event_params) разворачивает массив параметров в строки, WHERE key = 'page_location' выбирает нужный ключ.

Воронка от просмотра товара до покупки

WITH funnel AS (
  SELECT
    user_pseudo_id,
    MAX(IF(event_name = 'view_item', 1, 0)) AS viewed_item,
    MAX(IF(event_name = 'add_to_cart', 1, 0)) AS added_to_cart,
    MAX(IF(event_name = 'purchase', 1, 0)) AS purchased
  FROM `your-project.analytics_123456789.events_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260601' AND '20260623'
  GROUP BY user_pseudo_id
)
SELECT
  COUNT(*) AS total_users,
  SUM(viewed_item) AS step1_view_item,
  SUM(added_to_cart) AS step2_add_to_cart,
  SUM(purchased) AS step3_purchase,
  ROUND(SUM(added_to_cart) / SUM(viewed_item) * 100, 1) AS pct_view_to_cart,
  ROUND(SUM(purchased) / SUM(added_to_cart) * 100, 1) AS pct_cart_to_purchase
FROM funnel
WHERE viewed_item = 1;

Этот запрос показывает воронку за произвольный диапазон дат без семплирования — именно то, чего нельзя сделать в GA4-интерфейсе.

Ограничения GA4 BigQuery Export

Не всё идеально. Важные ограничения:

  1. Нет данных за прошлые даты. BigQuery Export начинает собирать данные с дня подключения. Ретроспективные данные за прошлые месяцы не передаются (Universal Analytics мог экспортировать backfill, GA4 — нет).

  2. Thresholding — только в отчётах, не в экспорте. Распространённое заблуждение: data thresholding GA4 применяется к интерфейсу отчётов и исследований (Explorations) и API, а НЕ к таблицам events_* в BigQuery. Raw export отдаёт необработанные события — без трешолдинга, без семплирования (именно поэтому это 100% событий, см. выше). Реальное ограничение приватности в экспорте — это отдельные вещи на уровне данных пользователя (удаление по запросу user-data deletion, передача consent-сигналов), а не сокрытие строк по порогу «~1000 событий».

  3. Задержка daily export. Таблица за вчера приходит сегодня утром — с задержкой 12-36 часов после UTC-полуночи. Не подходит для realtime-отчётности без streaming.

  4. Лимиты бесплатного tier. 10 GB storage и 1 TB queries в месяц. При больших сайтах (10M+ событий/месяц) нужен платный тариф.

  5. Один BigQuery Location навсегда. EU или US — выбирается при создании датасета и не меняется. Переподключение с новым датасетом означает потерю накопленной history.

  6. BigQuery Data Deletion необратима. Если случайно удалите таблицу без Time Travel backup (по умолчанию 7 дней) — данные не восстановить.

Типичные ошибки при подключении

  1. «Permission denied» при создании Link. Нужна роль Editor в GA4-свойстве, не просто Viewer. Проверьте Admin → Property → Property Access Management.

  2. Billing не активирован — Link не создаётся. GA4 BigQuery Export требует привязанную платёжную карту (sandbox без биллинга для него не подходит). GCP → Billing → Link a billing account.

  3. BigQuery API выключен. GCP → APIs & Services → Enable APIs → BigQuery API. Симптом: ошибка «Service has not been used in this project» при попытке подключения.

  4. Неправильный Location. Выбрали US вместо EU или наоборот — и данные нельзя переместить. Решение: удалить датасет, переподключить с правильным регионом (данные за прошлые дни при этом теряются).

  5. Данных нет первый день. Первый daily export приходит на следующий день — это нормальное поведение. Если нет через 48 часов — проверьте сервисный аккаунт и IAM-права.

  6. Фильтр _TABLE_SUFFIX не применён — большой счёт. Запрос FROM events_* без WHERE _TABLE_SUFFIX сканирует все таблицы (всю history). Всегда добавляйте фильтр по датам.

  7. UNNEST без WHERE по ключу возвращает все параметры. FROM UNNEST(event_params) без WHERE key = '...' даёт строку на каждый параметр — то есть умножает количество строк в 10-20 раз. Всегда добавляйте WHERE key = 'название_параметра' или используйте subquery.

  8. Streaming включён случайно. Если не нужен realtime — проверьте настройки Link и выключите. Иначе начинаете платить за каждый MB трафика.

Что дальше после подключения

После того как данные есть в BigQuery:

  • Подключите Looker Studio (ранее Google Data Studio) к BigQuery-датасету — можно строить визуальные дашборды без SQL.
  • Настройте scheduled queries — автоматические SQL-запросы по расписанию, результаты сохраняются в отдельную таблицу-агрегат. Например ежедневный rollup по каналам трафика.
  • Используйте GA4 BigQuery вместе с другими источниками — JOIN с рекламными расходами (Google Ads через Data Transfer), CRM-данными или таблицами товаров.

Подробнее о настройке самой GA4-свойства — GA4 Setup Checklist и полное руководство по GA4. Если GA4 ещё не отправляет нужные события — сначала настройте dataLayer и GTM.

Связанные материалы

Похожие статьи

Смотрите также

Эту статью пишет и обновляет Андрій Коваленко — без AI-воды и партнёрских ссылок. Заметил устаревший факт или неточность — напиши, перепишу в ту же неделю.

Кто ведёт сайт и почему без AI