Warum wird der Besucher auf zwei gesplittet?

Warum werden einzelne Besucher also zwei gewertet obwohl sie die gleiche IP haben. Meistens dann wenn ein Ereignis eintritt, aber nicht immer.

Kann jemand helfen bitte?

Muss an der Einbindung liegen. Standard ist das ja nicht. Hast du bei internen Links vielleicht Kampagnenparameter im Einsatz? Wird das im Bsucherlog auch so angezeigt? Kannst du uns die Domain nennen?

Kampagnenparameter sind nicht im Einsatz. Das Ereignis wird automatisch gefeuert, das macht nicht der Besucher. Das Event ist die Aufzeichnung der Kategorienummer um das besser nachvollziehen zu können, wo sich die Leute aufhalten. Im Besucherlog sieht das dann genauso aus.

Ganz oben beim ersten und weiter unten beim Yahoo Besucher funktioniert es ganz normal wie es soll. Alles wird dem einen Besucher richtig zugeordnet. Also nur sporadisch.

Hier ist exakt das gleiche Problem. Leider auch ungelöst:

Ich verwende keine Tag-Manager. Die IPs sind anonymisiert auf 1 byte und ich erzwinge in den Einstellungen meiner Server-Installation von Matomo das Tracking ohne Cookies.

Wenn ich unter DSGVO Hilfsmittel die IPs bereinigen möchte, sehe ich, dass das Event zuerst eine Besuchs-ID bekommt und dann mit der nächst höheren Besuchs-ID der eigentliche Besuch gezählt wird. Kann es daran liegen, dass das Event automatisch mit dem erscheinen des Besuchers ausgelöst wird und dadurch das Event vor dem Besuch gezählt wird?

Nutzt du die Funktion UserID ? Setzt du diese beim Ereignis ?

Nein. Ich sehe nur unter

/index.php?module=PrivacyManager&action=gdprTools&idSite=1&period=day&date=today

dass die User-ID mit dem Event eine Zahl kleiner ist als der Track des eigentlichen Besuchs. Heisst das Event wird vor dem Besuch getrackt. Vielleicht liegt da der Fehler. Ich werde mal versuchen sleep(); zu verwenden und das Script eine Sekunde zu verzögern.

Btw… Aktuell ist es besser seit ich aus dem Tracking-Code die Zeile

 _paq.push(['disablecookies']);

entfernt habe. In den Einstellungen ist “Tracking ohne Cookies erzwingen” aktiviert. Weiss nicht ob es daran liegen konnte.

Ohne Code-Einblick kann ich da nur schwer helfen.
An den Cookies sollte es nicht liegen.

Daran solls nicht scheitern. :grinning: Der Tracking-Code:

<!-- Matomo -->
<script>
  var _paq = window._paq = window._paq || [];
  /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="https://www.domain.com/stats/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '1']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Matomo Code -->
<noscript>
<img referrerpolicy="no-referrer-when-downgrade" src="https://www.domain.com/stats/matomo.php?idsite=1&amp;rec=1&amp;idgoal=1" style="border:0" alt="" />
</noscript>

Der Event-Code sobald der Besucher die Seite betritt:

if (isset($_GET['category']) && $canview ) {
	$makeb = $_GET['make'];
	$modelb = $_GET['model'];
	if ($makeb == "") { $makeb = "ohne Marke"; }
	if ($modelb == "") { $modelb = "ohne Modell"; }
	// sleep(1); <- vielleicht mal testweise?
	echo '<img src="https://www.domain.com/gfx/visit.gif" alt="gif" onload="_paq.push([\'trackEvent\', \'Besucher\', \'' . $_GET['kategorie'] . '\', \'' . $makeb . ' ' . $modelb . '\']);" width="1" height="1">';
}

Hm, das sieht ganz normal aus.
Load Balancer, verteiltes Tracking oder Queded Tracking hast du nicht im Einsatz?

Nein. Nichts davon. Das passiert auch willkürlich. Ich konnte kein Muster erkennen. In gefühlt 5% der Zugriffe.

Da weiß ich auch nicht weiter.
Scheint aber eine komische Konstellation zu sein, weil es ja nicht immer auftritt.
Vielleicht eher einen Bug Report auf GitHub einstellen.

Danke trotzdem für die Hilfe. Vielleicht sehen andere betroffene diesen Beitrag und haben eine Lösung.

Hallo einserpirelli,

wenn es keinen Unterschied macht ob mit oder ohne, dann nimm das wieder in deinen Tracking Code auf:
_paq.push(['disablecookies']);

Zum Problem:
Es ist durchaus sehr seltsames Besucherverhalten zu beobachten, dass eben auch getrackt wird. Da ist es nur schwer nachvollziehbar, was der Besucher gemacht hat. Die Beispiele sind sehr vielfältig. Auch bleibt unbekannt, welche Browser-Plugins damit etwas zu tun haben und das Tracking manipulieren und stören.

