Live-Dashboard, Anomalie-Alerts und Health-Score

Pro-Kanal-Ringbuffer der letzten 50 Events, 30 Tage Pro-Tag-Counter, ein 0-bis-10-Health-Score pro Kanal, und automatische E-Mail bei einem 50-Prozent-Drop oder einem 4-fach-Spike. Drei Klassen, die sich zwei autoload=false-wp-Options teilen. Keine neuen Datenbank-Tabellen.

Lesezeit: ca. 5 MinZuletzt aktualisiert: 2026-05-09

Was es macht

Das Live-Dashboard beantwortet drei Fragen, in die ein Operator das erste Mal rennt, sobald sein Chef nachfragt: "Trackt Meta noch?" Karte 1: ja, hier sind die letzten 12 Events mit Timestamp und Wert. Karte 2: ja, hier ein 7-Tage-Pro-Kanal-Chart, damit du eine Nulllinie sofort siehst. Karte 3: jeder Kanal hat einen 0-bis-10-Health-Score, der auf einen Blick rot, gelb oder grün ist. Und falls ein Kanal plötzlich aufhört oder plötzlich explodiert, bekommst du eine E-Mail, ohne dass du aufs Dashboard schauen musst.

Wie aktivieren

Nichts zu aktivieren. Der Recorder hängt sich automatisch an bcnr_post_dispatch_event, sobald die Tracking-Pipeline bootet (Lizenz aktiv, Master-Toggle on). Die Karte erscheint im Beaconry-Dashboard-Tab, sobald das erste Event landet. Der Anomalie-Cron läuft täglich, sobald sich mindestens 14 Events in der 7-Tage-Baseline angesammelt haben, sodass Test-Pings beim Setup keine Alerts auslösen.

Der Alert-Empfänger ist dieselbe alert_email, die du im Tab Advanced für BCNR_Health gesetzt hast. Wenn du eine separate Inbox für Anomalien willst, ändere das Feld dort, beide Alerts folgen.

Wie es funktioniert (unter der Haube)

Drei Klassen, ein gemeinsamer Storage, ein REST-Endpoint.

  1. BCNR_Dashboard_Stats-Recorder. Hört auf die Pro-Kanal-bcnr_post_dispatch_event-Action, feuert einmal pro Kanal pro Event, nachdem der channel-eigene dispatch_*-Call zurückkam. Schreibt bei jedem versendeten Event in zwei autoload=false-wp-Options:
    • bcnr_dashboard_recent, Ringbuffer der letzten 50 Events mit Channel-Slug, event_name, Timestamp, Wert, Währung. Wird in der Recent-Events-Liste auf der Karte gezeigt.
    • bcnr_dashboard_counters, Pro-Kanal-pro-Tag Count + Value-Summe, letzte 30 Tage, Prune-on-Write. Wird als 7- oder 30-Tage-Chart auf der Karte gezeigt.
    Zwei update_option-Calls pro versendetem Event. Bewusster Trade-off gegen eine neue wpdb-Tabelle, gerechtfertigt durch Beaconrys Traffic-Profil (deutlich unter 1k Events pro Stunde auf einer realen Kunden-Site).
  2. REST-Endpoint. GET /wp-json/beaconry/v1/dashboard?range=today|7d|30d liefert das Snapshot für die Karte. Permission-Gate ist manage_options + wp_rest-Nonce. Das Karten-Vanilla-JS im Admin pollt alle 30 Sekunden mit visibilitychange-Pause (kein Traffic, wenn der Tab im Hintergrund läuft). Eine zweite Route DELETE /wp-json/beaconry/v1/dashboard/recent leert den Ringbuffer (Counter bleiben, die Chart-Historie ist erhalten).
  3. BCNR_Anomaly-Tages-Cron. Ein WP-Cron-Event bcnr_anomaly_check liest die Pro-Tag-Counter und vergleicht den Pro-Kanal-Count von gestern gegen den 7-Tage-Rollschnitt aus den Tagen 2 bis 8 (gestern aus der Baseline ausgenommen, damit eine echte Anomalie den Schnitt nicht selbst nach unten zieht). Drop ≥ 50 Prozent oder Spike ≥ 4-fach löst eine E-Mail aus. Zwei Sicherheitsgurte: eine Min-Baseline von 14 Events pro 7 Tagen, damit Test-Pings keine Alerts auslösen, und ein Tagesgate-Transient bcnr_anomaly_alert:<channel>:<date> mit 23-Stunden-TTL, damit derselbe Alert nicht zweimal kommt.
  4. BCNR_Health_Score-Pro-Kanal-Score. Pure Function for_channel($slug) liefert 0 bis 10 aus drei Komponenten: Configured (4 Punkte, falls BCNR_Forwarder::has_*() für diesen Kanal true ist), Active 7d (4 Punkte, falls in den letzten 7 Tagen mindestens ein Event landete), Stable (2 Punkte, falls der Variations-Koeffizient über die letzten 7 Tage unter 1 liegt, also das Tagesvolumen einigermaßen stetig ist). Tier-Bucketing mappt auf rot (0 bis 3), gelb (4 bis 7), grün (8 bis 10) für das Badge auf jeder Karte. Keine Vendor-API-Calls, alles aus derselben In-WP-Counter-Tabelle, die der Recorder schreibt.

