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 і dateset 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