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.php → matomo
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
| Method | Return | Beschreibung |
|---|---|---|
isConfigured() | bool | Prüft ob URL, Token, Site-ID und Enabled gesetzt sind |
getBulkData(urls) | array|null | Batch-Request für mehrere Matomo-Methoden |
callMethod(method, params) | array|null | Einzelne Matomo API-Methode aufrufen |
getVisitsSummary(period, date) | array|null | Besuche, Seitenaufrufe, Absprungrate, Ø Dauer |
getLiveCounters(lastMinutes) | array|null | Echtzeit-Besucherzähler |
getTopPages(period, date, limit) | array|null | Top N Seiten nach Aufrufen |
getReferrerTypes(period, date) | array|null | Traffic-Quellen (Direkt, Suche, Social, Websites) |
getTopCountries(period, date, limit) | array|null | Top N Länder |
getDeviceTypes(period, date) | array|null | Desktop / Mobile / Tablet Verteilung |
getBrowsers(period, date, limit) | array|null | Browser-Verteilung |
getDailyVisitsTrend(days) | array|null | Tägliche Besuchsdaten für Charts |
getDailyDevicesTrend(days) | array|null | Tägliche Geräte-Daten für Charts |
getTopReferrerWebsites(period, date) | array|null | Top Referrer-Websites |
getEntryPages(period, date, limit) | array|null | Einstiegsseiten (Landing Pages) |
getExitPages(period, date, limit) | array|null | Ausstiegsseiten |
Erweiterungen
| Method | Extension | Beschreibung |
|---|---|---|
getGoals(period, date) | E1 | Goal-Conversions aus Matomo Goals API |
getEventCategories(period, date) | E4 | Custom Event-Tracking Auswertung |
getSiteSearchKeywords(period, date) | E5 | Interne Suchbegriffe |
getSiteSearchNoResults(period, date) | E5 | Suchbegriffe ohne Ergebnis |
getLastVisits(count) | E6 | Letzte N Besucher mit Details |
getVisitsComparison(period, date) | E8 | Vergleich mit Vorperiode |
getPageTransitions(pageUrl, period, date) | E10 | Seiten-Übergänge |
flushCache() | — | Alle Matomo-Cache-Keys löschen |
Caching-Strategie
| Daten-Typ | Cache-TTL | Begründung |
|---|---|---|
| Live-Counter | 1 Min | Echtzeit-Daten, muss aktuell sein |
| KPI Heute | 5 Min | Ändert sich oft, aber nicht in Echtzeit |
| KPI 7 Tage | 15 Min | Aggregierte Daten, ändert sich selten |
| KPI 30 Tage / Charts | 1 Std | Historische 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
| Widget | Datenquelle | Beschreibung |
|---|---|---|
| Live-Counter | Live.getCounters (1 Min Cache) | Besucher in letzten 30 Min mit Pulsierungs-Indikator |
| KPI-Cards (3 Zeilen) | VisitsSummary.get | Besuche, Seitenaufrufe, Absprungrate, Ø Dauer für Heute/7d/30d |
| Vorperioden-Vergleich (E8) | VisitsSummary.get (Bulk) | KPI-Änderungen vs. Vorwoche mit Farb-Pfeilen |
| Besuchs-Trend | VisitsSummary.get (30 Tage) | ApexCharts Area-Chart: Besuche + Seitenaufrufe pro Tag |
| Top 10 Seiten | Actions.getPageTitles | Tabelle: Seite, Aufrufe, Besuche |
| Traffic-Quellen | Referrers.getReferrerType | Balkendiagramm mit Prozent: Direkt, Suche, Social, Websites |
| Top 10 Länder | UserCountry.getCountry | Tabelle: Land, Besuche |
| Gerätetypen + Browser | DevicesDetection.getType + getBrowsers | Badges mit Prozent-Anteilen |
| Top Referrer-Websites | Referrers.getWebsites | Tabelle: Website, Besuche |
| Ein-/Ausstiegsseiten | Actions.getEntry/ExitPageTitles | Zwei-Spalten: Einstieg vs. Ausstieg |
| Event-Tracking (E4) | Events.getCategory | Tabelle: Kategorie, Events, Besuche |
| Interne Suche (E5) | Actions.getSiteSearchKeywords | Tag-Clouds: Top Suchbegriffe + ohne Ergebnis |
| Goals (E1) | Goals.get | Conversions, Conversion-Rate, Besuche mit Conversion |
| Letzte Besucher (E6) | Live.getLastVisitsDetails | Tabelle: Land, Aktionen, Dauer, Quelle (scrollbar) |
| Konfiguration | Config | URL, Site-ID, Token-Status, Enabled |
Zeitraum-Tabs
Alle Content-Widgets reagieren dynamisch auf den gewählten Zeitraum:
| Tab | Period | Date |
|---|---|---|
| Heute | day | today |
| 7 Tage | range | last7 |
| 30 Tage | range | last30 |
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
| Kategorie | Action | Name | Trigger | Location |
|---|---|---|---|---|
Registration | success | form | Formular-Registrierung abgeschlossen | app/Actions/Fortify/CreateNewUser.php |
Registration | success | google | Google OAuth Registrierung (nur neue User) | app/Http/Controllers/Auth/SocialiteController.php |
Matomo Goal-Konfiguration
Für Registrierungs-Tracking in Matomo Goals:
- Goal-Typ: „Event auslösen" (nicht URL-basiert, da beide Registrierungswege auf
/dashboardlanden) - Bedingung: Event-Kategorie =
Registration, Event-Action =success - Optional: Separate Goals für
formvs.googleüber Event-Name filtern
Performance
| Aspekt | Detail |
|---|---|
| API-Calls | 1 Bulk-Request oder einzelne Calls mit Redis-Cache |
| Matomo-Server-Last | Max. 96 Calls/Tag bei 15 Min TTL — vernachlässigbar |
| Response-Zeiten | Pre-archived Periods (day/week/month) < 100ms; Range-Queries 200-500ms |
| HTTP-Timeout | 10 Sekunden |
| Memory | Minimal — nur JSON-Responses, keine großen Datenmengen |