LW IT Solutions
« Blog Overview /Digital Marketing/Tutorials / Tutorial: Doppelt kodierte UTM-Parameter und wo sie...
This post in other languages:

Tutorial: Doppelt kodierte UTM-Parameter und wo sie zu beheben sind

Tutorial: Doppelt kodierte UTM-Parameter und wo sie zu beheben sind
Inhalt
  1. Was Prozentkodierung tut und was zweimal geschieht
  2. Die drei Stellen, an denen ein zweiter Durchgang entsteht
  3. Die Fälle im Bericht unterscheiden
  4. Bestandteile kodieren, nicht Adressen
  5. Das Leerzeichen, das manchmal ein Plus ist
  6. Den Bestand reparieren
  7. Quellen

Eine Kampagne namens Sommer Aktion taucht im Bericht als Sommer%20Aktion auf. Kaputt ist nichts – der Verkehr kam an, die Sitzungen sind gezählt, die Abschlüsse zugeordnet. Nur der Name stimmt nicht, und jeder Filter, jeder Vergleich und jeder Export erbt ihn.

Die Ursache ist immer dieselbe: Der Wert wurde zweimal kodiert. Verschieden ist, wo der zweite Durchgang geschah – und der Bericht selbst sagt, wie viele es waren.

Ein Kampagnenname über drei Kodierstufen, je Stufe der Wert in der Adresse und der Wert im Bericht nebeneinander
Jeder weitere Durchgang macht aus dem Prozentzeichen des vorigen ein %25. Sie im Bericht zu zählen ergibt die Zahl der Kodierungen.

Was Prozentkodierung tut und was zweimal geschieht

Eine Adresse darf nur einen begrenzten Zeichenvorrat enthalten. Alles andere wird als Prozentzeichen mit dem Hexadezimalwert seiner Bytes geschrieben – aus einem Leerzeichen wird %20, aus einem Kaufmannsund %26, aus einem ü wird %C3%BC, weil es in UTF-8 zwei Bytes hat.

Das Prozentzeichen selbst gehört zu den Zeichen, die kodiert werden müssen – und das ist der ganze Mechanismus hinter dem Problem. Eine bereits kodierte Zeichenkette erneut zu kodieren macht aus jedem % ein %25.

Sommer Aktion          der Wert, wie geschrieben
Sommer%20Aktion        einmal kodiert   - in einer Adresse richtig
Sommer%2520Aktion      zweimal kodiert  - das %20 wurde erneut kodiert
Sommer%252520Aktion    dreimal kodiert

In die andere Richtung gelesen ist es ebenso mechanisch. Ein Dekodierer macht aus %2520 wieder %20, und das ist ein buchstäbliches Prozent-Zwei-Null und kein Leerzeichen – der Wert kommt also als Text mit einem Prozentzeichen darin an, und genau das zeigt der Bericht.

Die drei Stellen, an denen ein zweiter Durchgang entsteht

Eine Adresse entsteht selten in einem Schritt, und jeder weitere Schritt ist ein Kandidat.

Die erste ist der Linkbauer selbst. Ein Werkzeug, das eine fertig zusammengesetzte Adresse nimmt und das Ganze kodiert, erzeugt genau das. Erkennbar ist es daran, dass auch die Kaufmannsunds zwischen den Parametern betroffen sind: Eine Adresse mit %26utm_source%3D wurde als Ganzes kodiert statt je Bestandteil – und funktioniert als Verweis nicht einmal mehr.

Die zweite ist eine Klickmessung. Ein Mailwerkzeug oder eine Werbeplattform, die das Ziel als Parameter der eigenen Adresse einpackt, muss es einmal kodieren – richtigerweise. War das Ziel bereits kodiert, ist die Kodierung der Verpackung der zweite Durchgang, und das Ergebnis erreicht die Seite unversehrt, aber mit verdoppelten Werten.

https://klick.beispiel/r?u=https%3A%2F%2Fshop.example%2F%3Futm_campaign%3DSommer%2520Aktion
                            └─ richtige Kodierung des Ziels ─┘  └ schon kodiert ┘

