Zum Hauptinhalt springen

Matomo Analytics

Postbox nutzt eine selbst-gehostete Matomo-Instanz (ana.lyse.io) für Website-Analytics. Die Integration besteht aus zwei Teilen: Tracking (Seitenaufrufe senden) und Reporting (Statistiken im Admin-Dashboard anzeigen).


Architektur

graph TD
A["Laravel App"] -->|"TrackPageView Middleware"| B["Matomo Tracking API"]
A -->|"MatomoTrackingService"| B
B --> C["Matomo Server<br>(ana.lyse.io)"]
C -->|"MatomoApiService"| D["Redis Cache"]
D -->|"Admin Dashboard"| E["/admin/matomo-statistics"]

Konfiguration

# Matomo-Instanz URL
MATOMO_URL=https://ana.lyse.io

# Site-ID in Matomo
MATOMO_SITE_ID=33

# Auth-Token (erstellt unter: Matomo > Administration > Personal > Security)
MATOMO_TOKEN=dein_matomo_token

# Feature-Toggle
MATOMO_ENABLED=true

Config-Location: config/services.phpmatomo

Sicherheit: Token wird immer per POST gesendet (nie als GET-Parameter). HTTPS ist Pflicht.


MatomoApiService

Location: app/Services/Matomo/MatomoApiService.php

Zentraler Service für die Matomo Reporting API. Nutzt API.getBulkRequest um mehrere API-Methoden in einem HTTP-Call zu bündeln.

API-Methoden

MethodReturnBeschreibung
isConfigured()boolPrüft ob URL, Token, Site-ID und Enabled gesetzt sind
getBulkData(urls)array|nullBatch-Request für mehrere Matomo-Methoden
callMethod(method, params)array|nullEinzelne Matomo API-Methode aufrufen
getVisitsSummary(period, date)array|nullBesuche, Seitenaufrufe, Absprungrate, Ø Dauer
getLiveCounters(lastMinutes)array|nullEchtzeit-Besucherzähler
getTopPages(period, date, limit)array|nullTop N Seiten nach Aufrufen
getReferrerTypes(period, date)array|nullTraffic-Quellen (Direkt, Suche, Social, Websites)
getTopCountries(period, date, limit)array|nullTop N Länder
getDeviceTypes(period, date)array|nullDesktop / Mobile / Tablet Verteilung
getBrowsers(period, date, limit)array|nullBrowser-Verteilung
getDailyVisitsTrend(days)array|nullTägliche Besuchsdaten für Charts
getDailyDevicesTrend(days)array|nullTägliche Geräte-Daten für Charts
getTopReferrerWebsites(period, date)array|nullTop Referrer-Websites
getEntryPages(period, date, limit)array|nullEinstiegsseiten (Landing Pages)
getExitPages(period, date, limit)array|nullAusstiegsseiten

Erweiterungen

MethodExtensionBeschreibung
getGoals(period, date)E1Goal-Conversions aus Matomo Goals API
getEventCategories(period, date)E4Custom Event-Tracking Auswertung
getSiteSearchKeywords(period, date)E5Interne Suchbegriffe
getSiteSearchNoResults(period, date)E5Suchbegriffe ohne Ergebnis
getLastVisits(count)E6Letzte N Besucher mit Details
getVisitsComparison(period, date)E8Vergleich mit Vorperiode
getPageTransitions(pageUrl, period, date)E10Seiten-Übergänge
flushCache()Alle Matomo-Cache-Keys löschen

Caching-Strategie

Daten-TypCache-TTLBegründung
Live-Counter1 MinEchtzeit-Daten, muss aktuell sein
KPI Heute5 MinÄndert sich oft, aber nicht in Echtzeit
KPI 7 Tage15 MinAggregierte Daten, ändert sich selten
KPI 30 Tage / Charts1 StdHistorische Daten, kaum Änderungen

"Aktualisieren"-Button löscht alle Matomo-Cache-Keys. Unterstützt mehrere Cache-Driver:

  • Redis: Tag-basiertes Flushing via Cache::tags('matomo')->flush()
  • Database/File: Prefix-basiertes Löschen aller Keys mit matomo: Prefix
  • Null-Caching: Leere API-Responses werden als leeres Array gecacht, um wiederholte fehlgeschlagene Requests zu vermeiden

