Skill
Daily-Check-Skill — Google Ads
--- name: daily-check-google-ads description: Prüft nach Google-Ads-Syncs Kampagnenleistung, Suchanfragen, Search-Impression-Share, Sync-Gesundheit, Datenfrische und Conversion-Tra
SKILL.md
--- name: daily-check-google-ads description: Prüft nach Google-Ads-Syncs Kampagnenleistung, Suchanfragen, Search-Impression-Share, Sync-Gesundheit, Datenfrische und Conversion-Tracking und priorisiert evidenzbasierte Auffälligkeiten bei Golfclub-Konten. Die produktive Version nutzt ausschließlich lokale Ressourcen-, Lauf- und Tagesdaten. --- # Daily-Check-Skill — Google Ads Läuft ausschließlich auf Google-Ads-Daten (Search + Performance Max). Für Meta-Ads-Konten gibt es einen eigenen, separaten Skill (`daily-check-meta-ads`) mit anderer Anomalie-Logik — Google Ads hat Keyword-/Suchbegriff-Ebene und Impression-Share-Daten, die es bei Meta nicht gibt, und Meta hat Frequenz-/Creative-Fatigue-Signale, die es bei Google nicht gibt. Eine gemeinsame Regel für beide würde in beiden Fällen ungenau. ## Skill-Definition | Feld | Wert | |---|---| | **key** | `daily_check_google_ads` | | **Plattform** | google_ads (Search + Performance Max, getrennt ausgewertet) | | **Kategorie** | `analysis` | | **Eingabe** | keine manuelle Eingabe — Kampagnenanalyse nach erfolgreichem Sync; Account Health nach erfolgreichen und fehlgeschlagenen Läufen sowie im Tageslauf | | **Erlaubte Provider-Tools** | keine — arbeitet **ausschließlich** auf den bereits lokal gespeicherten, normalisierten Snapshot-Daten, kein erneuter Live-Abruf | | **LLM-Einsatz** | Aktuell keiner. Erkennung, Priorisierung und Formulierung sind deterministisch. Ein späteres LLM darf ausschließlich bereits berechnete Evidenz verständlicher formulieren | | **Berechtigung** | Kein Nutzer-Trigger nötig; sichtbar für jeden mit `view` auf den Client | | **Bestätigungspflicht** | Erzeugt keine Mutation — reine Empfehlung. Kann höchstens einen passenden Planungs-/Change-Request-Skill öffnen | | **Ausgabeschema** | Empfehlungs-Zeile: Client, Plattform `google_ads`, optionale lokale Kampagne, auslösender Sync-Lauf, Skill-Version, Priorität, strukturierte Evidenz, Bullet-Begründung, Bearbeitungsstatus | ## Warum deterministisch zuerst, LLM danach Anomalien wie "Kosten ohne Conversion", ein fehlgeschlagener Sync oder veraltete Tagesdaten lassen sich zuverlässig und günstig per Code berechnen — kein Grund, dafür Modellkosten zu zahlen. Die aktuelle Version formuliert auch die Begründungen deterministisch. Ein späteres LLM darf nur aus den bereits berechneten Kandidaten lesbare Texte erzeugen, niemals Regeln, Prioritäten oder Fakten erfinden. ## Regelwerk (deterministisch, läuft zuerst) ### Produktive Regeln (Version 1.2) Diese Regeln verwenden ausschließlich tatsächlich synchronisierte lokale Tageswerte aus `analytics.daily_campaign_metric` und für Search zusätzlich den 30-Tage-Bestand aus `analytics.daily_search_term_metric`. Jede Regel speichert die zugrundeliegenden Werte als Evidenz. 1. **Auslieferungsstopp:** aktive Kampagne mit 0 Impressionen, wenn sie an mindestens zwei vorherigen Tagen im Schnitt mindestens 20 Impressionen hatte. 2. **Kosten ohne Conversions:** zwei aufeinanderfolgende Tage mit mindestens 20 % des Tagesbudgets (mindestens 3 €) Ausgaben und 0 Conversions. 3. **CTR-Einbruch:** mindestens 50 Impressionen und CTR mindestens 25 % unter dem 3- bis 7-Tage-Schnitt. 4. **CPC-/CPA-Anstieg:** ausreichend Daten und mindestens 30 % höher als der 3- bis 7-Tage-Schnitt. 5. **Conversion-Einbruch:** mindestens zwei Conversions im Vergleichsschnitt und mindestens 40 % weniger Conversions bei fortgesetzter Auslieferung. 6. **Spend-Anstieg ohne Wachstum:** Kosten mindestens 50 % über dem Vergleichsschnitt, ohne entsprechendes Conversion-Wachstum. 7. **ROAS-Einbruch:** Conversion-Wert pro Werbe-Euro mindestens 35 % unter dem Vergleichsschnitt bei belastbarem Spend. 8. **Ungewöhnlicher Conversion-Sprung:** mindestens zehn zusätzliche Conversions und mindestens doppelt so viele wie im Vergleichsschnitt; als Beobachtung, nicht als Leistungsversprechen. 9. **Vorsichtiger PMax-Attributionshinweis:** PMax-ROAS mehr als sechsmal so hoch wie Search und gleichzeitig mindestens 30 % weniger Search-Conversions. Das Ergebnis ist ausdrücklich ein Prüfhinweis auf Attribution/Brand-Anteil und kein Kannibalisierungsnachweis. 10. **Search-Reichweite durch Budget verloren:** aktive Search-Kampagne mit mindestens 50 Impressionen, mindestens 3 € Spend und mindestens 20 % budgetbedingt verlorenem Impression Share. Ab 35 % hohe Priorität. Dies führt nie automatisch zu einer Budgeterhöhung. 11. **Search-Reichweite durch Anzeigenrang verloren:** aktive Search-Kampagne mit mindestens 50 Impressionen und mindestens 30 % rangbedingt verlorenem Impression Share. Ab 50 % hohe Priorität; Gebot, Anzeigenrelevanz und Landingpage werden gemeinsam geprüft. 12. **Suchanfragen mit Kosten ohne Conversion:** Search-Term über 30 Tage mit mindestens 50 Klicks, mindestens 20 € Kosten und 0 Conversions. Die höchstens drei teuersten Begriffe werden als fachliche Prüfliste gezeigt, niemals automatisch negativiert. 13. **Konvertierende, nicht hinzugefügte Suchanfrage:** Search-Term über 30 Tage mit mindestens zehn Klicks und drei Conversions, dessen Status nicht als hinzugefügtes Keyword markiert ist. Nur Beobachtung; Match Type und kanonische Anzeigengruppe müssen vor einer Übernahme geprüft werden. Bei weniger als 30 Conversions in der Vergleichswoche benennt die Empfehlung die Datenlage ausdrücklich als richtungsweisend. ### Produktive Account-Health-Regeln (Version 1.0) Diese Regeln verwenden `ad_account`, den neuesten `google_ads_sync_run`, den operativen Kampagnen-/Conversion-Action-Bestand und aggregierte lokale Kampagnen-Tageswerte. 1. **Verbindung unterbrochen:** `oauth_status` ist `error` oder `disconnected`. Die Karte verweist auf den Kontozugang und zeigt nur bereinigte Fehlerdetails. 2. **Letzter Sync fehlgeschlagen:** neuester Lauf ist `failed`; nach drei Versuchen kritisch, vorher hoch. Versuch, Zeitpunkt und bereinigte Providerursache werden als Evidenz gespeichert. 3. **Noch nie bzw. nicht aktuell synchronisiert:** kein erfolgreicher Sync oder letzter Erfolg mindestens 36 Stunden alt; ab 60 Stunden hohe Priorität. 4. **Aktive Kampagnen ohne frische Tagesdaten:** ein erfolgreicher Lauf liegt vor, aktive Kampagnen existieren, aber der für die Kontozone erwartete gestrige Snapshot fehlt. Dies ist bewusst eine kombinierte Auslieferungs-/Importprüfung, keine voreilige Providerdiagnose. 5. **Kein primäres Conversion-Ziel:** aktive Kampagnen, aber keine aktive primäre Conversion-Action. Bei aktiver PMax-Kampagne hoch, bei Search mittel und mit Hinweis, dass reine Traffic-Kampagnen dies beabsichtigen können. 6. **Mögliche Tracking-Stille:** mindestens 10 € aktuelle Ausgaben, 0 Conversions und zuvor mindestens zwei Conversions pro Tag im Vergleichsschnitt. Die Karte verlangt Tracking-, Consent- und Nachfrageprüfung und behauptet keinen bewiesenen Trackingdefekt. Mehrere Account-Treffer werden zu genau einer priorisierten Kontokarte mit maximal drei Bullets zusammengeführt. Die strukturierte Evidenz behält trotzdem alle beitragenden Regeln. ### Geplante Regeln, noch nicht aktiv Die folgenden Prüfungen sind fachlich sinnvoll, werden jedoch erst aktiviert, wenn ihr erforderlicher Input durch den aktiven Provider in den lokalen Bestand geschrieben wird. Sie dürfen vorher nicht als scheinbare Diagnose erscheinen: ### 1. Monatsbudget-Pacing ``` Pacing % = (Ausgaben MTD / erwartete Ausgaben zu diesem Zeitpunkt) × 100 Erwartete Ausgaben = (Monatsbudget / Tage im Monat) × vergangene Tage ``` - 90-110 % = unauffällig - <80 % oder >120 % = Kandidat für Empfehlung, mit **5-Stufen-Ursachenhierarchie** prüfen, bevor eine Ursache benannt wird: (1) Kampagnenstatus-Änderung, (2) Budget-Limit (budgetlimitierte Impression Share), (3) Gebotsstrategie-Verhalten (z. B. Zielvorhaben zu aggressiv, Smart-Bidding-Lernphase), (4) CPC-Veränderung, (5) Wettbewerbsdruck (Impression Share durch Rang verloren) - Bei einem einzelnen Golfclub mit ~400 €/Monat sind Tagesschwankungen normal in den ersten 7 Tagen des Monats — Toleranzband entsprechend weiter fassen ### 2. Vertiefte Auffälligkeiten-Regel (Tag-über-Tag + 7-Tage-Schnitt) - Jede Kennzahl (Kosten, Klicks, CTR, CPC, Conversions, CPA), die sich >20 % gegenüber dem 7-Tage-Schnitt bewegt, wird geflaggt - **Signal-vs-Noise-Filter, bevor irgendetwas als "Problem" gemeldet wird:** - Bewegung >20 % + 7-Tage-Trend bestätigt → echtes Signal, melden - Bewegung >20 % + 7-Tage-Trend flach → wahrscheinlich Rauschen, nur notieren, nicht als Empfehlung ausgeben - Unter 30 Conversions/Woche für die Kampagne → Befund als "richtungsweisend", nicht als belastbar kennzeichnen ### 3. Auslieferungsprobleme (hohe Priorität) - Kampagne aktiv aber 0 Impressionen → Freigabe-/Targeting-Problem - Kosten ohne jede Conversion über mehrere Tage bei nennenswertem Spend (>20 % des Tagesbudgets) → sofort hohe Priorität ## Priorisierung | Priorität | Kriterium | |---|---| | KRITISCH | Kontoverbindung unterbrochen, Wiederholungen ausgeschöpft, Auslieferungsproblem oder Budget-Verbrauch bei 0 Conversions | | HOCH | Bestätigtes Signal (>20 % + Trend bestätigt) mit Business-Impact in € | | MITTEL | Bestätigtes Signal, aber geringer Spend-Anteil oder geringe Konfidenz | | BEOBACHTEN | Bewegung erkannt, aber Trend nicht bestätigt oder Datenvolumen zu gering | Maximal 3-5 Empfehlungen pro Golfclub und Tag ausgeben — kein "To-do-Berg". ## Ausgabeformat Jede Karte nennt konkrete Kennzahl, Vergleichszeitraum, Grund — z. B. *"CPC seit zwei Tagen um 22 % gefallen; Conversion-Rate unverändert"*. Keine Karte ohne konkrete Zahl, kein "im Auge behalten" ohne Schwellenwert/Datum. ## Persistenz - Jede erzeugte Empfehlung wird als eigene Zeile in der Empfehlungstabelle gespeichert: Client, `platform: google_ads`, optionale lokale Kampagnen-ID, auslösender Sync-Lauf, Skill-Version, Priorität, strukturierte Evidenz (welche Regel, welche Werte), Begründungstext, Status (offen/bearbeitet/verworfen) - **Keine Mutation.** Eine Empfehlung kann höchstens einen Link zu einem passenden Skill öffnen (z. B. "Budget anpassen" → Change-Request-Formular vorausgefüllt, oder "Negative Keywords prüfen" → keyword-cluster-negative-analyzer) - Kampagnenregeln laufen nach erfolgreichen Syncs. Account Health läuft auch nach fehlgeschlagenen Syncs und prüft im geschützten Tageslauf zusätzlich getrennte/veraltete Konten. ## Technische Ausführungsroute 1. Der erfolgreiche Google-Ads-Sync schreibt zuerst ausschließlich in die lokalen Ressourcen- und `analytics.daily_*`-Tabellen und beendet den zugehörigen `google_ads_sync_run`. 2. Ein serverseitiger Post-Sync-Handler startet `daily_check_google_ads` mit `ad_account_id`, `sync_run_id` und Skill-Version. Er liest ausschließlich lokale Tageswerte und den aktuellen Kampagnenbestand. 3. Deterministischer Code berechnet Kandidaten und Evidenz. Die erste Version verwendet bewusst keinen Provider- oder LLM-Call; ein späteres LLM darf nur die bereits berechneten Evidenzen formulieren, niemals erkennen oder mutieren. 4. Der Handler löst vorherige offene Daily-Check-Empfehlungen dieses Kontos auf und schreibt danach maximal fünf aktuelle Zeilen in `campaign_recommendation` (lokale Kampagnen-ID, Plattform, Priorität, Evidenz, Begründung, Status `open`, `sync_run_id`, Skill-Version). Die Übersicht liest genau diese Zeilen. 5. `account_health_google_ads` liest anschließend Konto-, Lauf-, Conversion- und Frischezustand. Vorherige offene Account-Health-Zeilen werden aufgelöst; höchstens eine aktuelle Kontokarte ohne Kampagnen-ID wird gespeichert. 6. Nach einem fehlgeschlagenen Providerlauf wird ausschließlich Account Health erneut ausgewertet. Der geschützte Tagesendpunkt prüft zusätzlich Konten, die wegen fehlender Verbindung oder fehlendem Provider nicht importiert wurden. 7. Die Übersicht darf denselben reinen Analyzer lesend als Frische-Fallback ausführen, wenn für ein Konto noch keine persistierte offene Health-Zeile existiert. Persistierte und live berechnete Kontowarnungen dürfen nie doppelt erscheinen. 8. Ein Klick öffnet bei einer Kampagnenempfehlung die Kampagnenakte und bei einer Kontowarnung den betroffenen Golfclub. Änderungen bleiben Change Requests bzw. bewusste Verbindungsaktionen. Der produktive Synter-Sync lädt Kampagnen- und Keyword-Impression-Share sowie Search-Suchanfragen für die letzten 30 Tage. `search_budget_lost_impression_share` ist auf Kampagnenebene verfügbar; die Google-Ads-Abfrage weist dieses Feld auf `keyword_view` zurück, weshalb es dort bewusst `NULL` bleibt. `search_term_view` unterstützt keinen Search-Impression-Share und wird ebenfalls nicht mit einem fremden Wert angereichert. PMax-Suchanfragen benötigen `campaign_search_term_view` und werden erst nach einer eigenen lokalen Modellierung ergänzt. ## Isolierte Simulation - Die Dashboard-Demo verwendet 20 Kampagnen aus zehn Golfclubs, acht Tageswerte je Kampagne, Search-Impression-Share, 30-Tage-Suchanfragen und rotierende Account-Health-Szenarien. - „Tageswechsel simulieren“ erzeugt einen neuen, versionierten Snapshot und lässt exakt dieselbe deterministische Analyse wie der Produktivlauf darüber laufen. - Eingabe und Ergebnis werden in `daily_check_simulation_run` gespeichert. Diese Tabelle ist strikt von echten Google-Ads-Ressourcen und Analytics-Tabellen getrennt. - Die Simulation ruft weder Syntermedia noch Google Ads noch ein LLM auf und kann deshalb keine echte Kampagne oder Auswertung verändern. ## Guardrails - Niemals "im Auge behalten" ohne konkreten Schwellenwert oder Datum ausgeben - Niemals eine Diagnose ohne zitierte Zahl liefern - Niemals PMax-ROAS ungeprüft loben, ohne die Brand-Kannibalisierungs-Prüfung durchlaufen zu haben - Bei <30 Conversions/Woche: Befund explizit als "richtungsweisend" kennzeichnen, keine harten CPA-Aussagen treffen - Fehlende Conversions niemals allein als Trackingfehler bezeichnen; immer Auslieferung und Nachfrage als Alternativen nennen - Fehlerdetails vor Anzeige und Evidenz von Tokens/API-Keys bereinigen - Maximal 5 Empfehlungen pro Club und Tag — Überschuss nach Priorität abschneiden, nicht alles ausgeben
