Einstiegsseite wird doppelt getrackt

Bei jedem Besuch meiner Website wird die Einstiegsseite doppelt getrackt. Ich sehe auch, dass Matomo da zweimal getriggert wird.

Das Verhalten tritt auf jeder Seite auf, nicht nur auf der Startseite.
Woher kommt das und wie kann ich das abstellen?

Da wird dir wohl hier keiner helfen können bei deiner sehr speziellen Website. Scheinbar wäre es besser, wenn das Tracking nicht pauschal gestartet wird, sondern einzelne Funktionen Matomo triggern. Also zB die Funktion, bei der der Pagetitle (und wohl auch Pagecontent) geändert wird. Dort

_paq.push(['setDocumentTitle', document.title]);
_paq.push(['trackPageView']);

mit reinpacken. Aber ob das so funktioniert weiß ich nicht.

Edit: Vielleicht das Laden der matomo.js in ein if (document.readyState === "complete") { packen.

Mir war nicht klar, dass das so besonders ist, sogar in der Matomo Hilfe werden SPA als “a standard” bezeichnet: https://developer.matomo.org/guides/spa-tracking

Auf die einzelnen Funktionen des CMS habe ich keinen Zugriff (bzw. müsste Core-Files bearbeiten und das nach jedem Update wieder neu). Ich kann lediglich sehr unkompliziert eigenes JS ergänzen, deshalb war das im anderen Thread kein Problem.

Der Entwickler des CMS hat als “not so elegant solution” folgendes vorgeschlagen:

let _paq_first = true;
function x3_load_page(){
  if(_paq_first) return _paq_first = false;
  setTimeout(() => {
    console.log('_paq.push', document.title);
    _paq.push(['setCustomUrl', window.location.pathname]);
    _paq.push(['setDocumentTitle', document.title]);
    _paq.push(['trackPageView']);
  }, 350);
}

Erscheint dir das sinnvoll? Für mich als Code-Laie stellt sich das als ähnlicher Ansatz zu deinem Vorschlag im Edit dar, nur eben an anderer (für mich erreichbarer) Stelle.
Edit: Bei deinem Vorschlag wüsste ich nämlich auch nicht, wo ich da überhaupt drauf zugreife. Gehört das in den Code, den ich im Header eingefügt habe?

Wenn es funktioniert was der Entwickler des CMS vorgeschlagen hat, dann verwende das so. Von SPA habe ich keine Ahnung. Der Code des Entwickler des CMS ist in der if-Zeile JavaScript shortcode. Das ist schonmal schwierig für Anfänger und selbst ich tue mich damit schwer und verwende sowas auch nicht.

Der Code-Schnipsel ohne Shortcode (meiner Ansicht nach):

let _paq_first = true; // Setzen einer Variablen "_paq_first" mit Wert "true" beim Laden der Website.
function x3_load_page(){
  if(_paq_first === true) { // Hat die Variable "_paq_first" den Wert "true", dann wurde die "x3_load_page"-Funktion das erste Mal aufgerufen und das folgende "return" führt zum Ausstieg aus der "x3_load_page"-Funktion.
    _paq_first = false; // Der Wert der Variablen "_paq_first" wird auf "false" gesetzt, als Markierung, dass die "x3_load_page"-Funktion schon einmal aufgerufen wurde.
    return _paq_first; // Ausstieg aus der "x3_load_page"-Funktion, mit Ausgabewert der Variablen "_paq_first".
  }
// Das folgende wird nur dann ausgeführt, wenn die Variable "_paq_first" den Wert "false" hat, also die "x3_load_page"-Funktion nicht das erste Mal, sondern zweite, dritte, vierte ... Mal aufgerufen wird.
  setTimeout(() => {
    console.log('_paq.push', document.title); // Ausgabe des Seiten-Titels in der Browser-Konsole (zur visuellen Prüfung).
    _paq.push(['setCustomUrl', window.location.pathname]);
    _paq.push(['setDocumentTitle', document.title]);
    _paq.push(['trackPageView']);
  }, 350);
  // return _paq_first; // rein theoretisch korrekte Zeile, die nicht verwendet wird.
}

Dann kommt es drauf an, wo die Funktion x3_load_page() aufgerufen wird. Beim ersten Aufruf der Funktion wird Matomo nicht getriggert, sondern erst ab dem zweiten Aufruf.

Rein theoretisch ist der Code nicht optimal, da ein zweites returnfehlt. Denn dann kann die Ausgabe der Funktion abgefragt werden.

var x3_load_page_value = x3_load_page();
if (x3_load_page_value === true) {
  // code
}

Aber da es nicht benötigt wird, wurde darauf verzichtet.
Hinweis: Alles nach einem return wird nicht ausgeführt.

Wegen dem console.log() kannst du während dem Surfen auf deiner Webseite die Browser-Konsole öffnen und geöffnet lassen, damit du die Ausgabe sehen kannst.

1 Like

Ich habe den Vorschlag des Entwicklers so eingesetzt und getestet. Ich musste das Delay etwas erhöhen, aber jetzt scheint alles zu funktionieren.

Herzlichen Dank für deine Unterstützung und die Erläuterung des Codes!