Meta Ads · Google Ads · TikTok Ads

Why Did It Move? Root-Cause Analysis

A metric jumped or dropped. Find when it started, which campaigns and segments carry it, and the most likely cause.

Connect RoASr

Recommendations only: the prompt never changes your ad accounts.

How to run it

Three steps, about a minute.

  1. Connect RoASr to Claude or ChatGPT

    Create an API key in RoASr and add the RoASr MCP server. Access is read-only: the prompt cannot change anything in your ad accounts.

  2. Paste the prompt

    Copy the text below into a new chat.

  3. Answer a few questions

    The prompt asks only what it cannot find itself, then reads your data and answers in a fixed format.

  4. Guides in the blog

What it asks

  • metric
  • client
  • comparison — two weeks against the two weeks before
  • dimension — placement

Data it reads

  • roasr_load_skill
  • roasr_limits
  • roasr_list_clients
  • roasr_list_accounts
  • roasr_metrics_summary
  • roasr_metrics_daily
  • roasr_metrics_campaigns
  • roasr_metrics_breakdown
  • roasr_metrics_actions
  • roasr_list_findings

Method

  • roasr_frame
  • root_cause
  • meta_analysis
Full prompt

The prompt

Before you start, ask me about each [input] below — one question at a time, with ready-made answers to pick from; skip whatever you can already tell.

Something shifted in [metric: the number that worried you and which way it went, for example "cost per lead is up" or "ROAS fell"] for [client: if not listed, call roasr_list_clients and let me pick]. Trace it back: the day it started, the campaigns and segments behind it, the most likely cause, and the next steps.

1. **Load the RoASr method.** Call roasr_load_skill('roasr_frame'), roasr_load_skill('root_cause') and roasr_load_skill('meta_analysis') and follow them exactly.
2. **Frame the data.** Call roasr_limits, roasr_list_clients and roasr_list_accounts: plan, niche, margin, KPI, account currencies, sync status and dataSince. Compare [comparison: two weeks against the two weeks before (default) | one week against the week before | 30 days against the previous 30 | custom]. If a window starts before dataSince, say so and narrow it. If currency.mixed is true, never sum money across accounts.
3. **Confirm the move.** roasr_metrics_summary for both windows. If the change is inside the noise floor from the skill, answer "normal fluctuation", show the numbers and stop.
4. **Find the inflection date.** roasr_metrics_daily over both windows: the first day the metric left its usual band and stayed out.
5. **Locate it.** roasr_metrics_campaigns (campaign level, then adset), then roasr_metrics_breakdown by [dimension: placement (default) | platform | country | device]. Report each entity's share of the move. Classify entities by configuration and data, not by their names. Under a campaign budget, ad set numbers show allocation, not ranking.
6. **Rule out tracking first.** roasr_metrics_actions for both windows: if conversions fell while clicks held, treat it as a probable tracking break before any performance explanation.
7. **Cross-check findings.** roasr_list_findings for this client: open findings that date to the inflection.
8. **Diagnose.** A cause is a candidate only if its timing fits the inflection date. Timing alone is correlation: name the mechanism, or label the cause "unconfirmed".

**Output:** open with one sentence — what moved, by how much, since when, the most likely cause and your confidence (high / medium / low). Then a table: entity · before · after · change · share of the move. Then 3–5 actions grouped High / Medium / Nice-to-have, each with the expected effect.

**Output rules:**
- Recommendations only — never apply changes; RoASr tools are read-only.
- reach and frequency are not additive across days; conversion buckets are not additive.
- If the client has no margin set, talk ROAS and CPA, not profit.
- "Normal fluctuation" is a valid answer; never invent a cause to fill the report.
- Answer in the language of this prompt.