{"id":452,"date":"2026-09-08T20:15:00","date_gmt":"2026-09-08T18:15:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=452"},"modified":"2026-10-24T02:25:45","modified_gmt":"2026-10-24T00:25:45","slug":"automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/","title":{"rendered":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery"},"content":{"rendered":"<p>Uzgodnienie danych GA4 i Meta CAPI pokazuje, kt\u00f3re oczekiwane zdarzenia biznesowe maj\u0105 potwierdzenie w poszczeg\u00f3lnych \u017ar\u00f3d\u0142ach. Rozbie\u017cno\u015b\u0107 nie wyja\u015bnia jednak przyczyny: zgoda, r\u00f3\u017cne definicje zdarze\u0144, op\u00f3\u017anienia przetwarzania i b\u0142\u0119dy techniczne mog\u0105 dawa\u0107 ten sam wynik. GA4 nie musi te\u017c zawiera\u0107 wy\u0142\u0105cznie danych przegl\u0105darkowych.<\/p>\n<h2>1. Najpierw definicja oczekiwanej zgodno\u015bci<\/h2>\n<p>Punktem wyj\u015bcia jest wiarygodna lista zdarze\u0144 biznesowych, na przyk\u0142ad potwierdzonych zam\u00f3wie\u0144. Por\u00f3wnanie tylko dw\u00f3ch tabel \u015bledzenia nie wykryje zdarzenia brakuj\u0105cego w obu. Sama lista referencyjna r\u00f3wnie\u017c wymaga kontroli kompletno\u015bci.<\/p>\n<p>\u0179r\u00f3d\u0142a \u0142\u0105czy sta\u0142y klucz. UUIDv4 jest mo\u017cliwo\u015bci\u0105, a nie obowi\u0105zkiem ani metod\u0105 szyfrowania. Ponowna wysy\u0142ka tego samego zdarzenia zachowuje identyfikator; r\u00f3\u017cne zdarzenia otrzymuj\u0105 r\u00f3\u017cne identyfikatory. Dodatkowy zakres zapobiega kolizjom mi\u0119dzy sklepami i \u017ar\u00f3d\u0142ami danych.<\/p>\n<p>Nazwy zdarze\u0144 wymagaj\u0105 jawnego przypisania, na przyk\u0142ad GA4 <code>purchase<\/code> i Meta <code>Purchase<\/code> do wsp\u00f3lnego typu <code>purchase<\/code>. <code>transaction_id<\/code> w GA4, w\u0142asny parametr uzgadniania i <code>event_id<\/code> Meta to osobne pola. Usuwanie powt\u00f3rzonych zakup\u00f3w GA4 i deduplikacja Pixel\/CAPI maj\u0105 odr\u0119bne regu\u0142y. Zgodno\u015b\u0107 w BigQuery nie dowodzi atrybucji reklamowej ani skutecznej deduplikacji w Meta.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-450-reconciliation-20261024-pl.png\" alt=\"Osobna lista referencyjna ujawnia brak potwierdzenia po obu stronach. Pr\u00f3by wysy\u0142ki s\u0105 agregowane przed por\u00f3wnaniem.\" width=\"1120\" height=\"580\" loading=\"lazy\"><figcaption>Osobna lista referencyjna ujawnia brak potwierdzenia po obu stronach. Pr\u00f3by wysy\u0142ki s\u0105 agregowane przed por\u00f3wnaniem.<\/figcaption><\/figure>\n<h2>2. Trzy przygotowane tabele przed por\u00f3wnaniem<\/h2>\n<p>Poni\u017cszy przyk\u0142ad wymaga w\u0142asnych tabel. Po\u0142\u0105czenie GA4 nie tworzy ich automatycznie; najpierw potrzebne s\u0105 procesy wczytywania i kontrola jako\u015bci danych.<\/p>\n<ul>\n<li><code>expected_events<\/code>: dok\u0142adnie jeden wiersz na <code>scope_id<\/code>, <code>event_kind<\/code> i <code>event_id<\/code>, a tak\u017ce <code>business_time<\/code> jako rzeczywisty czas zdarzenia biznesowego oraz pola BOOL <code>expected_ga4<\/code> i <code>expected_meta<\/code>. TRUE oznacza przewidzian\u0105 i dozwolon\u0105 identyfikowaln\u0105 wysy\u0142k\u0119 do us\u0142ugi; FALSE brak takiego oczekiwania; NULL stan nierozstrzygni\u0119ty.<\/li>\n<li><code>ga4_observations<\/code>: jeden wiersz na faktycznie wyeksportowane zdarzenie, z tym samym kluczem z\u0142o\u017conym i czasem wczytania <code>loaded_at<\/code>. Ponowny odczyt tego samego wiersza eksportu nie mo\u017ce tworzy\u0107 kolejnej obserwacji. Zdarzenia rzeczywi\u015bcie zarejestrowane wielokrotnie pozostaj\u0105 widoczne.<\/li>\n<li><code>capi_attempts<\/code>: jeden wiersz na pr\u00f3b\u0119 wysy\u0142ki i powi\u0105zane zdarzenie, z kluczem, <code>loaded_at<\/code> i <code>receipt_state<\/code>. Dozwolone stany to <code>received<\/code>, <code>rejected<\/code> i <code>unknown<\/code>. Stan <code>received<\/code> wymaga potwierdzenia mo\u017cliwego do przypisania konkretnemu zdarzeniu.<\/li>\n<\/ul>\n<p>Samo HTTP 200 nie dowodzi atrybucji. Odpowied\u017a z liczb\u0105 odebranych zdarze\u0144 wymaga prawid\u0142owego powi\u0105zania z \u017c\u0105daniem. Niejasna lub cz\u0119\u015bciowa odpowied\u017a zbiorcza nie pozwala oznaczy\u0107 wszystkich zdarze\u0144 jako odebrane. B\u0142\u0119dne i niepewne pr\u00f3by pozostaj\u0105 w logu; p\u00f3\u017aniejsze udane powt\u00f3rzenia tworz\u0105 kolejne wpisy. Tokeny dost\u0119pu i pe\u0142ne dane klient\u00f3w nie nale\u017c\u0105 do tego dziennika kontroli.<\/p>\n<p>Puste identyfikatory, wielokrotne klucze parametr\u00f3w, nieznane nazwy zdarze\u0144 i obserwacje bez wpisu referencyjnego wymagaj\u0105 osobnych list b\u0142\u0119d\u00f3w. Niepoprawne rekordy nie mog\u0105 znika\u0107 bez \u015bladu. <code>scope_id<\/code> okre\u015bla sta\u0142e powi\u0105zanie sklepu, us\u0142ugi lub strumienia GA4 i \u017ar\u00f3d\u0142a danych Meta.<\/p>\n<h2>3. Ocena dnia biznesowego i agregacja powt\u00f3rze\u0144<\/h2>\n<p>Przyk\u0142adowe zapytanie ocenia dzie\u0144 biznesowy UTC sprzed czterech dni. Zapewnia to odst\u0119p dla zwyk\u0142ych op\u00f3\u017anie\u0144, ale nie gwarantuje kompletno\u015bci. Eksport, lista referencyjna i log CAPI musz\u0105 by\u0107 wystarczaj\u0105co aktualne przed ocen\u0105. Brak tabeli oznacza problem wczytywania, a nie dow\u00f3d zerowej liczby zdarze\u0144.<\/p>\n<p>Dzienne tabele GA4 stosuj\u0105 stref\u0119 czasow\u0105 us\u0142ugi. Dokumentacja opisuje <code>event_timestamp<\/code> jako czas odbioru; wysy\u0142ka i zdarzenie biznesowe mog\u0105 nast\u0119powa\u0107 w r\u00f3\u017cnym czasie. Dlatego oceniany dzie\u0144 pochodzi tutaj z <code>business_time<\/code>. Przygotowane tabele obserwacji musz\u0105 zawiera\u0107 odpowiednie p\u00f3\u017aniejsze dane. Odczyt wy\u0142\u0105cznie tabeli GA4 nazwanej dat\u0105 zdarzenia biznesowego nie zawsze wystarcza.<\/p>\n<pre class=\"wp-block-code-beautifier-block-code\"><code>-- GoogleSQL. Prepared tables are defined in the article.\n-- @run_time is supplied by BigQuery Scheduled Queries.\nDECLARE target_day DATE DEFAULT DATE_SUB(DATE(@run_time, &#x27;UTC&#x27;), INTERVAL 4 DAY);\nDECLARE observed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP();\n\nCREATE TEMP TABLE expected AS\nSELECT scope_id, event_kind, event_id, expected_ga4, expected_meta\nFROM `project_id.monitoring.expected_events`\nWHERE business_time &gt;= TIMESTAMP(target_day, &#x27;UTC&#x27;)\n  AND business_time &lt; TIMESTAMP(DATE_ADD(target_day, INTERVAL 1 DAY), &#x27;UTC&#x27;);\n\nASSERT (\n  SELECT COUNT(*) = 0 FROM expected\n  WHERE scope_id IS NULL OR TRIM(scope_id) = &#x27;&#x27;\n     OR event_kind IS NULL OR TRIM(event_kind) = &#x27;&#x27;\n     OR event_id IS NULL OR TRIM(event_id) = &#x27;&#x27;\n) AS &#x27;Invalid key in expected events&#x27;;\n\nASSERT NOT EXISTS (\n  SELECT 1 FROM expected\n  GROUP BY scope_id, event_kind, event_id\n  HAVING COUNT(*) &gt; 1\n) AS &#x27;Duplicate business-event key&#x27;;\n\nCREATE TEMP TABLE result AS\nWITH ga4 AS (\n  SELECT g.scope_id, g.event_kind, g.event_id, COUNT(*) AS ga4_rows\n  FROM `project_id.monitoring.ga4_observations` g\n  JOIN expected e USING (scope_id, event_kind, event_id)\n  WHERE g.loaded_at &lt;= observed_at\n  GROUP BY g.scope_id, g.event_kind, g.event_id\n),\ncapi AS (\n  SELECT c.scope_id, c.event_kind, c.event_id,\n         COUNT(*) AS capi_attempts,\n         COUNTIF(c.receipt_state = &#x27;received&#x27;) AS capi_receipts,\n         COUNTIF(c.receipt_state = &#x27;unknown&#x27;) AS capi_unknown\n  FROM `project_id.monitoring.capi_attempts` c\n  JOIN expected e USING (scope_id, event_kind, event_id)\n  WHERE c.loaded_at &lt;= observed_at\n  GROUP BY c.scope_id, c.event_kind, c.event_id\n)\nSELECT target_day AS business_day, observed_at AS checked_at, e.*,\n       COALESCE(g.ga4_rows, 0) AS ga4_rows,\n       COALESCE(c.capi_attempts, 0) AS capi_attempts,\n       COALESCE(c.capi_receipts, 0) AS capi_receipts,\n       COALESCE(c.capi_unknown, 0) AS capi_unknown\nFROM expected e\nLEFT JOIN ga4 g USING (scope_id, event_kind, event_id)\nLEFT JOIN capi c USING (scope_id, event_kind, event_id);\n\nSELECT *,\n  CASE\n    WHEN expected_ga4 IS NULL OR expected_meta IS NULL THEN &#x27;SCOPE_UNKNOWN&#x27;\n    WHEN NOT expected_ga4 OR NOT expected_meta THEN &#x27;OUTSIDE_JOINT_SCOPE&#x27;\n    WHEN ga4_rows &gt; 0 AND capi_receipts &gt; 0 THEN &#x27;OBSERVED_BOTH&#x27;\n    WHEN ga4_rows = 0 AND capi_receipts = 0 THEN &#x27;UNCONFIRMED_BOTH&#x27;\n    WHEN ga4_rows = 0 THEN &#x27;UNCONFIRMED_GA4&#x27;\n    ELSE &#x27;UNCONFIRMED_CAPI&#x27;\n  END AS reconciliation_status,\n  ga4_rows &gt; 1 AS repeated_ga4_rows,\n  (expected_ga4 = FALSE AND ga4_rows &gt; 0)\n    OR (expected_meta = FALSE AND capi_attempts &gt; 0) AS unexpected_transmission\nFROM result;<\/code><\/pre>\n<p>Agregacja zapobiega zamianie dw\u00f3ch wierszy GA4 i trzech pr\u00f3b CAPI w sze\u015b\u0107 pozornych zdarze\u0144 biznesowych. Powt\u00f3rzenia pozostaj\u0105 widoczne jako liczby. <code>UNCONFIRMED<\/code> oznacza brak potwierdzenia w dost\u0119pnych danych, niekoniecznie wadliwy tag. <code>unexpected_transmission<\/code> osobno wskazuje wysy\u0142k\u0119 nieprzewidzian\u0105 wed\u0142ug listy referencyjnej.<\/p>\n<p>Przyk\u0142ad nie stanowi kompletnego procesu wczytywania. Dost\u0119p do tabel wymaga odpowiedniego partycjonowania lub ogranicze\u0144, uprawnie\u0144 i sprawdzenia koszt\u00f3w. Wyniki powinny zawiera\u0107 dzie\u0144 biznesowy i czas kontroli. Ponowna ocena ma zast\u0119powa\u0107 starsze dzienne stany, zamiast dopisywa\u0107 duplikaty zmieniaj\u0105ce wska\u017anik.<\/p>\n<h2>4. Alarm o wyniku, a nie tylko o wykonaniu SQL<\/h2>\n<p>Widok <code>latest_reconciliation<\/code> zawiera dok\u0142adnie najnowszy pomy\u015blnie obliczony stan dla dnia biznesowego i klucza. Osobne zapytanie poni\u017cej zwraca wy\u0142\u0105cznie dni przekraczaj\u0105ce przyk\u0142adowy pr\u00f3g. Minimum 100 i granica pi\u0119ciu procent wymagaj\u0105 uzasadnienia; nie s\u0105 uniwersaln\u0105 norm\u0105 jako\u015bci.<\/p>\n<pre class=\"wp-block-code-beautifier-block-code\"><code>-- A separate scheduled SELECT over the latest successful snapshot.\nWITH counts AS (\n  SELECT business_day,\n    COUNTIF(expected_ga4 AND expected_meta) AS comparable,\n    COUNTIF(expected_ga4 AND expected_meta\n            AND (ga4_rows = 0 OR capi_receipts = 0)) AS unconfirmed\n  FROM `project_id.monitoring.latest_reconciliation`\n  GROUP BY business_day\n),\nrates AS (\n  SELECT *, 100 * SAFE_DIVIDE(unconfirmed, comparable) AS rate_pct\n  FROM counts\n)\nSELECT *\nFROM rates\nWHERE comparable &gt;= 100 AND rate_pct &gt; 5;<\/code><\/pre>\n<p>Przy braku por\u00f3wnywalnych zdarze\u0144 <code>SAFE_DIVIDE<\/code> pozostawia wska\u017anik nieznany. Zdarzenia poza wsp\u00f3lnym zakresem i nierozstrzygni\u0119te oczekiwania nie wchodz\u0105 do mianownika. Osobne kontrole musz\u0105 obejmowa\u0107 te przypadki, nieoczekiwan\u0105 wysy\u0142k\u0119, niepoprawne ID, powt\u00f3rzenia i niekompletne dop\u0142ywy danych.<\/p>\n<p>Metryka Scheduled Query <code>last_execution_job_rows<\/code> zlicza wiersze wyniku, a nie warto\u015b\u0107 <code>rate_pct<\/code>. Regu\u0142a Monitoring ograniczona do zapytania zwracaj\u0105cego naruszenia mo\u017ce alarmowa\u0107 przy liczbie wierszy wi\u0119kszej od zera. Poprzednia warto\u015b\u0107 mo\u017ce pozosta\u0107 po b\u0142\u0119dzie lub wy\u0142\u0105czeniu zadania. B\u0142\u0119dy wykonania i aktualno\u015b\u0107 wymagaj\u0105 wi\u0119c osobnego monitorowania; zachowany stary alarm nie jest nowym wynikiem dziennym.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy ID uzgadniania wymaga wymiaru niestandardowego GA4?<\/h3>\n<p>Nie do odczytu parametru rzeczywi\u015bcie wyeksportowanego w <code>event_params<\/code>. Rejestracja nie gwarantuje jednak wys\u0142ania ani eksportu. Brakuj\u0105ce lub wielokrotne klucze wymagaj\u0105 wykrywania podczas wczytywania.<\/p>\n<h3>Czy wystarcza 48 godzin i uruchomienie o 06:00 UTC?<\/h3>\n<p>Nie. GA4 mo\u017ce uzupe\u0142nia\u0107 tabele przez kilka dni kalendarzowych i czasami ponownie przetwarza\u0107 dane historyczne. Wysy\u0142ka CAPI i lokalny log maj\u0105 odr\u0119bne op\u00f3\u017anienia. Czas oczekiwania, kontrola aktualno\u015bci i ponowna ocena starszych dni nale\u017c\u0105 do jednego procesu; sta\u0142a godzina nie gwarantuje zako\u0144czenia eksportu.<\/p>\n<h3>Czy ads_storage zast\u0119puje kontrol\u0119 zgody dla Meta?<\/h3>\n<p>Nie. <code>Yes<\/code>, <code>No<\/code>, <code>Unset<\/code> i brak warto\u015bci nie rozstrzygaj\u0105 automatycznie o zezwoleniu dla innej us\u0142ugi. Oczekiwania musz\u0105 wynika\u0107 z faktycznej, udokumentowanej konfiguracji us\u0142ugi i decyzji. Celowo niewys\u0142ane zdarzenie nie oznacza awarii technicznej, a stan nieznany nie oznacza zgody.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/7029846?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">GA4 BigQuery export schema<\/a><\/li>\n<li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/conversions-api\/using-the-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Conversions API: using the API<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/bigquery\/docs\/create-alert-scheduled-query\" target=\"_blank\" rel=\"noopener noreferrer\">BigQuery: alerts with scheduled queries<\/a><\/li>\n<\/ul>\n<\/div>\n<p><!-- lw-analytics-reconcile-guide:start --><\/p>\n<h2>Kontrola w praktyce: uzgodnienie zam\u00f3wie\u0144 z eksportem sklepu<\/h2>\n<p>Narz\u0119dzie <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/shop-ga4-revenue-reconciliation\/\">Por\u00f3wnanie przychod\u00f3w sklepu i GA4<\/a> por\u00f3wnuje dwa pliki CSV lokalnie. Wsp\u00f3lnym kluczem jest identyfikator zam\u00f3wienia. Imiona, nazwiska, adresy e-mail i adresy pocztowe nie s\u0105 potrzebne: wystarcz\u0105 ID zam\u00f3wienia, kwota i waluta. Nie oznacza to automatycznej anonimowo\u015bci ID zam\u00f3wienia.<\/p>\n<ol>\n<li>Przygotowanie eksport\u00f3w dla tego samego okresu i strefy czasowej, z identycznym traktowaniem podatk\u00f3w, dostawy i zwrot\u00f3w. Pozycje towar\u00f3w i zwroty wymagaj\u0105 wcze\u015bniejszego zsumowania do uzgodnionej kwoty na zam\u00f3wienie.<\/li>\n<li>Wyb\u00f3r separatora i znaku dziesi\u0119tnego dla ka\u017cdego pliku, wczytanie i przypisanie kolumn ID, kwoty i waluty. Zera na pocz\u0105tku identyfikatora pozostaj\u0105 zachowane.<\/li>\n<li>Wyb\u00f3r liczby miejsc dziesi\u0119tnych i jawnej tolerancji na zam\u00f3wienie. Bez przeliczania walut.<\/li>\n<li>Kontrola osobnych grup: brak po jednej stronie, powt\u00f3rzone ID, inna waluta i kwota poza tolerancj\u0105.<\/li>\n<li>Eksport wyniku i sprawdzenie konkretnych zam\u00f3wie\u0144 w systemach \u017ar\u00f3d\u0142owych.<\/li>\n<\/ol>\n<p>Powt\u00f3rzone ID s\u0105 oznaczane zamiast sumowania: ponowne wys\u0142anie zakupu, eksport pozycji i wiersz zwrotu wymagaj\u0105 odmiennej interpretacji. Ujemne kwoty s\u0105 akceptowane jako liczby, lecz definicja biznesowa nadal musi si\u0119 zgadza\u0107. Brak zam\u00f3wienia w Analytics mo\u017ce wynika\u0107 ze zgody, momentu pomiaru, filtr\u00f3w lub b\u0142\u0119d\u00f3w zbierania; sam w sobie nie dowodzi wadliwego tagu. Zerowa r\u00f3\u017cnica nie potwierdza eksportu wszystkich zam\u00f3wie\u0144. Narz\u0119dzie nie sumuje kwot w r\u00f3\u017cnych walutach.<\/p>\n<p>Definicje wynikaj\u0105 z wybranego eksportu i <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/ecommerce\" target=\"_blank\" rel=\"noopener noreferrer\">dokumentacji ecommerce GA4<\/a>. <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/api-schema\" target=\"_blank\" rel=\"noopener noreferrer\">Schemat Data API<\/a> rozr\u00f3\u017cnia ID transakcji i metryki przychodu; og\u00f3lny przych\u00f3d ca\u0142kowity nie musi odpowiada\u0107 kwocie zam\u00f3wienia sklepu.<\/p>\n<p><!-- lw-analytics-reconcile-guide:end --><\/p>\n<p><!-- lw-revenue-export-guide:start --><\/p>\n<h2>Przygotowanie pliku CSV Analytics w BigQuery<\/h2>\n<p><a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/shop-ga4-revenue-reconciliation\/#aw-export-helper\">Pomocnik eksportu w por\u00f3wnywarce przychod\u00f3w<\/a> tworzy zapytanie o zakupy dla istniej\u0105cego dziennego eksportu GA4. Projekt, zbi\u00f3r danych, daty i precyzja zaokr\u0105glania s\u0105 wprowadzane lokalnie. Strona nie wykonuje SQL ani nie \u017c\u0105da dost\u0119pu do BigQuery.<\/p>\n<p>Kolumny wyniku <code>transaction_id<\/code>, <code>amount<\/code> i <code>currency<\/code> odpowiadaj\u0105 polom por\u00f3wnania. Ka\u017cdy zarejestrowany zakup pozostaje wierszem. Dodatkowa liczba zdarze\u0144 zakupu pomaga znale\u017a\u0107 powtarzaj\u0105ce si\u0119 identyfikatory transakcji; nie s\u0105 one automatycznie sumowane ani usuwane. Brak kwoty nie jest zast\u0119powany zerem.<\/p>\n<ol>\n<li>Przed eksportem sklepu uzgodnienie definicji kwoty zakupu i granic dni. Zapytanie pomija zwroty oraz nie dodaje osobno podatk\u00f3w i dostawy.<\/li>\n<li>Wygenerowanie SQL, walidacja w BigQuery i sprawdzenie szacowanych koszt\u00f3w. Przed wykonaniem ustawienie maksymalnej liczby rozliczanych bajt\u00f3w.<\/li>\n<li>Zapis ca\u0142ego wyniku jako lokalnego CSV. W por\u00f3wnaniu wyb\u00f3r przecinka jako separatora, kropki dziesi\u0119tnej i tej samej precyzji co w zapytaniu.<\/li>\n<li>Kontrola powtarzaj\u0105cych si\u0119 identyfikator\u00f3w i brakuj\u0105cych p\u00f3l przed interpretacj\u0105 r\u00f3\u017cnic kwot. Por\u00f3wnanie obs\u0142uguje do 20 000 wierszy danych na plik. Identyfikatory w arkuszach powinny pozosta\u0107 tekstem.<\/li>\n<\/ol>\n<p>Dwa fikcyjne pliki CSV do pobrania zapewniaj\u0105 powtarzalny pierwszy test, po jednym przypadku w ka\u017cdej z sze\u015bciu grup wynik\u00f3w. S\u0105 niezale\u017cne od SQL i u\u017cywaj\u0105 dw\u00f3ch miejsc dziesi\u0119tnych oraz zerowej tolerancji.<\/p>\n<p>\u0179r\u00f3d\u0142a: <a href=\"https:\/\/support.google.com\/analytics\/answer\/7029846?hl=pl\">schemat eksportu GA4<\/a>, <a href=\"https:\/\/docs.cloud.google.com\/bigquery\/docs\/running-queries\">walidacja zapyta\u0144 i kontrola koszt\u00f3w<\/a> oraz <a href=\"https:\/\/docs.cloud.google.com\/bigquery\/docs\/export-file\">zapisywanie wynik\u00f3w jako CSV<\/a>.<\/p>\n<p><!-- lw-revenue-export-guide:end --><br \/>\n<!-- lw-items-practice:start --><\/p>\n<h2>Kontrola praktyczna: tablica items przed wys\u0142aniem<\/h2>\n<p>Zdarzenie e-commerce mo\u017ce dotrze\u0107 do Google mimo b\u0142\u0119dnych danych produkt\u00f3w. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/ga4-ecommerce-item-array-validator\/\">GA4 E-Commerce Item Array Validator<\/a> sprawdza tablic\u0119 JSON lokalnie i wskazuje konkretne pole, na przyk\u0142ad <code>items[0].price<\/code>. Cena zapisana w cudzys\u0142owie, taka jak <code>\"12.50\"<\/code>, jest zg\u0142aszana jako b\u0142\u0105d typu zamiast automatycznej zamiany na liczb\u0119.<\/p>\n<p>Kontrola rozr\u00f3\u017cnia b\u0142\u0119dy i uwagi. Powt\u00f3rzone identyfikatory produkt\u00f3w mog\u0105 oznacza\u0107 warianty i nie dowodz\u0105 podw\u00f3jnego zarejestrowania zakup\u00f3w. Brak ceny uniemo\u017cliwia obliczenie pe\u0142nej warto\u015bci. Ilo\u015b\u0107 zero pozostaje zerem, a brak ilo\u015bci oznacza jeden. Suma uwzgl\u0119dnia cen\u0119 po rabacie, bez podatku i wysy\u0142ki. Waluta i identyfikator transakcji na poziomie zdarzenia nadal wymagaj\u0105 osobnej kontroli.<\/p>\n<p>Przydatny przebieg pracy \u0142\u0105czy kontrol\u0119 tablicy, sprawdzenie rzeczywistego \u017c\u0105dania sieciowego i p\u00f3\u017aniejsze uzgodnienie zam\u00f3wie\u0144. Poprawna struktura nie dowodzi poprawnego zbierania ani raportowania danych. Podstaw\u0105 s\u0105 <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/ecommerce\">przewodnik Google po e-commerce<\/a> oraz <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\/reference\/events#purchase\">dokumentacja purchase<\/a>.<\/p>\n<p><!-- lw-items-practice:end --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Techniczny przewodnik krok po kroku po budowie zautomatyzowanego potoku uzgadniania i walidacji zdarze\u0144 pomi\u0119dzy GA4 a Meta Conversions API w BigQuery.<\/p>\n","protected":false},"author":1,"featured_media":14012,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[117],"tags":[92084,92035,92097,92100,92250,92044,92238],"class_list":["post-452","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl","tag-bigquery-pl","tag-conversion-tracking-pl","tag-data-quality-pl","tag-google-analytics-4-pl","tag-meta-conversions-api-pl","tag-tracking-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-08T18:15:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T00:25:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery\",\"datePublished\":\"2026-09-08T18:15:00+00:00\",\"dateModified\":\"2026-10-24T00:25:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/\"},\"wordCount\":1616,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png\",\"keywords\":[\"BigQuery\",\"Conversion Tracking\",\"Data Quality\",\"Google Analytics 4\",\"Meta Conversions API\",\"Tracking\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/\",\"name\":\"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png\",\"datePublished\":\"2026-09-08T18:15:00+00:00\",\"dateModified\":\"2026-10-24T00:25:45+00:00\",\"description\":\"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png\",\"width\":1200,\"height\":630,\"caption\":\"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-analytics-pl\\\/tutorials-pl\\\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik","description":"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/","og_locale":"en_US","og_type":"article","og_title":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik","og_description":"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-08T18:15:00+00:00","article_modified_time":"2026-10-24T00:25:45+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery","datePublished":"2026-09-08T18:15:00+00:00","dateModified":"2026-10-24T00:25:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/"},"wordCount":1616,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png","keywords":["BigQuery","Conversion Tracking","Data Quality","Google Analytics 4","Meta Conversions API","Tracking","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/","name":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png","datePublished":"2026-09-08T18:15:00+00:00","dateModified":"2026-10-24T00:25:45+00:00","description":"Uzgadnianie zdarze\u0144 GA4 i Meta CAPI w BigQuery: kontrola SQL, alerty i por\u00f3wnanie z zam\u00f3wieniami sklepu oraz plikami CSV.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-452-automatyzacja-walidacji-zdarzen-ga4--g.png","width":1200,"height":630,"caption":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-analytics-pl\/tutorials-pl\/automatyzacja-walidacji-zdarzen-ga4-i-meta-capi-w-bigquery\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Automatyzacja walidacji zdarze\u0144 GA4 i Meta CAPI w BigQuery"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/452","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=452"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/452\/revisions"}],"predecessor-version":[{"id":23168,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/452\/revisions\/23168"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14012"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}