LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Digital Analytics/Tutorials / Tutorial: Znajdowanie nieużywanych tagów, reguł i zmiennych...
Ten artykuł w innych językach:

Tutorial: Znajdowanie nieużywanych tagów, reguł i zmiennych w eksporcie kontenera GTM

Tutorial: Znajdowanie nieużywanych tagów, reguł i zmiennych w eksporcie kontenera GTMTutorial: Znajdowanie nieużywanych tagów, reguł i zmiennych w eksporcie kontenera GTM

Management Summary

Google Tag Manager to narzędzie, w którym firmy zarządzają kodami pomiarowymi i reklamowymi swojej strony w jednym miejscu, nazywanym kontenerem. Z biegiem lat zbierają się w nim elementy, które nic już nie robią. W 402 kontenerach dostępnych publicznie w internecie mniej więcej co czwarty element był zbędny. Interfejs nie pokazuje na pierwszy rzut oka, co można bezpiecznie usunąć; plik eksportu kontenera zawiera natomiast wszystkie powiązania. Sprawdzenie tego pliku daje listę do usunięcia i sprawia, że kontener jest bardziej przejrzysty i łatwiejszy w utrzymaniu.

Spis treści
  1. Co w kontenerze znaczy „nieużywany”
  2. Co eksport pokazuje, a czego nie zawiera
  3. Pomiar na 402 publicznych kontenerach
  4. Dlaczego jedno przejście nie wystarcza
  5. Przepisy przynoszą własne luki
  6. Usuwanie we właściwej kolejności
  7. Ograniczenia
  8. Pytania i odpowiedzi
  9. Źródła

Kontener Tag Managera łatwo rozbudować, a trudno odchudzić. Dodanie tagu zajmuje minutę. Usunięcie wymaga najpierw sprawdzenia, czy coś jeszcze od niego zależy, a interfejs nie ma widoku, który odpowiada na to pytanie dla całego kontenera.

Eksport ma. To jeden plik JSON z każdym tagiem, regułą, zmienną, szablonem i folderem, a każde odwołanie między nimi jest w nim zapisane. Odczytany we właściwy sposób zamienia się w listę tego, co można usunąć. Zastosowana do 402 eksportów kontenerów dostępnych publicznie na GitHubie, lista objęła 3537 z 13 677 elementów: mniej więcej jedną czwartą, w większości zmienne wbudowane.

Udział kandydatów do usunięcia według rodzaju elementu w 402 publicznych kontenerach GTM, od 3,2 procent tagów do 74,3 procent włączonych zmiennych wbudowanych, a obok liczba kontenerów, które potrzebowały od jednego do trzech przejść, gdy za każdym razem usuwano tylko elementy bez bezpośrednich odwołań
Po lewej: co można usunąć w każdym rodzaju elementu. Po prawej: usuwanie tylko tego, do czego nic się bezpośrednio nie odwołuje, wymaga do trzech przejść.

Co w kontenerze znaczy „nieużywany”

Element, który nic nie robi, powstaje w trzech sytuacjach. Warto je rozróżniać, bo każdą znajduje się inną drogą.

Pierwsza to tag, który nie może się uruchomić. Nie ma reguły uruchamiającej, jego jedyna reguła już nie istnieje albo jest wstrzymany. Wstrzymany tag jest tak oznaczony w interfejsie. Tag bez reguły nie jest oznaczony wcale i na liście wygląda na tak samo aktywny jak każdy inny.

Druga to element, do którego nic się nie odwołuje. Reguła jest w użyciu, gdy tag się na niej uruchamia lub jest przez nią blokowany albo gdy zawiera ją grupa reguł lub strefa. Zmienna jest w użyciu, gdy jej nazwa w podwójnych nawiasach klamrowych, {{Nazwa}}, występuje w tagu, regule, innej zmiennej lub strefie. Szablon jest w użyciu, gdy powstał z niego tag lub zmienna.

Trzecią łatwo przeoczyć: element, do którego ktoś się odwołuje, ale tylko coś z dwóch pierwszych grup. Reguła używana tylko przez wstrzymany tag, zmienna odczytywana tylko przez tę regułę. Żaden z nich nie wygląda na błędny, a oba przestają być potrzebne w chwili, gdy znika wstrzymany tag. Do ich znalezienia potrzebne jest inne pytanie: nie czy coś odwołuje się do elementu, lecz czy da się do niego dojść od tagu, który naprawdę się uruchamia.

Co eksport pokazuje, a czego nie zawiera

Cztery właściwości pliku decydują o tym, czy kontrola daje użyteczną listę, czy listę fałszywych alarmów.

