Ad Account Auditor
Audit one paid-media account or portfolio for incremental contribution and operating quality under declared constraints. Platform-reported ROAS is one input, never the objective or truth set by itself.
When This Must Trigger
- Before launching, materially increasing spend, or changing a risky bid/targeting strategy.
- When tracking, attribution inflation, unsafe placements, claims, or wasted spend are in doubt.
- When the user requests a ROAS/RQS account audit from their exports.
Quick Start
Audit this USD account for direct response using 7-day click, 3-day lag, and $120 CAC ceiling.
Run the incremental-profit profile against the holdout and order-ID exports.
Skill Contract
Reads: one normalized account/portfolio evidence set. Writes: only a permissioned v3 artifact. Done when: required context and all 20 states are explicit, vetoes use verified evidence, and scorer output is reported without executing spend changes.
This skill judges. conversion-signal-qa, attribution-reconciler, campaign-architect, ad-creative-builder, and budget-pacing-monitor build/fix the inputs. Never enable campaigns, change bids, upload audiences, or scale budgets without separate explicit approval.
Data Sources
| Need |
Preferred evidence |
| Delivery/spend |
Campaign, query, placement, audience, and change-history exports |
| Outcome truth |
Deduplicated order/lead IDs from ecommerce, analytics, or CRM |
| Economics |
Currency, margin/contribution, CAC/payback constraint |
| Attribution |
Platform + own-data timestamps/IDs, normalized windows and lag |
| Safety/claims |
Placement report, rendered ad/landing, approved claim/disclosure state from offer-claims-registry (the paid claims SSOT) |
| Incrementality |
Holdout/geo split/causal test, otherwise explicitly labeled proxy |
Instructions
Runtime and Setup
Read ../../../references/auditor-runbook.md, scoring-semantics.md, roas-benchmark.md, and the ROAS catalog entry. Standalone installs use bundled immutable references/auditor-runtime.md; never fetch mutable main. Before deterministic calls, follow runtime-invocation.md, resolve AARON_SKILLS_ROOT="${CLAUDE_PLUGIN_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || true)}", and require the scorer, validator, and typed catalogs. If unavailable, return score_state: NOT_SCORED / score_confidence: not_scored with no gate verdict or persistent artifact.
Declare profile (direct-response|prospecting|incremental-profit), target, currency, attribution window, conversion lag, business constraint, goal, and observation date. If any required context is missing, return NEEDS_INPUT/UNDECIDED.
Evidence and Scoring
- Normalize currency, windows, IDs, lag, and portfolio scope before comparing metrics.
- Score all 20
R1..S5 criteria from the benchmark with source/date/type/confidence.
- Use Unknown for missing own-data truth, placement exports, or reconciliation. No data is not a veto and cannot be N/A merely because access is inconvenient.
- Verify vetoes:
ROAS-R1: instrumentation demonstrably fails the named own-data truth set.
ROAS-R2: material double-counting/inflation is demonstrated.
ROAS-O1: material claim/disclosure failure against the offer-claims-registry approved state.
ROAS-O2: applicable platform/restricted-category violation.
ROAS-A1: placement evidence demonstrates a material safety breach.
- Run the typed scorer. Report estimated/proxy incrementality as such; do not call platform attribution causal.
§2 ROAS Worked Examples
- Complete direct-response profile, raw 78, no veto/fail:
DONE/SHIP, final 78.
- Complete profile, raw 78, one verified R1 failure:
DONE_WITH_CONCERNS/FIX, final 59.
- Complete profile, verified R1 and R2 failures:
DONE/BLOCK, raw retained, no final score.
- Missing placement report: A1 Unknown,
NEEDS_INPUT/UNDECIDED, no overall score.
§3 ROAS Guardrails
- High reported ROAS can reflect under-spend, branded-demand capture, or attribution inflation.
- Learning-phase disruption is an S2 finding, not an automatic veto.
- ATT/modeled data may reduce confidence; it does not automatically fail R1.
- Frequency, creative fatigue, and audience saturation require separate evidence.
- Never compare cross-platform returns before normalizing currency/window/lag and deduplicating outcomes.
§5 ROAS Translation
Lead with business impact and evidence. On trace request, qualify ROAS-R1/R2/O1/O2/A1; do not expose bare IDs that collide with RAMP/ECHO/TALE.
Report and Verdict
Begin with the auditor-runbook's exact typed conversation header. Never replace status, verdict, or score_state with prose; list each explicitly missing qualified item as ``ID: `unknown``` before findings.
Show verdict, profile/context, score or coverage/interval, confidence, R/O/A/S detail, reconciliation table, verified critical controls, Unknown evidence, and prioritized fix/owner/rerun condition. The scorer owns status/verdict and the 59 ceiling.
Validation Checkpoints
- Scope/currency/window/lag/constraint/goal are explicit.
- Own-data outcome truth is separated from platform self-report.
- All 20 items have valid states and provenance; Unknown is not renormalized.
- Veto failures are positively verified.
- No spend/account mutation occurred without separate approval.
Persistence
Persist only after explicit authorization to memory/audits/ad/YYYY-MM-DD-<topic>.md. Assemble and validate the complete v3 draft with validate-audit-artifact.py against that intended --relative-path, persist only through one full-content Write, then revalidate the target as required by the auditor runbook. Edit/shell/MCP mutations of the reserved sink are unsupported. Do not autonomously write hot cache, claims, candidates, or account state.
Reference Materials
Next Best Skill
1---
2name: ad-account-auditor
3slug: aaron-ad-account-auditor
4displayName: "Ad Account Auditor · 付费广告账户审计"
5summary: "付费广告账户审计/ROAS评分"
6description: 'Use when auditing a paid ad account for incremental contribution, wasted spend, or measurement integrity before scaling; runs a typed 20-item ROAS profile with verified vetoes and a SHIP/FIX/BLOCK/UNDECIDED gate on own exported data. Not for campaign structure design — use campaign-architect; not for creative production — use ad-creative-builder. 付费广告账户审计/ROAS评分'
7version: "19.0.0"
8license: Apache-2.0
9compatibility: "Claude Code and compatible agent-skill hosts"
10homepage: "https://github.com/aaron-he-zhu/aaron-marketing-skills"
11when_to_use: "Use when checking whether a paid account or portfolio is safe to launch or scale. Requires normalized own-data outcomes, attribution windows, currency, conversion lag, and business constraints."
12argument-hint: "<campaign + outcome exports> <currency/window/lag> [profile]"
13allowed-tools: WebFetch
14class: auditor
15metadata: {"author": "aaron-he-zhu", "version": "19.0.0", "discipline": "ad", "phase": "activate", "geo-relevance": "medium", "hermes": {"tags": ["marketing", "ad", "activate"], "category": "ad"}, "openclaw": {"emoji": "🎯", "homepage": "https://github.com/aaron-he-zhu/aaron-marketing-skills"}}
16---
17
18# Ad Account Auditor
19
20Audit one paid-media account or portfolio for incremental contribution and operating quality under declared constraints. Platform-reported ROAS is one input, never the objective or truth set by itself.
21
22## When This Must Trigger
23
24- Before launching, materially increasing spend, or changing a risky bid/targeting strategy.
25- When tracking, attribution inflation, unsafe placements, claims, or wasted spend are in doubt.
26- When the user requests a ROAS/RQS account audit from their exports.
27
28## Quick Start
29
30```text
31Audit this USD account for direct response using 7-day click, 3-day lag, and $120 CAC ceiling.
32Run the incremental-profit profile against the holdout and order-ID exports.
33```
34
35## Skill Contract
36
37**Reads:** one normalized account/portfolio evidence set. **Writes:** only a permissioned v3 artifact. **Done when:** required context and all 20 states are explicit, vetoes use verified evidence, and scorer output is reported without executing spend changes.
38
39This skill judges. `conversion-signal-qa`, `attribution-reconciler`, `campaign-architect`, `ad-creative-builder`, and `budget-pacing-monitor` build/fix the inputs. Never enable campaigns, change bids, upload audiences, or scale budgets without separate explicit approval.
40
41## Data Sources
42
43| Need | Preferred evidence |
44|---|---|
45| Delivery/spend | Campaign, query, placement, audience, and change-history exports |
46| Outcome truth | Deduplicated order/lead IDs from ecommerce, analytics, or CRM |
47| Economics | Currency, margin/contribution, CAC/payback constraint |
48| Attribution | Platform + own-data timestamps/IDs, normalized windows and lag |
49| Safety/claims | Placement report, rendered ad/landing, approved claim/disclosure state from [offer-claims-registry](../../../protocol/offer-claims-registry/SKILL.md) (the paid claims SSOT) |
50| Incrementality | Holdout/geo split/causal test, otherwise explicitly labeled proxy |
51
52## Instructions
53
54### Runtime and Setup
55
56Read `../../../references/auditor-runbook.md`, `scoring-semantics.md`, `roas-benchmark.md`, and the ROAS catalog entry. Standalone installs use bundled immutable `references/auditor-runtime.md`; never fetch mutable `main`. Before deterministic calls, follow [`runtime-invocation.md`](../../../references/runtime-invocation.md), resolve `AARON_SKILLS_ROOT="${CLAUDE_PLUGIN_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || true)}"`, and require the scorer, validator, and typed catalogs. If unavailable, return `score_state: NOT_SCORED` / `score_confidence: not_scored` with no gate verdict or persistent artifact.
57
58Declare profile (`direct-response|prospecting|incremental-profit`), target, currency, attribution window, conversion lag, business constraint, goal, and observation date. If any required context is missing, return `NEEDS_INPUT/UNDECIDED`.
59
60### Evidence and Scoring
61
621. Normalize currency, windows, IDs, lag, and portfolio scope before comparing metrics.
632. Score all 20 `R1..S5` criteria from the benchmark with source/date/type/confidence.
643. Use Unknown for missing own-data truth, placement exports, or reconciliation. No data is not a veto and cannot be N/A merely because access is inconvenient.
654. Verify vetoes:
66 - `ROAS-R1`: instrumentation demonstrably fails the named own-data truth set.
67 - `ROAS-R2`: material double-counting/inflation is demonstrated.
68 - `ROAS-O1`: material claim/disclosure failure against the `offer-claims-registry` approved state.
69 - `ROAS-O2`: applicable platform/restricted-category violation.
70 - `ROAS-A1`: placement evidence demonstrates a material safety breach.
715. Run the typed scorer. Report estimated/proxy incrementality as such; do not call platform attribution causal.
72
73## §2 ROAS Worked Examples
74
75- Complete direct-response profile, raw 78, no veto/fail: `DONE/SHIP`, final 78.
76- Complete profile, raw 78, one verified R1 failure: `DONE_WITH_CONCERNS/FIX`, final 59.
77- Complete profile, verified R1 and R2 failures: `DONE/BLOCK`, raw retained, no final score.
78- Missing placement report: A1 Unknown, `NEEDS_INPUT/UNDECIDED`, no overall score.
79
80## §3 ROAS Guardrails
81
82- High reported ROAS can reflect under-spend, branded-demand capture, or attribution inflation.
83- Learning-phase disruption is an S2 finding, not an automatic veto.
84- ATT/modeled data may reduce confidence; it does not automatically fail R1.
85- Frequency, creative fatigue, and audience saturation require separate evidence.
86- Never compare cross-platform returns before normalizing currency/window/lag and deduplicating outcomes.
87
88## §5 ROAS Translation
89
90Lead with business impact and evidence. On trace request, qualify `ROAS-R1/R2/O1/O2/A1`; do not expose bare IDs that collide with RAMP/ECHO/TALE.
91
92## Report and Verdict
93
94Begin with the auditor-runbook's exact typed conversation header. Never replace `status`, `verdict`, or `score_state` with prose; list each explicitly missing qualified item as ``ID: `unknown``` before findings.
95
96Show verdict, profile/context, score or coverage/interval, confidence, R/O/A/S detail, reconciliation table, verified critical controls, Unknown evidence, and prioritized fix/owner/rerun condition. The scorer owns status/verdict and the 59 ceiling.
97
98## Validation Checkpoints
99
100- Scope/currency/window/lag/constraint/goal are explicit.
101- Own-data outcome truth is separated from platform self-report.
102- All 20 items have valid states and provenance; Unknown is not renormalized.
103- Veto failures are positively verified.
104- No spend/account mutation occurred without separate approval.
105
106## Persistence
107
108Persist only after explicit authorization to `memory/audits/ad/YYYY-MM-DD-<topic>.md`. Assemble and validate the complete v3 draft with `validate-audit-artifact.py` against that intended `--relative-path`, persist only through one full-content Write, then revalidate the target as required by the auditor runbook. Edit/shell/MCP mutations of the reserved sink are unsupported. Do not autonomously write hot cache, claims, candidates, or account state.
109
110## Reference Materials
111
112- [ROAS benchmark](../../../references/roas-benchmark.md)
113- [Measurement protocol](../../../references/measurement-protocol.md)
114- [Auditor runbook](../../../references/auditor-runbook.md)
115- [Scoring semantics](../../../references/scoring-semantics.md)
116
117## Next Best Skill
118
119- **Tracking:** [conversion-signal-qa](../conversion-signal-qa/SKILL.md)
120- **Claims/disclosures:** [offer-claims-registry](../../../protocol/offer-claims-registry/SKILL.md) — the approved claim/disclosure state behind `ROAS-O1`
121- **Attribution:** [attribution-reconciler](../../scale/attribution-reconciler/SKILL.md)
122- **Structure/audience:** [campaign-architect](../../research/campaign-architect/SKILL.md)
123- **Pacing:** [budget-pacing-monitor](../../scale/budget-pacing-monitor/SKILL.md)