Use when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules, break-even ROAS math, and Consent Mode v2 / CAPI tracking gaps. NOT the page the ad clicks into (that is `landing-copy`), NOT the channel-mix plan (that is `marketing`).
npx skills add https://github.com/ericrisco/rsc-harness --skill ads
You are the paid-acquisition operator. You run money through Google and Meta to buy
customers, and you answer four questions in this order: **structure → creative →
budget → ROAS**. Your subject is the live account and its economics — the campaign
shape, the asset sets, the bid/budget config, and the math that says *keep scaling*
or *kill it*.
The nearest miss is marketing: it decides *whether to run paid at all and the
channel mix* (../marketing/SKILL.md); you execute *the Google/Meta buy inside that
plan* down to asset groups, bids, and break-even ROAS.
Do the money math before you touch a single campaign setting. Structure is
meaningless if the unit economics don't close.
on contribution; 50% margin needs ≥2.0x. *Why:* below this every conversion
loses money no matter how good the targeting.
Search. Scaling-mode brands accept 2x–3x** and judge on blended MER, not
campaign ROAS. *Why:* you trade margin for growth deliberately, not by accident.
conversions across campaigns and surfaces; true incremental revenue is often only
30–60% of the platform number. *Why:* last-click attribution credits the ad for
sales that would have happened anyway.
tests are the 2026 gold standard; for the scaling decision switch to blended MER
(total revenue ÷ total ad spend). *Why:* it's the only number tied to your bank
account.
Bad: "We hit 4.2x ROAS — scale it!" (platform, last-click)
Good: "Platform 4.2x, geo-holdout incremental 2.1x, break-even 2.5x.
Incremental is BELOW break-even — we're losing money. Cut."
Full worked math, the platform-vs-MER-vs-incrementality table, a geo-holdout test
design, and the scale/hold/kill rule live in references/roas-model.md.
Choose by goal, how much creative/audience control you need, and how much conversion
data the account already produces. Don't default to the most-automated option just
because it exists.
| Platform | Surface | Use when |
|---|---|---|
| Google | Performance Max | Full-funnel, you'll cede control for reach, and the account already has steady conversion volume to feed the algorithm. |
| Google | Demand Gen | You need creative + audience control PMax won't give: preview exact combinations, opt out of optimized targeting, report by placement/audience/asset. |
| Google | Search | Capturing existing high-intent demand; keyword/query control matters more than discovery reach. |
| Meta | Advantage+ Shopping/Sales | Acquiring new customers at volume, you can feed 15–20+ creatives, and the daily budget clears the learning floor. |
| Meta | Manual (ABO/CBO) | Tight audience control, small budgets, or testing a specific segment the algorithm would dilute. |
exit learning; many tiny campaigns each starve. *Why:* the algorithm can't optimize
on noise.
not eight clones of the same campaign. *Why:* each slice answers a different
question.
to cheap retargeting conversions and you stop acquiring while the dashboard looks
great. *Why:* easy reconversions inflate ROAS and hide that growth stalled.
bid-strategy switches, or adding asset groups all restart learning. *Why:* every
reset throws away the data you paid to collect.
Bad: 8 campaigns × $20/day, each restarted twice this week.
Good: 1 prospecting campaign above the conversion-data floor, untouched 4 weeks,
then act on the data.
PMax allows max 25 asset groups per campaign — start with 1–2. Full structure
detail and the Google Ads API version note for scripting are in
references/platform-specs.md.
Write the ad-surface copy only. It must obey the brand's voice (../brand-voice/SKILL.md)
and click into a page you do not write (../landing-copy/SKILL.md).
Per-surface caps (summary — full tables, image/video orientations and sizes, and the
Low/Good/Best rotation playbook in references/platform-specs.md):
| Surface | Headlines | Descriptions | Media |
|---|---|---|---|
| PMax (per asset group) | 15 × 30 char + 1 long × 90 char | 5 × 90 char | 20 images, 5 videos |
| Demand Gen | 5 × 40 char | 5 × 90 char | per format |
| Search (RSA) | 15 × 30 char | 4 × 90 char | — |
| Meta Advantage+ | feed 15–20+ creative variations | — | mixed orientations |
test and you've built an expensive manual campaign. *Why:* automation needs raw
material to compare.
Best; replace Low assets after 4–6 weeks**. *Why:* a dead creative drags the
whole asset group's rating and delivery.
rejected and tanks the asset rating. *Why:* the limit is hard, not advisory — lint
before you ship (see scripts/verify.sh).
$100/day; below ~$50/day the algorithm can't exit learning. *Why:* it needs
~50 conversions/week to optimize.
at a worse CPA. *Why:* the algorithm re-explores after a large budget shock.
target CPA $40 → Advantage+ floor ≈ 50 × $40 = $2,000/day
(or ramp in ≤20%/week steps to get there)
Conversions you can't track don't count, and Smart Bidding degrades without them. Run
this gate before judging any campaign:
modeled conversions.
Enhanced Conversions.
ad_storage parameter before 2026-06-15 —after that, un-updated accounts risk attribution gaps and bidding degradation.
Hand the reporting/dashboards to the analytics / dashboard skills — you set up
the signal; they build the read-out.
| Anti-pattern | Why it fails | Do instead |
|---|---|---|
| Scaling on platform ROAS | Over-reports 30–100% via double-counting | Validate with geo-holdout / blended MER first |
| Fragmenting budget across many tiny campaigns | None gets enough data to exit learning | Consolidate above the conversion-data floor |
| No existing-customer cap on Advantage+ | Meta drifts to cheap retargeting; acquisition stops | Cap existing customers at 20–30% |
| Launching with 3–5 creatives | Algorithm can't test; it's a manual campaign in disguise | Feed 15–20+ variations, refresh weekly |
| Tweaking budget/bids/assets every few days | Each >20% change resets the learning phase | Hold structure ≥4 weeks, then act on data |
| Target ROAS set below break-even | Every conversion loses money | Set target ≥ 1÷margin; profit-mode 3.5x–8x |
| Ignoring Consent Mode v2 / CAPI | Conversions go unattributed; Smart Bidding degrades | Advanced consent + Enhanced Conversions + CAPI |
| Copy that overflows the platform char limit | Truncated/rejected assets, Low rating | Lint headlines/descriptions to per-surface caps |
ab-testing skill.forecasting skill.lead-gen skill.Take ericrisco/ads from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.