Wbudowanych reguł w nim nie ma. „All Pages”, „Consent Initialization – All Pages” i „Initialization – All Pages” nie mają wpisu na liście reguł. Tagi odwołują się do nich przez stałe identyfikatory: 2147479553, 2147479572 i 2147479573 w kontenerach internetowych oraz 2147479574 w kontenerach serwerowych. W publicznym zbiorze tagi w 153 kontenerach uruchamiają się na „All Pages”, w 83 na „Initialization”, a w 14 na „Consent Initialization”. Kontrola, która szuka identyfikatorów tylko na liście reguł, zgłasza każdy z tych tagów jako odwołanie do usuniętej reguły. Narzędzie zna te identyfikatory: nie pokazuje wbudowanych reguł ani jako brakujących, ani na liście do usunięcia, a tagi uruchamiane przez nie traktuje jako aktywne.

Szablony z galerii mają własne nazwy typów. Szablon napisany w kontenerze nadaje zbudowanym z niego tagom typ cvt_<ID kontenera>_<ID szablonu>. Szablon dodany z Community Template Gallery pojawia się jako cvt_<ID z galerii>, krótki kod pasujący tylko do pola galleryReference.galleryTemplateId we wpisie szablonu. 35 z 96 publicznych kontenerów z szablonami korzystało z co najmniej jednego z galerii.

Nie każda para nawiasów to zmienna. {{_event}} w regułach zdarzeń niestandardowych oznacza wbudowaną zmienną zdarzenia i nie wymaga własnej zmiennej. Tekst w polu notatek nie jest odwołaniem, nawet jeśli zawiera nazwę w nawiasach.

Eksport częściowy jest z założenia niepełny. Tag Manager potrafi wyeksportować wybrane elementy. Według strony pomocy Google odwołania do brakujących tagów i reguł są wtedy usuwane, a odwołania do zmiennych zostają. Taki plik pokazuje tagi bez reguł i pozornie brakujące zmienne, choć dla kontenera żadne z nich nie jest prawdą. Narzędzie oznacza plik jako prawdopodobny eksport częściowy, gdy brakuje wielu używanych zmiennych.

Przypadki bezpośrednie mieszczą się w krótkim skrypcie. Czyta on każdy tag, regułę, zmienną i strefę, zbiera używane identyfikatory reguł i nazwy zmiennych, a następnie wypisuje reguły i zmienne, które nigdzie nie występują.

PythonPython: reguły i zmienne, do których nic się nie odwołuje
import json, re, sys

cv = json.load(open(sys.argv[1], encoding="utf-8"))["containerVersion"]
trigger_ids, variablen = set(), set()

def lesen(x):
    if isinstance(x, str):
        variablen.update(re.findall(r"\{\{([^{}]+)\}\}", x))
    elif isinstance(x, list):
        for y in x:
            lesen(y)
    elif isinstance(x, dict):
        if x.get("type") == "TRIGGER_REFERENCE":
            trigger_ids.add(x.get("value"))
        for k, v in x.items():
            if k in ("firingTriggerId", "blockingTriggerId"):
                trigger_ids.update(v)
            elif k not in ("name", "notes"):
                lesen(v)

for art in ("tag", "trigger", "variable", "zone"):
    for element in cv.get(art, []):
        lesen(element)

for t in cv.get("trigger", []):
    if t["triggerId"] not in trigger_ids:
        print("Trigger ", t["name"])
for v in cv.get("variable", []):
    if v["name"] not in variablen:
        print("Variable", v["name"])

Trzeciej grupy nie obejmuje, bo odwołanie z wstrzymanego tagu liczy jako użycie, a zmienne wbudowane i foldery pomija. Dla trzeciej grupy pytanie trzeba odwrócić: zacząć od każdego tagu, który się uruchamia, przejść po jego regułach i zmiennych, oznaczyć wszystko, do czego da się dojść, a resztę traktować jako kandydatów. Narzędzie Porządkowanie kontenera GTM wykonuje oba kroki w przeglądarce i zwraca listę dla każdego rodzaju elementu, z powodem przy każdej pozycji.

Pomiar na 402 publicznych kontenerach

Dane: wyszukiwanie kodu na GitHubie według pola eksportu exportFormatVersion zwróciło 4 listopada 2026 roku 644 publiczne pliki. 637 z nich dało się odczytać jako kontenery. Eksporty o tym samym identyfikatorze kontenera liczyły się raz, co dało 455. Wykluczono jeden eksport częściowy i 52 pliki, w których tagi, reguły lub zmienne w ogóle nie miały identyfikatora, czego eksport z Tag Managera nigdy nie tworzy. Zostały 402 kontenery wyeksportowane w latach 2015–2026, w tym 35 serwerowych. Rozmiar wynosił od pustego eksportu do 252 elementów, mediana 26; 87 kontenerów miało 50 elementów lub więcej.

