Anomaly Sentinel überwacht ein Konto Stunde für Stunde. Es vergleicht den heutigen Tag (bis zur letzten vollen Stunde) mit demselben Wochentag der letzten N Wochen und löst WARNING- oder CRITICAL-Alerts aus, wenn eine Metrik den robusten Z-Score überschreitet. Alerts werden über Stunden hinweg dedupliziert, bei Verschlechterung eskaliert und mit einer Entwarnung geschlossen.

So funktioniert es

Für jede der zehn Metriken (Impressionen, Klicks, Kosten, Conversions, Conv.-Wert, CTR, CPC, Conv.-Rate, CPA, ROAS) bildet das Skript eine Baseline aus demselben Wochentag über weeks Wochen, nutzt Median und MAD statt Mittelwert und Standardabweichung, damit einzelne Ausreißer sie nicht verzerren, und setzt absolute Untergrenzen, wenn die Baseline null ist. Volumenschwellen (min_impressions, min_clicks), Ruhestunden, Ausnahmedaten und eine Mindestabweichung in Prozent unterdrücken Rauschen. Da Conversions verspätet eintreffen, sind conversion-basierte Metriken auf WARNING begrenzt, bis eine Stunden-Snapshot-Baseline mindestens snapshot_baseline_min_samples Stichproben hat; danach wechseln sie auf die Snapshot-Baseline. Jeder Alert nennt die Kampagnen, die die Abweichung am stärksten erklären.

Was in das Sheet geschrieben wird

  • Alerts — 14 Spalten pro Ereignis: Zeitstempel, Datum, Stunde, Metrik, Status (NEW / ESCALATED / RECOVERED), Schwere (WARNING / CRITICAL), Beobachtet, Erwartet, Abweichung, Stichproben, Kampagnen-Hinweise u. a.; der Zustellkanal wird als Notiz an der Status-Zelle abgelegt.
  • _settings — alle Schwellen unten, ohne Codeänderung editierbar.
  • _state, _baseline, _snapshot — intern: offene Alerts, die Wochentags-Baseline und die Stunden-Snapshots (nach snapshot_keep_weeks Wochen bereinigt).

Einrichtung

  1. Lege mit dem Google-Konto, mit dem du das Skript autorisierst, ein neues, leeres Google Sheet an und kopiere die URL. Verwende kein Sheet eines anderen Skripts — jedes Sheet ist an ein Skript und ein Google Ads-Konto gebunden.
  2. Öffne in Google Ads Tools → Skripts, lege ein neues Skript an, füge den gesamten Code ein und vergib einen Namen.
  3. Trage die Sheet-URL in CONFIG.spreadsheet_url ein. Läuft das Skript aus einem Verwaltungskonto (MCC), setze zusätzlich CONFIG.account_id auf die Kunden-ID (z. B. 123-456-7890); ohne diese Angabe bricht das Skript mit einer klaren Fehlermeldung ab.
  4. Optional: CONFIG.email (Empfänger durch Komma getrennt) und/oder CONFIG.slack_webhook befüllen. Der Webhook bleibt ausschließlich im Code und wird nie in das Sheet geschrieben.
  5. Skript autorisieren, einmal Vorschau ausführen und das Protokoll prüfen, dann Ausführen. Der erste Lauf erstellt die Tabs, die Kopfzeilen und den Tab _settings.
  6. Zeitplan einrichten: stündlich.
  7. Optional: das Excel-Dashboard herunterladen (Button oben), den Tab Read me öffnen und die Sheet-Tabs wie dort beschrieben einfügen — das Spaltenlayout entspricht der Skriptausgabe eins zu eins.

Parameter

ParameterBeschreibungStandard
spreadsheet_urlURL des leeren Google Sheets, in das das Skript schreibt.'YOUR_SPREADSHEET_URL'
emailEmpfänger durch Komma getrennt; leer = keine E-Mail. In _settings überschreibbar.''
slack_webhookSlack-Incoming-Webhook-URL; leer = keine Slack-Nachricht. Bleibt nur im Code.''
account_idKunden-ID; nur nötig, wenn das Skript aus einem Verwaltungskonto (MCC) läuft.''
weeksTiefe der Wochentags-Historie.12
lag_hoursToleranz für Reporting-Verzögerung in Stunden; die letzten N Stunden werden nicht bewertet.3
quiet_hours_endVor dieser Stunde keine ratenbasierten Alerts.6
min_impressions / min_clicksVolumenschwellen für Ratenmetriken.1000 / 50
min_conversions_baselineCPA-/Conv.-Rate-/ROAS-Alerts überspringen, wenn die Baseline-Conversions darunter liegen.3
z_warning / z_criticalRobuste Z-Score-Schwellen für WARNING und CRITICAL.2.0 / 3.0
min_pct_deviationAbweichungen unter diesem Anteil ignorieren.0.20
abs_floorAbsolute Schwellen bei Baseline null (Impressionen, Klicks, Kosten, Conversions, Wert).200 / 20 / 20 / 2 / 50
conversion_metrics_max_severityWARNING oder CRITICAL — Obergrenze für conversion-basierte Metriken, bis die Snapshot-Baseline reif ist.'WARNING'
snapshot_baseline_min_samplesNötige Stichproben, bevor Conversion-Metriken die Stunden-Snapshot-Baseline nutzen.12
snapshot_keep_weeksWochen an stündlichen Snapshot-Zeilen vor der Bereinigung.26
exception_datesZu ignorierende Tage (Feiertage, Launches), yyyy-MM-dd.[]
campaign_hintsTop-N Kampagnen, die als Erklärung einer Abweichung gelistet werden.3
Alle Werte stehen im CONFIG-Block am Anfang des Skripts; Schlüssel, die auch im Tab _settings existieren, lassen sich dort ändern.

Der Tab _settings

Beim ersten Lauf legt das Skript einen Tab _settings (Key / Value / Notes) an. Werte dort überschreiben die passenden CONFIG-Einträge, sodass das tägliche Feintuning im Sheet stattfindet, ohne Code zu ändern. Zahlen müssen ohne Tausendertrennzeichen und mit höchstens zwei Dezimalstellen geschrieben werden (0.5 oder 0,5). Die Zeilen script und account markieren den Besitzer des Sheets: Öffnet ein anderes Skript oder ein anderes Konto dasselbe Sheet, stoppt es, bevor etwas geschrieben wird. Interne Tabs mit Unterstrich (_settings, _history, _snapshot, _state, _baseline) sind sprachunabhängig; ein Wechsel zwischen den EN/TR/DE-Builds behält den gespeicherten Zustand.

Benachrichtigungen

Neue, eskalierte und erholte Ereignisse gehen per E-Mail und/oder Slack raus, mit Metrik, beobachtet vs. erwartet, Abweichung und Kampagnen-Hinweisen. Liefert kein Kanal zu, wird der Alert nicht geschrieben und der Zustand zurückgesetzt; die nächste Stunde versucht es mit einem einzigen Datensatz erneut statt mit einem Duplikat. Teilweise Zustellung (ein Kanal fehlgeschlagen) wird protokolliert.

Hinweise und Grenzen

  • In den ersten 12 Wochen bleiben Conversion-Alerts absichtlich auf WARNING — die Snapshot-Baseline reift, das ist kein Fehler.
  • Die Datumsarithmetik ist kalenderbasiert; Zeitumstellungen (USA und EU) verschieben die Wochentags-Baseline nicht.
  • Jeder Berichts-Tab enthält eine kleine Attributionszelle (H1:K1, nur Warnschutz) und der Code-Header eine Copyright-Zeile; beides kann jeder entfernen, der die Quelle bearbeitet.