Die dritte ist ein Redaktionssystem. Ein Feld, das eine Adresse speichert und beim Speichern maskiert, dann bei der Ausgabe erneut maskiert, erzeugt dasselbe Ergebnis – und das ist der eine Fall, an dem nichts im Marketingwerkzeug schuld ist, weshalb er am längsten braucht, bis er auffällt.

Die Fälle im Bericht unterscheiden

Die Zahl der Durchgänge lässt sich am Wert ablesen, und sie zeigt jedes Mal auf einen anderen Verursacher.

Im Bericht Durchgänge Wo zu suchen ist
Sommer Aktion 1 Richtig – nichts zu tun
Sommer%20Aktion 2 Linkbauer oder Klickmessung
Sommer%2520Aktion 3 Zwei Verpackungen hintereinander
Sommer+Aktion 1 Eine andere Konvention, siehe unten
Sommer%C3%A4Aktion 2 Dasselbe Problem, Zeichen ausserhalb von ASCII

Am schnellsten sichtbar wird das alles, indem die Kampagnendimension sortiert und nach einem Prozentzeichen durchsucht wird. Ein einziger Filter auf % über Kampagne, Quelle, Medium, Begriff und Inhalt findet jeden betroffenen Wert in einem Durchgang, und die Zahl daneben sagt, wie viel Verkehr im falschen Topf landet.

Die letzte Zeile verdient eine Anmerkung. Ein einmal kodiertes ä ist %C3%A4, und das ist richtig – der Bericht sollte den Buchstaben zeigen. Die Fluchtfolge im Bericht zu sehen bedeutet, dass zweimal kodiert wurde, genau wie beim Leerzeichen.

Bestandteile kodieren, nicht Adressen

Die Regel, die das alles verhindert, ist ein Satz: jeden Wert für sich kodieren und danach zusammensetzen. Niemals eine Adresse kodieren, in der bereits Parameter stehen.

const ziel   = "https://shop.example/sommer";
const felder = {
  utm_source:   "newsletter",
  utm_medium:   "email",
  utm_campaign: "Sommer Aktion",
  utm_content:  "kopfbild & titel"
};

const url = ziel + "?" + Object.entries(felder)
  .map(([k, v]) => encodeURIComponent(k) + "=" + encodeURIComponent(v))
  .join("&");

// https://shop.example/sommer?utm_source=newsletter&utm_medium=email
//   &utm_campaign=Sommer%20Aktion&utm_content=kopfbild%20%26%20titel

Der Unterschied zwischen den beiden verfügbaren Funktionen zählt hier. encodeURIComponent kodiert alles, was nicht unreserviert ist, einschliesslich &, = und ?, und gehört auf einzelne Werte. encodeURI lässt genau diese Zeichen in Ruhe, weil sie eine strukturelle Bedeutung tragen, und gehört auf eine ganze, noch unkodierte Adresse. Die zweite Funktion auf einen Wert anzuwenden ist der Weg, auf dem ein Kaufmannsund in einem Kampagnennamen diesen in zwei Parameter zerlegt.

Eine einfache Gewohnheit schliesst die verbleibende Lücke: die endgültige Adresse einmal bauen und diese Zeichenkette überall einsetzen. Eine Adresse, die in einem zweiten Werkzeug erneut zusammengesetzt wird, ist eine Adresse, die erneut kodiert wird.

Das Leerzeichen, das manchmal ein Plus ist

Für ein Leerzeichen in einer Abfragezeichenfolge gibt es zwei Konventionen, und beide sind in Gebrauch.

Die Prozentkodierung schreibt %20. Die Formularkodierung, das Format eines Browsers beim Absenden eines Formulars per GET, schreibt +. Beides kommt in Adressen vor, und der Unterschied liegt darin, dass einem Dekodierer gesagt werden muss, was er vor sich hat: Ein allgemeiner Adressdekodierer lässt das Plus ein Plus, ein Formulardekodierer macht ein Leerzeichen daraus.