ElementW kontenerachKandydaci do usunięciaUdział
Tagi2915923,2%
Reguły251829111,6%
Zmienne5103124024,3%
Zmienne wbudowane (włączone)2496185474,3%
Własne szablony2094521,5%
Foldery373154,0%
Razem13 677353725,9%

W pojedynczym kontenerze mediana udziału wyniosła 18,4 procent; jedna czwarta kontenerów miała 37,5 procent lub więcej, a 81 nie miało nic do usunięcia. Wśród 87 większych kontenerów mediana wyniosła 20 procent.

Listę zdominowały zmienne wbudowane: trzy czwarte włączonych nie są nigdzie odczytywane. W czasie działania nic nie kosztują, ale wydłużają listę zmiennych i dane w podglądzie. Bez nich zostaje 1683 z 11 181 elementów, 15,1 procent. Dalej są nieużywane zmienne, mniej więcej co czwarta. Tagi rzadko są w tym zbiorze problemem: 62 wstrzymane tagi w 18 kontenerach i 30 tagów bez działającej reguły w 18.

Publiczny zbiór ma własny charakter. Wiele z tych plików to szablony, wersje demonstracyjne, materiały szkoleniowe lub przepisy do jednego celu, i są one bardziej uporządkowane niż kontener, który zespół rozbudowuje latami. Proporcje pokazują, gdzie gromadzą się nieużywane elementy; wartości bezwzględne opisują te pliki, a nie typowy kontener produkcyjny.

Dlaczego jedno przejście nie wystarcza

Usunięcie tego, do czego nic się bezpośrednio nie odwołuje, i ponowna kontrola to oczywista droga. Działa, ale wymaga kilku rund. W symulacji na 402 kontenerach pierwsze przejście objęło 3337 z 3537 kandydatów, czyli 94 procent. 63 kontenery wymagały drugiego przejścia, a 10 trzeciego, bo każde usunięcie zwalnia to, czego używał tylko usunięty element: wstrzymany tag zwalnia przypisaną do niego regułę, reguła zmienną z warunku, ta zmienna tabelę przeglądową, którą odczytuje.

Do tej trzeciej grupy należało 200 elementów, przywoływanych tylko przez coś, co nigdy nie działa. Kontrola, która idzie po odwołaniach od aktywnych tagów, znajduje je w jednym przebiegu. Na liście narzędzia takie pozycje mają powód „używane tylko przez …” i wskazują element, który je jeszcze trzyma, a folder, który staje się pusty dopiero po usunięciu zawartości, też się na niej pojawia.

Przepisy przynoszą własne luki

Publiczne kontenery często są importowane jako punkt wyjścia i właśnie wtedy kontrola się opłaca. 55 z 402 zawierało odwołania donikąd: w 29 używano wbudowanej zmiennej, takiej jak {{Click URL}}, która nie była w pliku włączona, w 24 nie istniała nazwa zmiennej, w tym symbole zastępcze w rodzaju {{YOUR_GA_TRACKING_ID}}, w 6 brakowało identyfikatora reguły, a w 2 własnego szablonu. Tag Manager rozwiązuje brakującą zmienną do undefined, więc taki tag może się uruchomić i wysłać pustą wartość bez żadnego błędu.

Należy tu też 52 plików bez identyfikatorów. Wyglądają jak eksporty, ale zostały napisane ręcznie lub wygenerowane, a niektóre łączą tagi z regułami przez nazwę zamiast identyfikatora. Zanim taki plik zostanie zaimportowany, warto go przeczytać kontrolą, która zgłasza właśnie to.

Usuwanie we właściwej kolejności

  1. Pracować w osobnej przestrzeni roboczej i wyeksportować ją przed pierwszym usunięciem. Poprzednia wersja zachowuje każdy element i można ją przywrócić; eksport umożliwia porównanie.
  2. Usuwać w kolejności: tagi, reguły, zmienne, szablony, foldery. Każdy element znika wtedy przed tym, czego używa, i nic nie jest usuwane, dopóki inny element się do niego odwołuje.
  3. Nieużywane zmienne wbudowane odznaczyć w Zmienne → Konfiguruj; nie ma tam czego usuwać.
  4. Przetestować przestrzeń roboczą w trybie podglądu, zwłaszcza tagi z niestandardowym HTML, bo tam odwołania są zapisane jako tekst.
  5. Wyeksportować ponownie i porównać oba pliki, na przykład w Porównaniu tekstu i kodu. Każda różnica powinna być na liście.
  6. Opublikować porządki jako osobną wersję z opisem, co usunięto i dlaczego.

