Tutorial: 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
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.
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ą.
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.
| Element | W kontenerach | Kandydaci do usunięcia | Udział |
|---|---|---|---|
| Tagi | 2915 | 92 | 3,2% |
| Reguły | 2518 | 291 | 11,6% |
| Zmienne | 5103 | 1240 | 24,3% |
| Zmienne wbudowane (włączone) | 2496 | 1854 | 74,3% |
| Własne szablony | 209 | 45 | 21,5% |
| Foldery | 373 | 15 | 4,0% |
| Razem | 13 677 | 3537 | 25,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
- 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.
- 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.
- Nieużywane zmienne wbudowane odznaczyć w Zmienne → Konfiguruj; nie ma tam czego usuwać.
- Przetestować przestrzeń roboczą w trybie podglądu, zwłaszcza tagi z niestandardowym HTML, bo tam odwołania są zapisane jako tekst.
- 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.
- 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.

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.


