22 października 2026 właściciel sklepu na Shopify zapytał na r/shopify, jak inni radzą sobie ze skryptami, które ładują się mimo kliknięcia "Odrzuć". Baner mówił jedno, przeglądarka robiła drugie. To najczęstszy problem z cookies na każdej platformie: baner zapisuje wybór, ale nic na stronie nie jest podłączone tak, żeby go słuchać. WooCommerce, Shopify, headless na Next.js albo Astro i zwykły WordPress psują się tak samo, bo wycieki biorą się z osadzonych filmów, fontów, kodu motywu i konfiguracji tagów, a nie z samej wtyczki banera.
Ten poradnik pokazuje, jak samą przeglądarką sprawdzić, co strona wysyła po odmowie, które zapytania zwykle przeciekają, co zaawansowany tryb zgody Google wysyła celowo i jak zablokować każde z nich. Przy każdym punkcie podaję przepis albo dokumentację dostawcy. To praktyczny poradnik testowania, nie porada prawna.
Dlaczego skrypty ładują się mimo odrzucenia cookies
Autor wątku dobrze opisał ten podział:
Piksele aplikacji to prosta sprawa. Shopify je obsługuje. Cała reszta? Filmy z YouTube, Google Fonts, widżety czatu, skrypty SEO i analityki: nie. W styczniu 2022 sąd w Monachium przyznał odwiedzającemu 100 euro, bo strona przekazała jego adres IP do Google przez Google Fonts, bez zgody.
(u/Plus_Cell394, r/shopify, 22 października 2026, tłumaczenie własne)
Baner kontroluje tylko to, co jest w nim zarejestrowane. Kod wpisany na sztywno w motyw, wklejony w pole stopki, dodany przez blok osadzenia albo ładowany przez wtyczkę, która ignoruje API banera, uruchamia się przy wczytaniu strony bez względu na odpowiedź. Baner pokazuje “Odrzucono” i ma rację co do własnego stanu. Strona po prostu go nie zapytała.
Art. 399 PKE i art. 5 ust. 3 dyrektywy ePrivacy: nie tylko pliki cookie
W Polsce zasadę zapisuje art. 399 ustawy Prawo komunikacji elektronicznej: przechowywanie informacji lub uzyskiwanie dostępu do informacji w urządzeniu końcowym jest dozwolone po uprzednim poinformowaniu użytkownika i wyrażeniu przez niego zgody, z wyjątkami dla transmisji i usług, które są do tego niezbędne. To polskie wdrożenie art. 5 ust. 3 dyrektywy ePrivacy.
Zasięg tego przepisu ustalają dwa źródła unijne. TSUE orzekł w sprawie Planet49 (C-673/17), że zaznaczone z góry pole nie jest ważną zgodą i że przepis stosuje się bez względu na to, czy przechowywana informacja jest daną osobową. Wytyczne EROD 2/2023 o technicznym zakresie art. 5 ust. 3 (wersja 2.0 przyjęta 7 października 2024) idą dalej: kod JavaScript, którym podmiot każe przeglądarce wysyłać asynchroniczne zapytania z informacjami, mieści się w zakresie przepisu. Wytyczne mają osobne części o pikselach śledzących i o śledzeniu wyłącznie po adresie IP.
Zdanie “nie ustawiamy cookies” nie zamyka więc sprawy. EROD przypomina też, że zastosowanie przepisu nie oznacza automatycznie obowiązku zgody, bo istnieją wyjątki. Czy któryś pasuje, to pytanie do prawnika. Czy zapytanie w ogóle wychodzi, to pytanie techniczne i na nie odpowiesz sam.
Jak sprawdzić baner cookies w narzędziach deweloperskich
Chrome, Brave, Firefox i Edge działają tu tak samo.
- Otwórz nowy profil albo okno prywatne bez rozszerzeń. Blokery reklam ukrywają dokładnie te zapytania, których szukasz.
- Otwórz narzędzia deweloperskie przed wczytaniem strony. W zakładce Network zaznacz “Preserve log” i “Disable cache”.
- Wczytaj stronę główną i nie dotykaj banera. Zapisz każdą zewnętrzną domenę z listy. Przed wyborem nic opcjonalnego nie powinno się ładować.
- Kliknij “Odrzuć” i przejdź przez kartę produktu, stronę z filmem, kontakt i koszyk. Wycieki często siedzą w szablonach, których strona główna nie używa.
- Filtruj listę po fragmentach domen:
google,gstatic,doubleclick,facebook,tiktok,youtube,hotjar,clarity, nazwa dostawcy czatu. - W zakładce Application (Storage w Firefoksie) przejrzyj Cookies, Local storage i Session storage dla każdego źródła. Wszystko poza zapisem samej odmowy i funkcjonalnymi ciasteczkami sesji wymaga wyjaśnienia.
- Powtórz test z “Akceptuj”, żeby potwierdzić, że narzędzia działają, gdy są dozwolone.
Wynik zapisz w tabeli: domena, strona, przed wyborem, po odmowie, po akceptacji. Ta tabela to twoja lista poprawek.
Co najczęściej przecieka po kliknięciu “Odrzuć”
| Źródło | Jak wygląda w Network | Typowa przyczyna |
|---|---|---|
| Osadzony YouTube lub Vimeo | youtube.com, ytimg.com, googlevideo.com przy wczytaniu strony | Zwykły iframe w treści albo bloku motywu |
| Google Fonts | fonts.googleapis.com i fonts.gstatic.com | Motyw lub wtyczka pobiera fonty z Google zamiast z plików lokalnych |
| Widżet czatu | Skrypt dostawcy i websocket na każdej podstronie | Kod wklejony w stopkę albo ustawienia motywu |
| Mapy | maps.googleapis.com, kafelki mapy | Mapa sklepów lub mapa na stronie kontaktu |
| Piksele wpisane w motyw | connect.facebook.net, analytics.tiktok.com, tagi Google Ads | Kod w polach nagłówka, poza systemem zgód |
| Tagi w menedżerze tagów | Tagi odpalają się w podglądzie GTM przy odmowie | Tagi bez ustawień zgody albo reguły “All Pages” |
Google w pomocy YouTube o osadzaniu opisuje tryb rozszerzonej prywatności (youtube-nocookie.com) jako taki, w którym obejrzenie osadzonego filmu nie wpływa na personalizację YouTube u widza. Nie pisze, że odtwarzacz nic do Google nie wysyła, więc sama zmiana domeny nie jest poprawką.
Fonty to przypadek z wyrokiem. Sąd krajowy w Monachium (LG München I, 3 O 17493/20, 20 stycznia 2022) uznał, że przekazanie dynamicznego adresu IP odwiedzającego do Google przez Google Fonts bez zgody naruszyło jego prawa, nakazał zaprzestania i zasądził 100 euro zadośćuczynienia. Sąd wskazał, że Google Fonts można używać bez łączenia przeglądarki z serwerem Google. Jeden z komentujących trafnie opisał zakres tej poprawki:
Fonty na własnym serwerze zamykają to jedno zapytanie.
(u/More_Initiative_9099, r/shopify, 22 października 2026, tłumaczenie własne)
Aktualizacja, . Ten sam przeciek siedzi na karcie produktu WooCommerce, gdy galeria pokazuje film. Osadzony odtwarzacz YouTube albo Vimeo to zasób zewnętrzny, który ładuje się razem ze stroną, zanim ktokolwiek kliknie, chyba że do naciśnięcia “odtwórz” zastępuje go plakat. Poprawiłem to w mojej wtyczce Reel, która dodaje film do galerii produktu w WooCommerce. Od wersji 1.0.27 filmy z YouTube i Vimeo pokazują plakat z przyciskiem odtwarzania, a odtwarzacz ładuje się dopiero po jego naciśnięciu. Kto nie włączy filmu, nie pobiera nic z odtwarzacza, YouTube gra z domeny youtube-nocookie.com, a plakat wypełnia zarezerwowaną ramkę 16:9, więc nic się nie przesuwa. Przy włączonym autoodtwarzaniu odtwarzacz osadza się od razu, jak wcześniej. Wersja 1.1.0 dodała film jako ostatni slajd galerii; tam też odtwarzacz ładuje się dopiero po kliknięciu, a autoodtwarzanie nie działa. Żeby sprawdzić swój sklep, odrzuć zgody, otwórz w DevTools zakładkę Network i przeładuj kartę produktu. Jeśli przed jakimkolwiek kliknięciem widzisz zapytania do youtube.com, ytimg.com albo domen Vimeo, osadzenie potrzebuje plakatu, który wczytuje odtwarzacz dopiero po kliknięciu.
Tryb zgody Google v2: co wysyła wersja podstawowa, a co zaawansowana
Jeśli po odmowie widzisz zapytania do Google Analytics, sprawdź najpierw, który tryb masz włączony. Opis trybu zgody Google rozróżnia dwa warianty:
- Podstawowy: tagi Google są zablokowane do interakcji z banerem. Według Google przed zgodą nie wychodzą żadne dane, nawet domyślny stan zgody.
- Zaawansowany: tagi ładują się od razu z domyślną odmową. Dopóki zgody nie ma, wysyłają stan zgody i pomiary bez plików cookie. Przy odmowie
analytics_storageGoogle Analytics nie czyta ani nie zapisuje swoich cookies, ale pomiary nadal trafiają do domen Google Analytics “na potrzeby podstawowego pomiaru i modelowania”. Przy odmowiead_storagezapytania idą przez inną domenę, żeby nie przesyłać wcześniej ustawionych ciasteczek reklamowych.
Tryb zaawansowany wysyła więc zapytania do Google po odmowie celowo. Czy to w porządku na twojej stronie, to właśnie pytanie o art. 399 PKE i art. 5 ust. 3, które rozstrzygasz z doradcą, a nie tagiem. W trybie podstawowym “Odrzuć” oznacza brak zapytań do Google.
Dwa błędy konfiguracji z instrukcji wdrożenia Google dają realne wycieki w obu trybach. Polecenie z domyślnym stanem zgody musi wykonać się przed config i event, inaczej tagi startują bez żadnego stanu. Jeśli baner ładuje się asynchronicznie, Google zaleca wait_for_update, żeby tagi poczekały na aktualizację z banera.
Shopify: Customer Privacy API i piksele aplikacji
Dokumentacja pikseli Shopify mówi, że rozszerzenia pikseli aplikacji respektują Customer Privacy API, a w regionach wymagających zgody uruchamiają się dopiero po jej udzieleniu. Dlatego piksele aplikacji zachowują się dobrze. Kod w motywie nie dostaje tej ochrony.
Dla wszystkiego, co siedzi w motywie, użyj Customer Privacy API. Daje metody analyticsProcessingAllowed(), marketingAllowed() i preferencesProcessingAllowed() oraz zdarzenie visitorConsentCollected przy zmianie wyboru. Shopify zaznacza, że stan domyślny zależy od ustawień prywatności sklepu: w regionach ustawionych na wymóg zgody cele nieniezbędne są wyłączone do czasu zgody, w pozostałych wszystko jest dozwolone. Zacznij od tych ustawień, bo region zostawiony na domyślnym “zezwalaj” wygląda jak zepsuty baner.
Autor wątku pokazał wzorzec, który ładuje skrypt dostawcy tylko wtedy, gdy analyticsProcessingAllowed() zwraca true, przy wczytaniu i ponownie po visitorConsentCollected. Zauważył, że dokumentacja podaje wersję API 0.2, a w sprawdzanych przez niego motywach baner wczytał już 0.1. To jego obserwacja; aktualna dokumentacja pokazuje 0.2.
WooCommerce i WordPress: gdzie szukać kodu poza banerem
Tu nie ma piaskownicy na poziomie platformy, więc blokada jest po twojej stronie. Wtyczka zgód blokuje tylko skrypty, o których wie. W październiku 2026 na r/woocommerce ktoś pytał o wybór wtyczki zgód, a rozmowa szybko zeszła na testowanie. Jedna z odpowiedzi wskazała dwie luki, których nie widać przy konfiguracji przez GTM:
Consent Mode rozmawia tylko z tagami Google. Twój piksel Meta nie czyta tych sygnałów. […] Nie każdy piksel siedzi w GTM. Wtyczki WooCommerce (Meta for WooCommerce, Google for WooCommerce i podobne) często wstawiają własny piksel prosto do strony. Podgląd GTM w ogóle ich nie pokaże.
(u/Bignose_boy, r/woocommerce, 12 października 2026, tłumaczenie własne)
Ten sam komentujący radzi: jeśli po akceptacji widzisz dwa zapytania do fbevents.js, piksel ładuje się dwa razy, raz z GTM i raz z wtyczki. Jeśli odmowa opróżnia koszyk, ciasteczko sesji koszyka trafiło do kategorii opcjonalnych, a powinno być wśród niezbędnych. Sprawdź trzy miejsca w kodzie: pola wstawiania kodu w nagłówku i stopce (motyw albo wtyczka do fragmentów kodu), wtyczki, które drukują własne tagi (opinie, czat, marketing), i osadzenia zapisane w treści wpisów. W headless to samo dotyczy głównego layoutu i komponentu analityki. Mój poradnik dodawania Google Analytics 4 opisuje podłączenie tagów Google przez zgodę, a tekst o ograniczaniu skryptów zewnętrznych pokazuje, jak sprawdzić, co ładuje każdy skrypt.
Aktualizacja, . Wtyczka zgód to też kod, który działa na każdej podstronie, więc wymaga aktualizacji i monitorowania jak każda inna. Tygodniowy raport podatności Wordfence za 12-18 października 2026 wymienia cztery takie wtyczki. W Complianz do wersji 7.5.5 niezalogowany odwiedzający mógł zostawić w treści komentarza trwały skrypt (stored XSS), który uruchamia się dopiero po zatwierdzeniu komentarza; poprawka jest w 7.5.6. WPConsent do 1.1.9 miał podobną lukę przez komentarze przy włączonej funkcji Script Blocking (poprawka w 1.2.0). Record of Consent Extension for Complianz do 2.5 zapisywał wstrzyknięty skrypt przez parametr uid (poprawka w 2.6), a Lightweight Cookie Notice do 1.19 miał na sztywno wpisany publicznie znany klucz bezpieczeństwa W3 Total Cache, co ma znaczenie, jeśli na stronie działa też W3 Total Cache (poprawka w 1.20). Wtyczkę zgód aktualizuj w tym samym rytmie i z tymi samymi alertami o podatnościach co resztę instalacji. Sprawdzam to w ramach audytu bezpieczeństwa WordPressa.
Jak znaleźć skrypt albo wtyczkę, która wysłała zapytanie
Dokumentacja panelu Network w Chrome opisuje cztery funkcje, które z prostego testu robią diagnozę:
- More filters > 3rd-party requests ukrywa wszystko, co pochodzi z twojej domeny. Po odmowie zostają tylko zapytania, które trzeba wyjaśnić.
- Filtr
domain:przyjmuje gwiazdkę, na przykładdomain:*.google.com, a kilka właściwości łączysz spacją.cookie-domain:icookie-name:pokazują, która odpowiedź ustawiła dane ciasteczko. - Kolumna Initiator mówi, czy zapytanie wysłał parser HTML, przekierowanie czy skrypt. Przy skrypcie podaje link do konkretnej linii w pliku źródłowym. Po tej linii poznasz, czy winny jest motyw, paczka wtyczki, kontener menedżera tagów czy wklejony fragment kodu.
- Network request blocking w dolnym panelu blokuje wzorzec adresu. Zablokuj podejrzaną domenę, przeładuj stronę i sprawdź, czy coś się nie psuje, zanim usuniesz ją na dobre.
Jako dowód z testu zapisz Export HAR (sanitized). Domyślny eksport HAR w Chrome pomija dane wrażliwe, takie jak ciasteczka, więc plik możesz dołączyć do zgłoszenia albo wysłać programiście. Zrób eksport raz po odmowie i raz po akceptacji, a pliki opisz datą.
Ustawienia zgody w Google Tag Manager: co sprawdzić w każdym tagu
Pomoc Google Tag Manager o zgodach opisuje trzy funkcje, które odpowiadają na większość pytań “dlaczego ten tag się uruchomił”:
- Reguła Consent Initialization - All Pages. Ma ją każdy kontener. Uruchamia się przed wszystkimi innymi regułami, także przed Initialization, i służy tylko tagom, które ustawiają albo aktualizują zgodę, na przykład szablonowi banera. Jeśli baner startuje na późniejszej regule, inne tagi zdążą się uruchomić bez żadnego stanu zgody.
- Additional Consent Checks w każdym tagu (Advanced Settings > Consent Settings). Domyślne “Not set” oznacza brak dodatkowego sprawdzenia. Opcja “Require additional consent for tag to fire” sprawia, że tag ruszy tylko wtedy, gdy każdy wymieniony rodzaj zgody ma status granted. Tag bez wbudowanych mechanizmów zgody, na przykład piksel Meta wklejony jako Custom HTML, uruchomi się niezależnie od wyboru, dopóki to ustawienie go nie zatrzyma.
- Consent Overview. Włączasz go w Admin > Container Settings. Dzieli tagi na “Consent Not Configured” i “Consent Configured” i pozwala edytować kilka naraz. Każdy tag marketingowy w pierwszej grupie to kandydat na wyciek.
Wynik sprawdź w Tag Assistant. Przewodnik Google po debugowaniu zgody każe wybrać w podsumowaniu najwcześniejsze zdarzenie Consent i sprawdzić, czy ustawiono ad_storage, ad_user_data, ad_personalization i analytics_storage, a potem porównać kolumny On-page Default i On-page Update w zakładce Consent. Jako typowy błąd przewodnik podaje zbyt późne ustawienie stanu domyślnego: strona się otwiera, tag reklamowy rusza i dopiero wtedy pojawia się domyślna odmowa. Google ostrzega też przed wywoływaniem polecenia zgody gtag z tagu Custom HTML.
WP Consent API, Next.js i Cloudflare Zaraz: co faktycznie blokują
- WordPress i WooCommerce: WP Consent API to wtyczka, która ujednolica komunikację o kategoriach zgody między wtyczką banera a wtyczkami, które ustawiają ciasteczka. Sama zgód nie obsługuje. Opis wtyczki mówi wprost: jeśli żadna wtyczka zgód nie ustawi typu zgody, funkcja zwraca false i wszystkie kategorie dostają wartość true, czyli ciasteczka mogą się ustawić. API obsługuje też zgodę na poziomie usługi, na przykład
wp_has_service_consent( 'google-analytics' ). Autor zaznacza, że osadzony iframe z zewnętrznego serwisu i tak trzeba zablokować narzędziem w wtyczce zgód. - Next.js: według dokumentacji
@next/third-partieskomponentGoogleTagManagerpobiera kontener po hydratacji, aYouTubeEmbedkorzysta z lite-youtube-embed. Żaden z nich nie sprawdza zgody. Opis lite-youtube-embed podaje, że odtwarzacz używa youtube-nocookie.com, a domyślna miniatura ładuje się z i.ytimg.com, czyli z domeny Google, zanim ktokolwiek kliknie. W ścisłej konfiguracji podaj własną miniaturę. - Cloudflare Zaraz: dokumentacja zarządzania zgodą w Zaraz mówi, że nowo dodane narzędzie nie ma przypisanego celu i domyślnie pomija zgodę. Każde narzędzie przypisz do celu, inaczej załaduje się wszystkim.
zaraz.showConsentModal()ponownie otwiera okno zgód i nadaje się pod link “ustawienia prywatności”.
Tabela problemów: objaw, przyczyna, gdzie szukać
| Co widzisz po odmowie | Prawdopodobna przyczyna | Gdzie szukać |
|---|---|---|
| Zapytania do Google Analytics, brak ciasteczka _ga | Zaawansowany tryb zgody działa zgodnie z założeniem | Wybór trybu, nie konfiguracja tagu |
| Pojawiają się ciasteczka _ga albo _gcl | Brak stanu domyślnego albo ustawiony po tagach | Tag Assistant, najwcześniejsze zdarzenie Consent |
| Rusza piksel Meta lub TikTok | Tag spoza Google z ustawieniem “Not set” albo piksel z wtyczki poza GTM | Consent Overview w GTM, kolumna Initiator |
| Wyciek tylko na karcie produktu lub we wpisach | Osadzenie albo widżet w tym szablonie | Test na każdym szablonie osobno |
| Wyciek tylko dla części krajów | Domyślne ustawienia regionalne albo ustawienia regionów w Shopify pomijają kraj | Symulowana lokalizacja w Chrome, ustawienia prywatności sklepu |
| Po wycofaniu zgody skrypty dalej działają | Baner zapisuje nowy wybór, ale nie wysyła aktualizacji | Zdarzenie aktualizacji zgody w Tag Assistant po zmianie wyboru |
Jak naprawić każdy wyciek
- Filmy i mapy: zamień iframe na zaślepkę ładowaną kliknięciem, czyli przycisk albo miniaturę, która tworzy iframe dopiero po kliknięciu lub po zgodzie. Miniaturę serwuj z własnego serwera, inaczej sama jest zapytaniem do obcej domeny.
- Fonty: pobierz pliki, serwuj je z własnej domeny przez
@font-facei usuń każde odwołanie do fonts.googleapis.com. - Czat: pokaż lokalny przycisk “Napisz do nas” i ładuj skrypt dostawcy po kliknięciu albo po zgodzie.
- Piksele w motywie: przenieś je do menedżera tagów albo systemu pikseli platformy, żeby objęło je sprawdzenie zgody.
- Menedżer tagów: ustaw wymagania zgody dla każdego tagu, uruchom polecenie domyślne jako pierwsze i testuj w podglądzie przy odmowie.
Potem powtórz test w narzędziach deweloperskich. Jeśli po odmowie lista zapytań pokazuje tylko twoją domenę i to, na co świadomie się zgodziłeś, baner mówi prawdę.
Jakie projekty banerów organy nadzoru już zakwestionowały
Raport grupy zadaniowej EROD ds. banerów cookies, przyjęty 17 stycznia 2023, zbiera praktyki omawiane przez krajowe organy przy skoordynowanych skargach. Większość sprawdzisz w tej samej sesji co test sieci:
- Brak przycisku odmowy na pierwszej warstwie. Zdecydowana większość organów uznała baner z przyciskiem akceptacji, ale bez opcji odmowy na tej samej warstwie, za naruszenie.
- Pola zaznaczone z góry na drugiej warstwie. Grupa potwierdziła, że nie dają ważnej zgody.
- Link zamiast przycisku do odmowy oraz kolory i kontrast, które wypychają “akceptuj wszystko”. Kontrast raport każe oceniać indywidualnie, bez sztywnego standardu.
- Ciasteczka oznaczone jako niezbędne, które takie nie są. Raport przypomina, że to właściciel strony odpowiada za aktualną listę ciasteczek i za wykazanie, dlaczego każde z nich jest niezbędne.
- Brak łatwego wycofania zgody. Organy oczekują stale widocznego linku albo małej ikony, która otwiera ustawienia prywatności. W Shopify
privacyBanner.showPreferences()z Customer Privacy API otwiera okno preferencji.
Jeśli chcesz, żeby ktoś to sprawdził za ciebie, mój audyt zgodności WooCommerce z wymogami UE obejmuje test zgody na każdym szablonie, a bezpłatne sprawdzenie strony pokazuje zapytania do zewnętrznych domen dla publicznego adresu.






