---
name: anomaly-triage
description: "Explain a sudden paid-media performance change before the team reacts. Use when a Google Ads or Meta metric jumps or falls and the user wants to know whether it is a real campaign change, normal attribution delay, or a tracking problem."
license: MIT
compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer."
metadata:
  author: "Adspirer"
  version: "1.0.0"
  adspirer_category: "analytics-reporting"
  adspirer_source: "https://www.adspirer.com/skills/anomaly-triage"
  adspirer_connection_url: "https://adspirer.ai/sign-up"
  adspirer_primary_keyword: "marketing anomaly detection"
  adspirer_secondary_keywords: "ad performance anomaly, campaign anomaly detection"
  adspirer_launch_wave: "1"
  adspirer_kind: "skill"
  adspirer_level: "operator"
  adspirer_platforms: "google,meta"
  adspirer_supported_clients: "claude,claude-code,chatgpt,codex,cursor,gemini,windsurf"
  adspirer_summary: "Follow the clues behind a sudden campaign change, explain what is happening in plain language, and route the next step to the right person."
  adspirer_connections_required: "adspirer"
  adspirer_connections_optional: "ga4,slack"
---

# Anomaly Triage

## Use this when

Imagine a PMax or Meta campaign that has been running steadily for 30 days. This morning, conversions are down 40% while spend looks almost unchanged. The account manager wants an answer, the client is asking questions, and someone is already suggesting a budget cut.

Use this skill before the team reacts. It follows the story behind a sudden move in spend, conversions, CPA, ROAS, CTR, or conversion rate and works out whether:

- the latest results are still filling in;
- tracking may have broken;
- a campaign edit or delivery issue changed performance;
- the market genuinely moved; or
- the result is still too uncertain to call.

This is for a specific Google Ads or Meta performance question. It is not a scheduled daily report.

## What you need

- Adspirer connected to the Google Ads or Meta account in question.
- The campaign or account name, the metric that moved, and the day or date range when the team noticed it.
- At least 30 days of earlier performance when available, so the skill can compare like with like.
- Optional GA4 access for an independent check after the ad click.
- Optional Slack access if the user wants the final update shared with a team channel.

## Procedure

1. **Set the scene.** Confirm the campaign, metric, dates, business context, and comparison the user actually cares about. Compare weekdays with similar weekdays when seasonality matters, and do not treat a partial day as a complete one.
2. **Read the campaign story.** Connect Adspirer, pull the affected results plus a useful earlier window, and show the simple pattern across spend, clicks, conversions, and efficiency. If the movement fits the account’s normal day-to-day range, explain that and stop.
3. **Work through the likely explanations in order.** First allow for recent conversion and attribution data that may still be arriving. Then look for tracking warnings, campaign edits, learning or delivery changes, disapprovals, billing issues, and market shifts. If GA4 is connected, compare the same dates there and name any difference between platform and analytics reporting.
4. **Explain what the clues mean.** Tell the user the most likely story in plain language, show the two or three facts that support it, and be open about what is still unknown. Do not force a single cause when the evidence is mixed.
5. **Route the next step.** If it is a supported ad or campaign change, prepare the change for a separate explicit approval before Adspirer applies it. If it needs GTM, a GA4 tag, a pixel, enhanced conversions, billing, an appeal, or a new creative asset, do not claim to fix it here—write a clear handoff for the developer, account owner, or creative connector. Post the update to Slack only when the user asks and Slack is connected.

## Fixed checks

- Pull the numbers again from the named account and exact dates; do not rely only on a screenshot or someone saying “it dropped.”
- Keep the currency, timezone, attribution window, and comparison period consistent.
- Check live platform status before claiming there was a tracking, edit, policy, learning, delivery, or billing issue.
- Label recent conversion data as provisional when it may still change.
- When GA4 is used, compare the same dates and explain that the two systems may attribute conversions differently.

## Stop conditions

- **Success:** the user receives a clear explanation, supporting evidence, confidence level, and next owner.
- **No change needed:** the movement is normal variation or recent data is still filling in.
- **Blocked:** Adspirer cannot access the named account or the campaign and dates are not identifiable.
- **Needs approval:** a budget, bid, targeting, status, publishing, or messaging change is ready but not authorized.
- **Needs a handoff:** tracking code, GTM, GA4, a pixel, billing, an appeal, or asset production must be handled by the appropriate person or connector.
- **Still uncertain:** explain what was ruled out and what evidence would settle the question.

## Approval boundaries

This skill begins read-only. It can prepare a supported campaign or ad change for Adspirer, but a separate explicit approval is required before that change is applied. It cannot silently repair GTM, GA4 tags, pixels, enhanced conversions, billing, policy appeals, or image assets. It can explain the problem and draft the exact handoff the responsible person needs. Sending a Slack update also requires the user to ask for it.

## What you get

A short, calm account of what changed and why the evidence points there. It includes the comparison used, the facts that matter, what is still uncertain, and who should take the next step. If the likely problem sits in tracking, the skill writes a developer-ready note—for example, asking them to inspect a broken tag or enable enhanced conversions—instead of pretending it made a code change. If Slack is connected and the user asks, the same plain-language update can be shared with the team.