Pro-Kanal-Notizen

Der Recorder behandelt jeden Kanal-Slug gleich (ga4|meta|tiktok|linkedin|google_ads|microsoft_ads|pinterest|reddit|snapchat|x_ads), eine Karte erscheint also für jeden tatsächlich konfigurierten Kanal. Kanäle, die du nicht eingerichtet hast, tauchen nicht auf, keine leeren Null-Balken zum Ignorieren. Der Health-Score-Tier kommt aus reinen Pro-Kanal-Daten, du kannst also eine grüne Meta-Karte neben einer roten TikTok-Karte haben, ohne dass eine die andere verschmutzt.

Konstanten für Power-User

Keine. Das Dashboard ist automatisch verdrahtet. Drei Filter erlauben dir, den Anomalie-Detektor zu tunen, ohne Code-Defaults anzufassen:

  • bcnr_anomaly_drop_ratio, Standard 0.5, Bruchteil-der-Baseline, der einen Drop-Alert auslöst. Auf 0.7 stellen, um schon bei 30 Prozent Drop zu alarmieren, auf 0.3 stellen, um erst bei 70 Prozent Drop zu alarmieren.
  • bcnr_anomaly_spike_ratio, Standard 4.0, Vielfaches-der-Baseline, das einen Spike-Alert auslöst. Nützlich, wenn du ein bekanntes Traffic-Event fährst (Black Friday) und Falsch-Spikes stummschalten willst.
  • bcnr_anomaly_min_baseline, Standard 14 Events pro 7 Tage, unter dem ein Kanal als "zu leise zum Alarmieren" gilt. Auf High-Volume-Sites hochsetzen, um lärmige Klein-Kanal-Alerts zu vermeiden.

Troubleshooting

  • "Karte zeigt keine Daten": der Recorder feuert auf versendete Events. Prüfe, dass der Master-Toggle on ist (Dashboard-Tab) und mindestens ein Kanal konfiguriert ist (Tracking-Tab). Der Logs-Tab zeigt "no dispatch attempted"-Gründe.
  • "Ich habe Recent-Events gelöscht, aber der Chart zeigt sie noch": der Chart liest Pro-Tag-Counter, die Recent-Events-Liste liest den Ringbuffer. Das sind per Design zwei separate Stores, das Löschen von Recent löscht die Chart-Historie nicht. Um den Chart auch zu wischen, ist der vom Operator unterstützte Weg, 30 Tage natürlichen Prune-on-Write abzuwarten oder die Option bcnr_dashboard_counters direkt via WP-CLI zu löschen.
  • "Ich habe einen Anomalie-Alert für einen Kanal bekommen, den ich gerade deaktiviert habe": das ist der Detektor wie beabsichtigt (gestern-vs-Baseline-Vergleich). Der Tagesgate-Transient verhindert einen zweiten Alert für denselben Kanal am selben Tag, und der Tages-Cron sieht ab jetzt null Events auf diesem Kanal, sodass die 7-Tage-Baseline sich innerhalb einer Woche normalisiert.
  • "Mein Health-Score ist gelb, aber der Kanal funktioniert": höchstwahrscheinlich ist die Stable-Komponente (CoV < 1) wegen eines Ausreißer-Tags gefallen. Score erholt sich von selbst, sobald Tage aus dem 7-Tage-Fenster rollen. Configured + Active sind die zwei Komponenten, die für "läuft es überhaupt" zählen, zusammen maximal 8 von 10.