{"id":8105,"date":"2026-08-11T13:22:00","date_gmt":"2026-08-11T11:22:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=8105"},"modified":"2026-10-24T03:14:10","modified_gmt":"2026-10-24T01:14:10","slug":"wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/","title":{"rendered":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery"},"content":{"rendered":"<p>Serwerowe wzbogacanie danych dodaje do zdarzenia pomiarowego wybrane atrybuty z backendu, na przyk\u0142ad wcze\u015bniej obliczony segment warto\u015bci klienta. Wewn\u0119trzne pola CRM mog\u0105 dzi\u0119ki temu pozosta\u0107 poza przegl\u0105dark\u0105. Przeniesienie przetwarzania na serwer nie zapewnia jednak anonimowo\u015bci ani automatycznej zgody na przekazanie danych platformom reklamowym.<\/p>\n<h2>Mniej danych w przegl\u0105darce, wyra\u017ane granice<\/h2>\n<p>Numer klienta lub zahaszowany identyfikator pozostaje dan\u0105 osobow\u0105 albo pseudonimizowan\u0105, je\u017celi mo\u017cliwe jest powi\u0105zanie z osob\u0105. Haszowanie nie jest szyfrowaniem ani og\u00f3lnym dowodem anonimowo\u015bci. Tokeny sesji mog\u0105 by\u0107 szczeg\u00f3lnie wra\u017cliwe: tokeny dost\u0119pu i ciasteczka uwierzytelniaj\u0105ce nie powinny trafia\u0107 do zdarze\u0144 analitycznych.<\/p>\n<p>W\u0142a\u015bciwy projekt oddziela identyfikator pomiarowy od uwierzytelniania. Serwer musi zweryfikowa\u0107 dozwolone powi\u0105zanie z kontem klienta. Dowolnie zmienialne pole <code>user_id<\/code> w publicznym \u017c\u0105daniu przegl\u0105darki nie mo\u017ce wybiera\u0107 dowolnych rekord\u00f3w CRM. Sama poprawna sk\u0142adnia identyfikatora nie stanowi uprawnienia.<\/p>\n<table>\n<thead>\n<tr>\n<th>Etap<\/th>\n<th>Zadanie<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Przegl\u0105darka<\/td>\n<td>Wysy\u0142ka potrzebnych p\u00f3l zdarzenia i ewentualnie dozwolonego pseudonimowego identyfikatora pomiarowego.<\/td>\n<\/tr>\n<tr>\n<td>Zweryfikowany backend<\/td>\n<td>Ustalenie to\u017csamo\u015bci, uprawnienia do zdarzenia i dozwolonego celu wzbogacania.<\/td>\n<\/tr>\n<tr>\n<td>Baza wzbogacania<\/td>\n<td>Udost\u0119pnienie niewielkiego zestawu zatwierdzonych atrybut\u00f3w z czasem aktualizacji.<\/td>\n<\/tr>\n<tr>\n<td>Tag docelowy<\/td>\n<td>Wysy\u0142ka dozwolonych p\u00f3l w schemacie odbiorcy zgodnie z wymaganymi regu\u0142ami zgody.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-8105-crm-20261024.png\" alt=\"Sprawdzone powi\u0105zanie konta, minimalne dane Firestore, regu\u0142y odbiorcy i jawne stany b\u0142\u0119d\u00f3w.\"\/><figcaption>Sprawdzone powi\u0105zanie konta, minimalne dane Firestore, regu\u0142y odbiorcy i jawne stany b\u0142\u0119d\u00f3w.<\/figcaption><\/figure>\n<h2>Odczyt z Firestore, obliczenia w BigQuery<\/h2>\n<p>Firestore nadaje si\u0119 do odczytu dokument\u00f3w wed\u0142ug klucza. Czas odpowiedzi zale\u017cy mi\u0119dzy innymi od regionu, sieci i obci\u0105\u017cenia. Ca\u0142e \u017c\u0105danie ssGTM nie ma gwarantowanej odpowiedzi poni\u017cej milisekundy ani bez op\u00f3\u017anie\u0144. Potrzebny jest pomiar typowych i wysokich op\u00f3\u017anie\u0144 pod realistycznym obci\u0105\u017ceniem.<\/p>\n<p>BigQuery s\u0142u\u017cy do oblicze\u0144 analitycznych, na przyk\u0142ad segmentu warto\u015bci klienta na podstawie historii zam\u00f3wie\u0144. Osobny, monitorowany proces eksportu zapisuje zatwierdzone wyniki w Firestore. Samo po\u0142\u0105czenie produkt\u00f3w nie tworzy takiego eksportu. Aktualno\u015b\u0107 oblicze\u0144, b\u0142\u0119dy eksportu i usuwanie danych wymagaj\u0105 jawnej obs\u0142ugi. \u015acie\u017cka \u017c\u0105dania odczytuje przygotowane warto\u015bci zamiast wykonywa\u0107 z\u0142o\u017cone zapytanie do hurtowni dla ka\u017cdego zdarzenia.<\/p>\n<h2>Celowo ograniczony przyk\u0142ad odczytu<\/h2>\n<p>Poni\u017cszy kod jest przeznaczony do niestandardowej zmiennej serwerowej i nie stanowi kompletnego szablonu. Wymagane s\u0105 trzy pola szablonu: <code>projectId<\/code> jako sta\u0142a konfiguracja projektu, <code>authorizedCustomerKey<\/code> ze zweryfikowanego powi\u0105zania po stronie serwera oraz <code>lookupAllowed<\/code> jako warto\u015b\u0107 logiczna wynikaj\u0105ca ze sprawdzonej kontroli uprawnie\u0144 i zgody. Bezpo\u015brednie kopiowanie tych warto\u015bci z p\u00f3l przegl\u0105darki nie spe\u0142nia warunku.<\/p>\n<p>Oddzielna kolekcja <code>enrichment<\/code> zawiera wy\u0142\u0105cznie zatwierdzone atrybuty. Eksporter zapisuje <code>updated_at_ms<\/code> jako czas uniksowy w milisekundach, a nie obiekt Timestamp Firestore. Warto\u015bci segment\u00f3w i limit aktualno\u015bci wynosz\u0105cy 24 godziny s\u0105 przyk\u0142adami wymagaj\u0105cymi dopasowania do rzeczywistego modelu danych.<\/p>\n<pre class=\"wp-block-code\"><code>const Firestore = require(&#x27;Firestore&#x27;);\nconst getType = require(&#x27;getType&#x27;);\nconst queryPermission = require(&#x27;queryPermission&#x27;);\nconst getTimestampMillis = require(&#x27;getTimestampMillis&#x27;);\n\n\/\/ Template inputs: trusted server-side mapping, never raw browser fields.\nif (data.lookupAllowed !== true) return {status: &#x27;not_allowed&#x27;};\nconst key = data.authorizedCustomerKey;\nif (getType(key) !== &#x27;string&#x27; || key.length &lt; 16 || key.length &gt; 128) {\n  return {status: &#x27;invalid_key&#x27;};\n}\nconst alphabet = &#x27;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-&#x27;;\nfor (let i = 0; i &lt; key.length; i++) {\n  if (alphabet.indexOf(key.charAt(i)) &lt; 0) return {status: &#x27;invalid_key&#x27;};\n}\nif (getType(data.projectId) !== &#x27;string&#x27; || data.projectId.length === 0) {\n  return {status: &#x27;invalid_project&#x27;};\n}\nconst path = &#x27;enrichment\/&#x27; + key;\nif (!queryPermission(&#x27;access_firestore&#x27;, &#x27;read&#x27;, {projectId: data.projectId, path: path})) {\n  return {status: &#x27;permission_denied&#x27;};\n}\nconst maxAgeMs = 86400000; \/\/ Example freshness policy: 24 hours.\nreturn Firestore.read(path, {\n  projectId: data.projectId\n}).then((result) =&gt; {\n  const record = result.data;\n  if (getType(record) !== &#x27;object&#x27; || record === null) {\n    return {status: &#x27;invalid_record&#x27;};\n  }\n  const timestamp = record.updated_at_ms;\n  const now = getTimestampMillis();\n  if (getType(timestamp) !== &#x27;number&#x27; || !(timestamp &gt; 0) || timestamp &gt; now) {\n    return {status: &#x27;invalid_timestamp&#x27;};\n  }\n  if (now - timestamp &gt; maxAgeMs) return {status: &#x27;stale&#x27;};\n  const segment = record.ltv_segment;\n  if (segment !== &#x27;low&#x27; &amp;&amp; segment !== &#x27;medium&#x27; &amp;&amp; segment !== &#x27;high&#x27;) {\n    return {status: &#x27;invalid_segment&#x27;};\n  }\n  return {status: &#x27;ok&#x27;, attributes: {ltv_segment: segment}};\n}, (error) =&gt; {\n  return {status: error &amp;&amp; error.reason === &#x27;not_found&#x27; ? &#x27;not_found&#x27; : &#x27;lookup_error&#x27;};\n});\n<\/code><\/pre>\n<p><code>Firestore.read<\/code> zwraca obiekt z polami <code>id<\/code> i <code>data<\/code>; pola dokumentu znajduj\u0105 si\u0119 pod <code>result.data<\/code>. Brak dokumentu powoduje odrzucenie z <code>reason: 'not_found'<\/code>. Kod rozr\u00f3\u017cnia dane brakuj\u0105ce, przestarza\u0142e, nieprawid\u0142owe i niedost\u0119pne z przyczyn technicznych. Nieznana warto\u015b\u0107 nie staje si\u0119 mar\u017c\u0105 zerow\u0105 ani standardowym klientem.<\/p>\n<p>Tag docelowy mo\u017ce pobra\u0107 jawnie przypisane atrybuty tylko przy <code>status === 'ok'<\/code>. Wewn\u0119trzny obiekt statusu nie jest pakietem do wysy\u0142ki. Udany odczyt nie zast\u0119puje r\u00f3wnie\u017c zgody w\u0142a\u015bciwej dla odbiorcy. Ka\u017cde zdarzenie wymaga ustalonej regu\u0142y b\u0142\u0119du: wysy\u0142ki ju\u017c dozwolonego zdarzenia podstawowego bez dodatkowych p\u00f3l albo wstrzymania przekazania.<\/p>\n<h2>Uprawnienia i czas wykonania<\/h2>\n<p>Wbudowane API Firestore w ssGTM obs\u0142uguje zgodnie z dokumentacj\u0105 tryb Native i wy\u0142\u0105cznie baz\u0119 <code>(default)<\/code>. Izolacja mo\u017ce wykorzystywa\u0107 osobny projekt z w\u0142asn\u0105 baz\u0105 domy\u015bln\u0105. Szablon potrzebuje tylko odczytu przez <code>access_firestore<\/code> dla konkretnego projektu i przewidzianej \u015bcie\u017cki. Ograniczenia szablonu uzupe\u0142niaj\u0105 IAM, ale nie zast\u0119puj\u0105 IAM.<\/p>\n<p>Us\u0142uga wykonawcza potrzebuje osobnej to\u017csamo\u015bci z minimalnymi uprawnieniami odczytu. Eksport u\u017cywa oddzielnej to\u017csamo\u015bci zapisuj\u0105cej. Dost\u0119p serwerowy jest kontrolowany przez IAM; przegl\u0105darkowe Security Rules nie chroni\u0105 tej \u015bcie\u017cki. Kolekcja z niewielk\u0105 liczb\u0105 p\u00f3l i granica osobnego projektu ograniczaj\u0105 zakres danych dost\u0119pnych po przej\u0119ciu us\u0142ugi.<\/p>\n<p>Odczyt wyd\u0142u\u017ca przetwarzanie zale\u017cnych tag\u00f3w. Oczekiwanie odpowiedzi przegl\u0105darki zale\u017cy od klienta i sposobu zwracania odpowiedzi. Udokumentowane opcje <code>Firestore.read<\/code> nie obejmuj\u0105 w\u0142asnego parametru <code>timeout<\/code>; nieznane opcje s\u0105 ignorowane. Obietnice w izolowanym JavaScript maj\u0105 udokumentowany limit pi\u0119ciu sekund. Limit nie zast\u0119puje \u015bwiadomie ustalonego kr\u00f3tkiego bud\u017cetu odpowiedzi. \u015aci\u015blejsze terminy mog\u0105 wymaga\u0107 osobnej us\u0142ugi odczytu albo procesu asynchronicznego.<\/p>\n<h2>Kontrola odbiorc\u00f3w i dzia\u0142ania<\/h2>\n<p>GA4 i Meta CAPI maj\u0105 r\u00f3\u017cne modele danych oraz wymagania. Hash nie zezwala na dowolne dane osobowe w parametrach zdarze\u0144. Google udost\u0119pnia specjalnie konfigurowane funkcje user-provided data; funkcje te r\u00f3\u017cni\u0105 si\u0119 od zwyk\u0142ego User-ID i parametr\u00f3w niestandardowych. Mar\u017ce i segmenty powinny trafia\u0107 wy\u0142\u0105cznie do odbiorc\u00f3w rzeczywi\u015bcie wymagaj\u0105cych takich informacji.<\/p>\n<p>Kontrola dzia\u0142ania obejmuje udzia\u0142 trafie\u0144, brakuj\u0105ce dokumenty, nieaktualne eksporty, b\u0142\u0119dy techniczne i rozk\u0142ad op\u00f3\u017anie\u0144. Zagregowane liczniki ograniczaj\u0105 zb\u0119dne dane CRM w logach. Koszty obejmuj\u0105 odczyty, zapisy eksportu, przechowywanie i ewentualny ruch sieciowy. Pami\u0119\u0107 podr\u0119czna API obejmuje bie\u017c\u0105ce \u017c\u0105danie lub wykonanie kontenera, a nie globalny cache klient\u00f3w.<\/p>\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Dlaczego nie zast\u0119powa\u0107 braku danych zerem?<\/h3>\n<p>Warto\u015b\u0107 nieznana i rzeczywiste zero maj\u0105 r\u00f3\u017cne znaczenie. Warto\u015b\u0107 zast\u0119pcza mo\u017ce zniekszta\u0142ci\u0107 analiz\u0119. Status b\u0142\u0119du i pomini\u0119cie dodatkowego pola zachowuj\u0105 t\u0119 r\u00f3\u017cnic\u0119.<\/p>\n<h3>Czy serwer gwarantuje brak wyciek\u00f3w?<\/h3>\n<p>Nie. Odpowiedzi do przegl\u0105darki, diagnostyka, logi, eksporty i \u017c\u0105dania wyj\u015bciowe pozostaj\u0105 mo\u017cliwymi \u015bcie\u017ckami danych. Konfiguracja oraz rzeczywi\u015bcie wysy\u0142ane pola wymagaj\u0105 kontroli.<\/p>\n<h3>Co zosta\u0142o sprawdzone w przyk\u0142adzie?<\/h3>\n<p>29 izolowanych test\u00f3w z symulowanymi API obejmuje granice danych wej\u015bciowych, blokady odczytu, brakuj\u0105ce i nieaktualne rekordy oraz dozwolony zestaw p\u00f3l. Testy nie potwierdzaj\u0105 zgodno\u015bci z piaskownic\u0105 GTM, rzeczywistych uprawnie\u0144 IAM, zachowania pod obci\u0105\u017ceniem ani poprawno\u015bci pakiet\u00f3w dla dostawc\u00f3w.<\/p>\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/api\">Server-side tagging APIs<\/a><\/li>\n<li><a href=\"https:\/\/firebase.google.com\/docs\/firestore\/best-practices\">Firestore best practices<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/firestore\/docs\/security\/iam\">Firestore IAM<\/a><\/li>\n<li><a href=\"https:\/\/firebase.google.com\/docs\/firestore\/security\/rules-conditions\">Firestore Security Rules<\/a><\/li>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/9213390?hl=en\">GA4 User-ID<\/a><\/li>\n<li><a href=\"https:\/\/support.google.com\/analytics\/answer\/14077171?hl=en\">GA4 user-provided data<\/a><\/li>\n<li><a href=\"https:\/\/firebase.google.com\/docs\/firestore\/pricing\">Firestore billing<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/introduction\">BigQuery overview<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/bigquery\/docs\">BigQuery documentation<\/a><\/li>\n<li><a href=\"https:\/\/www.edpb.europa.eu\/topics\/ai-and-technology\/anonymisation-pseudonymisation_en\">Pseudonymisation and anonymisation<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/permissions\">Server-side template permissions<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\">Server-side tagging overview<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Jak wzbogaca\u0107 zdarzenia w Server-Side GTM o atrybuty CRM z bazy Google Cloud Firestore bez ujawniania danych PII w przegl\u0105darce.<\/p>\n","protected":false},"author":1,"featured_media":23322,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[92084,92151,92041,92103,92133,92412,92136],"class_list":["post-8105","post","type-post","status-publish","format-standard","hentry","category-digital-marketing-pl","tag-bigquery-pl","tag-prywatnosc-danych-pl-pl","tag-first-party-data-pl","tag-google-cloud-pl","tag-google-tag-manager-pl","tag-pii-protection-pl","tag-server-side-gtm-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.\" \/>\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-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-11T11:22:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T01:14:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-8105-server-side-gtm-data-enrichment-fire-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=\"6 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-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery\",\"datePublished\":\"2026-08-11T11:22:00+00:00\",\"dateModified\":\"2026-10-24T01:14:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/\"},\"wordCount\":1010,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-8105-crm-20261024-dark.png\",\"keywords\":[\"BigQuery\",\"Data Privacy\",\"First-Party Data\",\"Google Cloud\",\"Google Tag Manager\",\"PII Protection\",\"Server-Side GTM\"],\"articleSection\":[\"Digital Marketing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/\",\"name\":\"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-8105-crm-20261024-dark.png\",\"datePublished\":\"2026-08-11T11:22:00+00:00\",\"dateModified\":\"2026-10-24T01:14:10+00:00\",\"description\":\"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-8105-crm-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-8105-crm-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/digital-marketing-pl\\\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Server-Side GTM: wzbogacanie danych CRM z Firestore i 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":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik","description":"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.","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-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/","og_locale":"en_US","og_type":"article","og_title":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik","og_description":"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-11T11:22:00+00:00","article_modified_time":"2026-10-24T01:14:10+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-8105-server-side-gtm-data-enrichment-fire-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery","datePublished":"2026-08-11T11:22:00+00:00","dateModified":"2026-10-24T01:14:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/"},"wordCount":1010,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-8105-crm-20261024-dark.png","keywords":["BigQuery","Data Privacy","First-Party Data","Google Cloud","Google Tag Manager","PII Protection","Server-Side GTM"],"articleSection":["Digital Marketing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/","name":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-8105-crm-20261024-dark.png","datePublished":"2026-08-11T11:22:00+00:00","dateModified":"2026-10-24T01:14:10+00:00","description":"Wzbogacanie zdarze\u0144 Server-Side GTM danymi CRM: Firestore i BigQuery, odczyt atrybut\u00f3w i obs\u0142uga brakuj\u0105cych warto\u015bci.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-8105-crm-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-8105-crm-20261024-dark.png","width":1200,"height":630,"caption":"Server-Side GTM: wzbogacanie danych CRM z Firestore i BigQuery"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/digital-marketing-pl\/wzbogacanie-danych-w-server-side-gtm-wyszukiwanie-crm-w-czasie-rzeczywistym\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Server-Side GTM: wzbogacanie danych CRM z Firestore i 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\/8105","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=8105"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/8105\/revisions"}],"predecessor-version":[{"id":23324,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/8105\/revisions\/23324"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23322"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=8105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=8105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=8105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}