Wstrzymane tagi zasługują przed usunięciem na drugie spojrzenie. Niektóre są wstrzymane na sezon i mają wrócić. Zapisuje to wiersz w polu notatek, a następna kontrola pokaże tag ponownie, dopóki ktoś nie zdecyduje.

Górne piętro trzypiętrowego tortu jest już zdjęte, a dolne zostaje do końca. Tak samo elementy kontenera GTM usuwa się od góry do dołu, aby nic wcześniej nie straciło oparcia.
Górne piętro trzypiętrowego tortu jest już zdjęte, a dolne zostaje do końca. Tak samo elementy kontenera GTM usuwa się od góry do dołu, aby nic wcześniej nie straciło oparcia.

Ograniczenia

Kontrola eksportu widzi nazwy i identyfikatory, a nie zamiary. Nie rozpozna nazwy składanej w skrypcie z części, elementu, którego za chwilę zacznie używać inna przestrzeń robocza, ani tagu pozostawionego celowo. Kontenery serwerowe są odczytywane tak samo, a odwołania od klientów i transformacji liczą się jako aktywne. Pomiar obejmuje to, co jest publicznie dostępne na GitHubie: kontenery bardzo różnego pochodzenia i rozmiaru, ale nie reprezentatywną próbę wszystkich kontenerów Tag Managera.

Pytania i odpowiedzi

Dlaczego kontrola zgłasza tagi na „All Pages” jako odwołanie do brakującej reguły?

Ponieważ wbudowanych reguł nie ma w eksporcie. „All Pages”, „Consent Initialization – All Pages” i „Initialization – All Pages” nie mają wpisu na liście reguł; tagi odwołują się do nich przez stałe identyfikatory 2147479553, 2147479572 i 2147479573, a w kontenerach serwerowych przez 2147479574. Kontrola, która szuka identyfikatorów tylko na liście reguł, nie znajduje ich i zgłasza uszkodzone odwołanie, którego w kontenerze nie ma. Dlatego narzędzie w ogóle nie pokazuje tych wbudowanych reguł.

Ten sam rodzaj fałszywych alarmów wynika z dwóch innych właściwości pliku. Szablony z Community Template Gallery pojawiają się jako cvt_ z identyfikatorem z galerii zamiast identyfikatora kontenera i szablonu, a eksport częściowy usuwa odwołania do reguł, których nie wybrano. Zanim lista brakujących reguł zostanie przerobiona, warto sprawdzić, która z trzech przyczyn występuje.

Czy da się usunąć zmienną, której używa tylko wstrzymany tag?

Po tagu, nie przed nim. Dopóki wstrzymany tag zawiera {{Nazwa}}, odwołuje się do zmiennej. Gdy najpierw usuwane są tagi, potem reguły, a potem zmienne, taka zmienna zwalnia się w tym samym przejściu.

Czy kontener z GitHuba warto sprawdzić przed importem?

Tak. Spośród 402 publicznych kontenerów zmierzonych tutaj 55 zawierało odwołania donikąd, najczęściej do zmiennej lub zmiennej wbudowanej, której plik używa, ale jej nie zawiera. Kolejne 52 pliki w ogóle nie miały identyfikatorów, a więc nie były eksportami z Tag Managera. Kontrola przed importem pokazuje jedno i drugie, dopóki kontener jest jeszcze plikiem, a nie częścią przestrzeni roboczej.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA i formconfirmed do ochrony przed spamem.

Napisanie komentarza

Odmienne wyniki z innych kont i pytania o konfigurację są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.

LUKASWOJCIK.COM · NEWSLETTER

Nowe pomysły w skrzynce

Nowe artykuły, praktyczne narzędzia i informacje o projektach.

Wybierz tematy (opcjonalnie)
Bez wyboru: wszystkie tematy.

Zapis wymaga potwierdzenia e-mailem. · Prywatność

Prywatność · Newsletter

Adres e-mail, język, wybrane tematy oraz daty zapisu i potwierdzenia są przechowywane w celu wysyłki newslettera. Wymagane jest potwierdzenie zapisu. Każda wiadomość zawiera link do natychmiastowej rezygnacji. Formconfirmed chroni formularz przed spamem. Brak śledzenia otwarć i kliknięć.

Pełna polityka prywatności ↗