Admin Dashboard

Route: /admin/matomo-statistics Component: App\Livewire\Admin\MatomoStatistics\Index Sidebar: System-Gruppe → "Matomo"

Widgets

WidgetDatenquelleBeschreibung
Live-CounterLive.getCounters (1 Min Cache)Besucher in letzten 30 Min mit Pulsierungs-Indikator
KPI-Cards (3 Zeilen)VisitsSummary.getBesuche, Seitenaufrufe, Absprungrate, Ø Dauer für Heute/7d/30d
Vorperioden-Vergleich (E8)VisitsSummary.get (Bulk)KPI-Änderungen vs. Vorwoche mit Farb-Pfeilen
Besuchs-TrendVisitsSummary.get (30 Tage)ApexCharts Area-Chart: Besuche + Seitenaufrufe pro Tag
Top 10 SeitenActions.getPageTitlesTabelle: Seite, Aufrufe, Besuche
Traffic-QuellenReferrers.getReferrerTypeBalkendiagramm mit Prozent: Direkt, Suche, Social, Websites
Top 10 LänderUserCountry.getCountryTabelle: Land, Besuche
Gerätetypen + BrowserDevicesDetection.getType + getBrowsersBadges mit Prozent-Anteilen
Top Referrer-WebsitesReferrers.getWebsitesTabelle: Website, Besuche
Ein-/AusstiegsseitenActions.getEntry/ExitPageTitlesZwei-Spalten: Einstieg vs. Ausstieg
Event-Tracking (E4)Events.getCategoryTabelle: Kategorie, Events, Besuche
Interne Suche (E5)Actions.getSiteSearchKeywordsTag-Clouds: Top Suchbegriffe + ohne Ergebnis
Goals (E1)Goals.getConversions, Conversion-Rate, Besuche mit Conversion
Letzte Besucher (E6)Live.getLastVisitsDetailsTabelle: Land, Aktionen, Dauer, Quelle (scrollbar)
KonfigurationConfigURL, Site-ID, Token-Status, Enabled

Zeitraum-Tabs

Alle Content-Widgets reagieren dynamisch auf den gewählten Zeitraum:

TabPeriodDate
Heutedaytoday
7 Tagerangelast7
30 Tagerangelast30

Server-Side Event Tracking

Neben dem Pageview-Tracking via Middleware unterstützt Postbox auch server-seitiges Event-Tracking über den MatomoTrackingService.

MatomoTrackingService

Location: app/Services/MatomoTrackingService.php

Sendet Custom Events an die Matomo Tracking API. Events werden als queued Jobs (TrackMatomoEvent) verarbeitet, um die User-Experience nicht zu blockieren.

resolve(MatomoTrackingService::class)->trackEvent(
category: 'Registration',
action: 'success',
name: 'form',
userId: $user->id,
ip: request()->ip(),
url: request()->fullUrl(),
);

Getrackte Events

KategorieActionNameTriggerLocation
RegistrationsuccessformFormular-Registrierung abgeschlossenapp/Actions/Fortify/CreateNewUser.php
RegistrationsuccessgoogleGoogle OAuth Registrierung (nur neue User)app/Http/Controllers/Auth/SocialiteController.php

Matomo Goal-Konfiguration

Für Registrierungs-Tracking in Matomo Goals:

  1. Goal-Typ: „Event auslösen" (nicht URL-basiert, da beide Registrierungswege auf /dashboard landen)
  2. Bedingung: Event-Kategorie = Registration, Event-Action = success
  3. Optional: Separate Goals für form vs. google über Event-Name filtern

Performance

AspektDetail
API-Calls1 Bulk-Request oder einzelne Calls mit Redis-Cache
Matomo-Server-LastMax. 96 Calls/Tag bei 15 Min TTL — vernachlässigbar
Response-ZeitenPre-archived Periods (day/week/month) < 100ms; Range-Queries 200-500ms
HTTP-Timeout10 Sekunden
MemoryMinimal — nur JSON-Responses, keine großen Datenmengen