Modelowane listy odbiorców nie zawierają konkretnych osób, tylko prawdopodobieństwa. Wyjaśniam, jak powstają, gdzie ich szukać w panelu i jak czytać ich raporty.
Universal Analytics przestanie zbierać dane 1 lipca tego roku, więc od kilku miesięcy prawie każda rozmowa o analityce kończy się na GA4. Przy okazji migracji warto załatwić coś, co w starym Analyticsie było dostępne wyłącznie w płatnej wersji 360: eksport surowych danych do BigQuery.
To dla mnie jedna z najważniejszych zmian w całym GA4 i jednocześnie funkcja, której prawie nikt nie włącza. Na kontach, które przejmuję, integracja jest podłączona może w co dziesiątym przypadku, a i wtedy zwykle okazuje się, że ktoś ją kliknął pół roku temu i nigdy nie zajrzał do wyeksportowanych tabel.
Poniżej opisuję całą konfigurację: od projektu w Google Cloud, przez samo połączenie, po pierwsze zapytania i rachunek, który może się z nich wziąć. Piszę też, czego eksport nie naprawi, bo wokół tej integracji narosło przekonanie, że rozwiązuje wszystkie problemy z pomiarem.
Interfejs GA4 pokazuje dane po obróbce: policzone, zagregowane, ograniczone zestawem wymiarów, które ktoś w Google uznał za sensowne. Do części pytań to wystarcza. Do części nie wystarcza w ogóle.
W BigQuery dostaję coś innego: jeden wiersz na jedno zdarzenie, z pełną listą parametrów, identyfikatorem przeglądarki, znacznikiem czasu z dokładnością do mikrosekundy i całym kontekstem urządzenia. Nic nie jest zaokrąglone i nic nie zostało wcześniej pogrupowane. Widać to dopiero przy konkretnych pytaniach: ile razy ktoś wracał do tego samego produktu przed zakupem, w jakiej kolejności padały zdarzenia przed porzuceniem koszyka, jak wyglądały ścieżki osób, które weszły z reklamy, a kupiły z wyszukiwarki. W panelu każde z tych pytań albo wymaga karkołomnych eksploracji, albo nie da się na nie odpowiedzieć.
Dochodzi drugi argument, mniej ekscytujący, ale w praktyce ważniejszy: archiwum. Standardowa właściwość GA4 przechowuje dane zdarzeń maksymalnie czternaście miesięcy i to trzeba samodzielnie ustawić, bo domyślnie jest krócej. Tabele w BigQuery zostają tak długo, jak długo za nie płacisz.
Słowo „darmowa” w kontekście tej integracji wymaga uczciwego doprecyzowania, bo pomyłka kończy się rachunkiem.
Jest też ograniczenie po stronie GA4, o którym łatwo dowiedzieć się za późno: właściwość standardowa może eksportować dziennie do miliona zdarzeń. Przy większym ruchu eksport zostaje wstrzymany, a Google przysyła powiadomienie. Dotyka to głównie dużych sklepów, ale własny wolumen zdarzeń warto policzyć zawczasu.
Osobna sprawa to tryb strumieniowy, który dorzuca zdarzenia w ciągu kilku minut od ich wystąpienia. Wymaga konta rozliczeniowego i jest płatny od pierwszego wiersza. Do analizy marketingowej eksport dzienny wystarcza i od niego zaczynam zawsze.
Zaczynam od strony Google Cloud, bo bez gotowego projektu w GA4 nie ma czego wybrać.
Zakładam nowy projekt, nazywam go tak, żeby po roku było wiadomo, czyje dane w nim leżą, i włączam w nim BigQuery API. Do połączenia potrzebne są uprawnienia właściciela lub edytora projektu — jeśli firma ma administratora Cloud, to moment, w którym trzeba go poprosić o dostęp, a nie obchodzić temat prywatnym kontem Gmail.
Najważniejsza decyzja na tym etapie dotyczy lokalizacji zbioru danych. Regionu nie da się później zmienić — jedyna droga to skasowanie połączenia, założenie nowego i pogodzenie się z tym, że stare tabele zostają tam, gdzie były. Dla klientów z Polski wybieram region europejski i nie zastanawiam się dłużej.
Warto wiedzieć, czego ten wybór nie rozwiązuje. Trzymanie tabel w Europie nie zamyka dyskusji o zgodności z RODO, która toczy się od decyzji austriackiego i francuskiego organu ochrony danych w sprawie Google Analytics. Nowe ramy prawne transferu danych do Stanów Zjednoczonych są dopiero przygotowywane i na dziś nie obowiązują.
Po stronie Analyticsa wchodzę w Administrację, sekcję połączeń z usługami i wybieram połączenia z BigQuery. Potrzebna jest rola administratora właściwości.
Kreator prowadzi przez cztery decyzje. Wskazuję projekt Cloud, wybieram lokalizację, zaznaczam strumienie danych do eksportu i ustawiam częstotliwość — dzienną, strumieniową albo obie. Przy aplikacjach mobilnych dochodzi zgoda na dołączanie identyfikatorów reklamowych. Jest też opcja wykluczania wybranych zdarzeń; używam jej rzadko, bo w tabelach wolę mieć wszystko, ale ma sens przy zdarzeniach technicznych generowanych masowo przez skrypty na stronie — to one najszybciej zjadają dzienny limit.
Rzecz, która zaskakuje najczęściej: eksport nie ma trybu wstecznego. Pierwsza tabela pojawia się dopiero za dane z następnej doby, a wszystko, co zebrało się wcześniej, zostaje wyłącznie w panelu. Dlatego integrację podłączam w pierwszym tygodniu każdego projektu, nawet gdy nikt jeszcze nie wie, do czego jej użyje. To kwadrans pracy, którego nie da się odrobić później.
Następnego dnia w BigQuery pojawia się zbiór danych o nazwie zbudowanej z identyfikatora właściwości, a w nim tabele dzienne — jedna na każdą dobę, z datą w nazwie. Przy eksporcie strumieniowym dochodzi osobna tabela z danymi z bieżącego dnia, jeszcze niepełnymi.
Struktura pojedynczego wiersza jest bogatsza, niż wygląda na pierwszy rzut oka. Poza nazwą i czasem zdarzenia znajdziesz w niej identyfikator przeglądarki, dane o urządzeniu i geolokalizacji, informacje o źródle pierwszej wizyty użytkownika, właściwości użytkownika oraz — w sklepach — tablicę pozycji z zamówienia.
Największa różnica względem arkusza polega na tym, że parametry zdarzeń nie są zwykłymi kolumnami. Siedzą w strukturze zagnieżdżonej: lista par klucz–wartość, w której wartość może być tekstem albo liczbą. Adres strony, tytuł, identyfikator sesji czy nazwa promocji — wszystko wyciąga się z tej samej struktury, a kto pisał dotąd SQL na płaskich tabelach, przy pierwszym zapytaniu zobaczy błąd i uzna, że coś jest zepsute. Nie jest — trzeba tylko rozwinąć strukturę operatorem rozbijającym tablice na wiersze.
Zanim napiszę cokolwiek ambitnego, sprawdzam podglądem, jak wygląda kilka wierszy z ostatniej tabeli. Podgląd nie kosztuje nic, w przeciwieństwie do zapytania.
Potem obowiązują trzy nawyki, których nauczyłem się w większości boleśnie. Po pierwsze: nigdy nie pobieram wszystkich kolumn, bo w BigQuery płaci się za przeskanowane kolumny, a nie za zwrócone wiersze. Po drugie: zawsze zawężam zakres tabel dziennych, zamiast odpytywać całą historię z gwiazdką w nazwie. Po trzecie: przed uruchomieniem patrzę na szacunek ilości danych, który edytor pokazuje w prawym górnym rogu — to jedna liczba, która chroni przed pomyłką za kilka dolarów.
Kiedy zapytanie już działa, zapisuję je jako widok i dopiero na nim buduję raporty. Dzięki temu nie kopiuję tej samej logiki do pięciu miejsc i mam jedno miejsce do poprawienia, gdy w tagowaniu zmieni się nazwa zdarzenia.
Do prezentacji podłączam Looker Studio bezpośrednio do BigQuery. Jedna uwaga z doświadczenia: raport odświeżany co kilkanaście sekund przez kilka osób naraz potrafi generować zaskakujące koszty. Włączam buforowanie i przygotowuję dane w tabelach pośrednich, zamiast liczyć wszystko na bieżąco.
BigQuery nie jest lekiem na złą analitykę i chcę to powiedzieć wprost, bo słyszę odwrotne obietnice.
Surowe dane są tak dobre, jak tagowanie, które je wytworzyło. Jeśli zdarzenie zakupu odpala się dwa razy albo wartość transakcji przychodzi raz z podatkiem, raz bez, to w tabelach będzie ten sam bałagan, tylko w wyższej rozdzielczości. Eksport nie poprawia jakości pomiaru — on ją obnaża.
Nie dostajesz też gotowych metryk. Sesje, użytkownicy zaangażowani, przypisanie źródła do konwersji — w panelu są policzone, a tutaj trzeba je napisać samemu, pilnując definicji, których używa GA4. To najczęstsze źródło rozbieżności między jednym i drugim narzędziem.
I wreszcie kompetencje. Integracja bez kogoś, kto umie napisać SQL, jest tylko rosnącym rachunkiem za przechowywanie. Mimo tego podłączam ją każdemu klientowi od razu, bo dane, których się nie zbiera, nie pojawią się wstecz. Umiejętności można nadrobić w każdej chwili, historii ruchu — nie.
Używamy plików cookies, aby ułatwić Ci nawigację oraz wykonywanie określonych funkcji. Szczegółowe informacje o wszystkich plikach cookies znajdziesz w każdej kategorii zgody poniżej.
Pliki cookies oznaczone jako "Niezbędne" są przechowywane w Twojej przeglądarce, ponieważ są one kluczowe dla zapewnienia podstawowych funkcji strony.
Używamy również plików cookies firm trzecich, które pomagają nam analizować, w jaki sposób korzystasz z tej strony, zapamiętują Twoje preferencje oraz dostarczają treści i reklamy odpowiednie dla Ciebie. Te pliki cookies będą przechowywane w Twojej przeglądarce tylko za Twoją uprzednią zgodą.
Możesz zdecydować, czy chcesz włączyć lub wyłączyć niektóre bądź wszystkie te pliki cookies, jednak wyłączenie niektórych z nich może wpłynąć na Twoje doświadczenia podczas przeglądania strony.
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __cf_bm | 13 minutes | Cloudflare bot management — distinguishes humans from bots. |
| rc::* | Persistent | Google reCAPTCHA — localStorage holding anti-bot challenge state. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| wpEmojiSettingsSupports | Session | WordPress — sessionStorage flag caching whether the browser can render emoji (feature detection). |
| ytidb* | Persistent | YouTube — IndexedDB storing playback/search state for embedded videos. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| _ga_* | 400 days | Google Analytics 4 — persists session state per property. |
| _ga | 400 days | Google Analytics — distinguishes unique users via a client id. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| NID | 183 days | Google — stores preferences for personalized ads. |
| fr | 90 days | Meta — encrypted Facebook id and browser id for ads. |
| _gcl_au | 90 days | Google AdSense/Ads — experiments with advertising efficiency (conversion linker). |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __Secure-YNID | 180 days | |
| YSC | Session | |
| __Secure-ROLLOUT_TOKEN | 180 days | |
| VISITOR_INFO1_LIVE | 180 days | |
| VISITOR_PRIVACY_METADATA | 180 days | |
| datr | 400 days | |
| sb | 400 days | |
| wd | 7 days |