Die praktische Folge: Ein Kampagnenname mit einem Pluszeichen lässt sich nicht von einem mit einem Leerzeichen unterscheiden, und welches von beiden ein bestimmtes Werkzeug meldet, ist eine Eigenschaft dieses Werkzeugs. Zwei Systeme können deshalb über dieselbe Kampagne verschiedener Meinung sein, ohne dass eines von beiden unrecht hätte.

Der Ausweg besteht darin, die Mehrdeutigkeit zu vermeiden statt sie aufzulösen. Kampagnenwerte ohne Leerzeichen – sommer-aktion statt Sommer Aktion – sind von der ganzen Frage nicht betroffen, und sie überstehen ausserdem eine Kleinschreibung, die manche Plattformen ungefragt vornehmen. Eine Namenskonvention mit Bindestrichen und Kleinbuchstaben beseitigt eine ganze Klasse von Berichtsrauschen zum Preis eines etwas weniger hübschen Anblicks in einer Tabelle.

Den Bestand reparieren

Den Verweis zu berichtigen stoppt neuen Schaden. Die erfassten Sitzungen behalten ihre Werte, und dafür gibt es drei Wege, nach Dauerhaftigkeit geordnet.

Im Bericht lassen sich zwei Werte, die sich nur in der Kodierung unterscheiden, von Hand zusammenführen – ein Vergleich, ein Segment oder eine Gruppierung in einer Tabelle. Das ist der ehrliche Weg für eine beendete Kampagne: Es wird nichts verändert, der Unterschied wird bloss verrechnet.

Für eine laufende Kampagne ist eine Regel bei der Erfassung besser. GA4 kann einen eingehenden Parameter vor dem Speichern umschreiben, und dasselbe ist einen Schritt früher in einem Tag möglich – den Wert einmal dekodieren und zurückschreiben.

function () {
  var wert = {{URL - utm_campaign}};
  if (!wert) { return undefined; }
  // einmal zusaetzlich dekodieren, wenn ein %25 uebrig ist
  while (/%25/.test(wert)) {
    try { wert = decodeURIComponent(wert); } catch (e) { break; }
  }
  return wert;
}

Das try um die Dekodierung ist keine Zierde. Ein Wert mit einem einzelnen Prozentzeichen, das keine gültige Fluchtfolge bildet, lässt decodeURIComponent eine Ausnahme werfen, und ohne die Absicherung liefert die Variable gar nichts – aus einem kosmetischen Problem wird damit eine fehlende Kampagne.

Und in BigQuery lassen sich die historischen Zeilen in der Abfrage berichtigen statt in den Daten, was den Rohexport unangetastet lässt und umkehrbar bleibt.

SELECT
  REPLACE(REPLACE(kampagne, '%2520', ' '), '%20', ' ') AS kampagne_sauber,
  COUNT(*) AS sitzungen
FROM `projekt.dataset.sitzungen`
GROUP BY kampagne_sauber
ORDER BY sitzungen DESC;

Welcher der drei Wege richtig ist, hängt an einer Frage: ob die Zahlen in einen Bericht gehen, nach dem jemand handelt, oder in ein Archiv. Für das Erste bei der Erfassung berichtigen. Für das Zweite genügt die Berichtigung in der Abfrage – und sie lässt den Beleg dessen stehen, was tatsächlich ankam.

Lukas Wojcik

Lukas Wojcik

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.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

Kommentar schreiben

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.

ALL ARTICLES & CATEGORIES

CCTV

Diese Rubrik per RSS verfolgen

Cloud & AI

Diese Rubrik per RSS verfolgen

Data Privacy

Alle 13 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Digital Analytics

Alle 51 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Digital Marketing

Alle 31 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

IT & Networks

Alle 18 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Music Production

Diese Rubrik per RSS verfolgen

Raspberry Pi

Diese Rubrik per RSS verfolgen

Smart Home

Alle 19 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Web Entwicklung

Diese Rubrik per RSS verfolgen

WordPress-Plugins & Tricks

Diese Rubrik per RSS verfolgen