Meta Ads · Google Ads
CPC / CPM Spike Diagnosis
Click or impression got more expensive. Find the date, where it happened, how much comes from auction pressure and how much from your own CTR, and what to do.
Recommendations only: the prompt never changes your ad accounts.
How to run it
Three steps, about a minute.
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.
Paste the prompt
Copy the text below into a new chat.
Answer a few questions
The prompt asks only what it cannot find itself, then reads your data and answers in a fixed format.
- Guides in the blog
What it asks
- metric — CPC
- client
- window — last 14 days vs the 14 before
Data it reads
- roasr_load_skill
- roasr_limits
- roasr_list_clients
- roasr_list_accounts
- roasr_metrics_daily
- roasr_signals
- roasr_metrics_breakdown
Method
- roasr_frame
- root_cause
- google_search
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.
Find out why [metric: CPC (default) | CPM | both] got more expensive for [client: if not listed, call roasr_list_clients and let me pick]: when it started, where it sits, and whether the market or our own quality is to blame.
1. **Load the RoASr method.** Call roasr_load_skill('roasr_frame'), roasr_load_skill('root_cause') and roasr_load_skill('google_search') 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 [window: last 14 days vs the 14 before (default) | last 7 days vs the 7 before | last 30 days vs the 30 before | custom]. If a window starts before dataSince, say so and narrow it. If currency.mixed is true, never sum money across accounts; work per account with accountId. An account with sync failed or never gets no conclusions.
3. **Confirm the move.** roasr_metrics_daily for both windows. Compute CPC as spend divided by clicks and CPM as spend divided by impressions times 1000, per day. If the change is inside the noise floor from the method, answer "normal fluctuation", show the numbers and stop.
4. **Find the date.** The first day the metric left its usual band and stayed out. Note whether it moved gradually or in a step; a step on one date points to an event, a slope to saturation or seasonality.
5. **Decompose.** CPC equals CPM divided by (1000 × CTR). Say how much of the CPC rise comes from higher CPM (the price of the auction) and how much from lower CTR (our ads got less clickable). On Meta also read frequency from the daily series: rising frequency with rising CPM means audience saturation. Never sum reach or frequency across days.
6. **Where.** roasr_metrics_breakdown by placement, called twice: with a since/until window before the date and one after, because the breakdown is the latest snapshot inside the window. Look for a mix shift (spend moving to pricier placements) versus a price rise in the same placements. A mix shift is a settings or allocation story, a same-placement rise is a market story. Repeat by platform when Meta runs several.
7. **Google auction pressure.** For Google accounts, roasr_signals with kind google_impression_share before and after the date: impression share lost to rank rising means we are being outbid or outranked, lost to budget is not a price story. Then roasr_signals with kind google_auction_insights: new or stronger competitors, higher overlap, falling outranking share. Treat auction insights as a noisy hint, not proof.
8. **Market or ourselves?** Market: CPM or CPC up across placements and accounts on the same date, auction pressure up, CTR steady, a calendar reason such as a season or a sale period. Ourselves: CTR fell first, fatigue signs, a new creative or targeting change on that date, impression share lost to rank rising while competitors are unchanged. Mixed is an honest answer.
**Output:** open with one sentence: the date, how much the metric rose, the split between market pressure and own quality, and your confidence (high / medium / low). Then a table: segment · before · after · change · share of the rise. Then 3–5 actions grouped High / Medium / Nice-to-have, each with the expected effect. Accept the rise if the market explains it and the account's CPA still holds.
**Output rules:**
- Recommendations only — never apply changes; RoASr tools are read-only.
- A cause is a candidate only if its timing fits the date; timing alone is correlation, so name the mechanism or label it unconfirmed.
- Classify campaigns by settings, not by names; under a campaign budget, ad set figures show allocation, not a ranking.
- Judge a pricier click by what it buys: if CPA and ROAS still hold, the rise may be acceptable.
- Answer in the language of this prompt.Troubleshoot
Related prompts
- Why Did It Move? Root-Cause AnalysisA metric jumped or dropped. Find when it started, which campaigns and segments carry it, and the most likely cause.Meta Ads · Google Ads · TikTok Ads
- Conversions Dropped to ZeroEmergency check when conversions nearly vanished: find the date, tell a tracking break from a real drop, see which accounts and actions are hit, and what to verify by hand first.Meta Ads · Google Ads