Du hast von einem sleep() geschrieben. Das ist eine PHP-Funktion und bringt so nichts in diesem Fall. Wenn dann würde ein setTimeout() (JavaScript) etwas bringen. Bei meinem Tracking ist sowas aktiv, weil meinerseits kein Interesse bestand diese Website-Hopper, die nur hin- und herklicken und nur sehr wenige Sekunden auf einer Webpage verweilen ohne den Content wirklich zu betrachten, zu tracken. Das scheint soweit zu funktionieren, aber es gibt weiterhin Seltsamkeiten. Diese wird es wohl immer geben und sind nicht alle zu beseitigen.

Bei deinem Problem vorstellbar wäre, dass ein Besucher die Webpage fast gleichzeitig doppelt aufruft und deshalb zwei userIds angelegt werden. Obwohl PHP linear ist, könnte sowas am Server liegen, der das nicht schnell genug verarbeitet. Andererseits besteht die Möglichkeit von Browser-Plugins, die die empfangenen Browser-Daten während des Surfens so manipulieren (eventuell sogar neue IP), dass eine neue userId angelegt wird, weil der Fingerprint nicht zum vorherigen Besuch des selben Besuchers passt.

Vielen Dank für Deine Einschätzung :+1:

Ich bin gerade einen Schritt weiter gekommen. Ich habe in den Logfiles gesehen, wenn der Besucher gesplittet wird, gibt Cloudflare den beiden POST Einträgen für die Zählung des Besuchers und des Events verschiedene IP´s. Damit wird der Besucher gesplittet obwohl in den Matomo Logfiles bei der echten IP die gleiche steht und es der selbe Besucher ist.

172.70.246.165 - - [05/Jun/2023:15:23:51 +0200] "POST /stats/matomo.php?e_c=
172.70.246.164 - - [05/Jun/2023:15:23:51 +0200] "POST /stats/matomo.php?action_name=

Jetzt muss ich nur noch rausfinden warum das bei Cloudflare ab und zu passiert. :man_shrugging:

Edit: Laut Cloudflare Community werden Anfragen von ein und demselben Besucher manchmal von verschiedenen Servern bedient und erhalten damit verschiedene IP´s. Man kann das nur verhindern, indem man die original IP Adressen der Besucher wiederherstellt:

Das ist technisch für mich zu aufwendig. Ich werde damit leben müssen.

Aha, na siehste.

bei Cloudflare steht:
The original visitor IP address appears in an appended HTTP header called CF-Connecting-IP.

Alternatively, if you do not wish to receive the CF-Connecting-IP header or any HTTP header that may contain the visitor’s IP address, enable the Remove visitor IP headers Managed Transform.

  1. Log in …
    Bitte lesen: https://developers.cloudflare.com/rules/transform/managed-transforms/configure/

Andererseits… diese CF-Connecting-IP soll im HTTP Header mitgesendet werden. Den HTTP Header müsstest du also mal testweise auslesen. Wobei ich gerade nicht den Durchblick habe. Was wird mit Cloudflare gemanaged? Die Website oder Matomo?

HTTP Headers auslesen mit PHP.
https://www.php.net/manual/de/function.getallheaders.php
Das müsstest du testweise in die matomo.php einbauen und das Ergebnis in ein Textfile schreiben:
https://www.php.net/manual/de/function.file-put-contents.php

In etwa so:
matomo.php (vorher eine Kopie anlegen)

<?php // erste Zeile, bereits vorhanden.

$mytest_concat = "";
foreach (getallheaders() as $key => $value) {
    $mytest_concat .= $key . ": " . $value;
    $mytest_concat .= PHP_EOL;
}
file_put_contents(__DIR__ . "/mytest" . time() . ".txt", $mytest_concat);

Wenn die CF-Connecting-IP bei getallheaders() nicht dabei ist, dann mal $_SERVER probieren.
Bei dem PHP-Code wird bei jedem Request eine Datei angelegt mit dem HTTP Header als Inhalt. Wenn es also viele Request sind, dann werden es viele Dateien.
Mach das aber nur, wenn du weißt was du machst.
Wenn dann der Key vom HTTP-Header Array, also dieses CF-Connecting-IP bekannt ist, dann kann diese direkt aus dem HTTP-Header ausgelesen werden und durch die Cloudflare-IP ersetzt werden.

$userIPtrue = getallheaders()["CF-Connecting-IP"];

Allerdings ist das Matomo dann ein Mod und muss bei jedem Update neu gemoddet werden, oder ein Issue bei Github eröffnen und ein Einpflegen dieses IP-Austausches vorschlagen. In etwa so:

  • Wenn CF-Connecting-IP vorhanden, dann IP mit dieser ersetzen.

Also das Ziel wäre, dies in den Matomo Code zu integrieren.

Andererseits… soeben gefunden: