Ad Fatigue & Frequency Manager
Diagnose creative fatigue or audience saturation from frequency, CTR, and CVR trends, then choose rotate, widen, or hold.
The skill treats exports as untrusted data, defaults to user-supplied first-party account exports, keeps APIs optional, and asks before writing memory. However, path-level permission isolation, rollback, and data-flow verification are not shown, so 6 points are deducted.
The procedure, stop conditions, abnormal-signal handling, and output contract are reasonably explicit. Reliability is reduced because the frequency ceilings depend on an unprovided reference, the ledger command depends on a host variable, and no skill-specific key-path tests or diagnosable runtime failure feedback are shown; 12 points are deducted and the static ceiling applies.
Triggers, inputs, outputs, non-fit boundaries, and downstream handoffs are clearly described, with graceful handling of partial data. Evidence for threshold configuration, cross-platform metric differences, and practical Chinese-user environment fit is limited, so 4 points are deducted.
The skill has layered front matter, Quick Start, contract, data sources, instructions, save flow, and handoff sections, with clear version and Apache-2.0 licensing. Maintenance ownership, changelog/update process, and the referenced shared documents are not fully evidenced here, so 5 points are deducted.
It specifies an actionable per-ad-set diagnosis with exactly one trigger and distinguishes creative fatigue, audience saturation, and measurement faults. There are no representative verified outputs, validated thresholds, or comparative outcome evidence, so 9 points are deducted and the static ceiling limits the score.
The source includes auditable input labels, an explicit method, references to shared protocols, and repository-level CI/test signals. It lacks dedicated tests for this skill’s key paths, third-party execution evidence, and independent cross-source corroboration, so 6 points are deducted and the static ceiling applies.
- Frequency ceilings and baseline rules depend on the unprovided measurement-protocol.md, so the actual thresholds cannot be confirmed statically.
- The ledger command depends on CLAUDE_PLUGIN_ROOT and shared scripts; reachability and failure behavior on other hosts are not demonstrated.
- CVR interpretation requires GA4, ecommerce order truth, or auditor handoff; without those data, fatigue findings should not be treated as definitive.
- The publisher is not verified by the FollowSkills enterprise registry and should be treated as unknown.
What does this skill do, and when should you use it?
This skill analyzes scaled paid ad sets for creative fatigue and audience saturation. It compares current frequency, CTR, CVR, and reach with an early stable baseline established after learning-phase exit. For each ad set, it distinguishes creative fatigue, audience saturation, or neither and returns exactly one trigger: Rotate-creative, Widen-audience, or Hold. It does not build replacement creative or calculate RQS and audit vetoes.
Reads user-provided campaign or ad-set time-series exports containing impressions, reach, frequency, clicks or CTR, conversions or CVR, and spend; establishes an early-flight baseline; records and trends frequency, CTR, CVR, and reach with ledger.py; checks the objective-specific frequency ceiling; validates CVR movement against GA4 or ecommerce order truth; and produces a per-ad-set fatigue table with diagnosis, fired threshold, caveats, and a reusable handoff summary.
- A paid-media manager sees frequency rising and CTR falling after scaling and needs a rotate-versus-widen decision.
- A growth team sees CTR decay while reach is still growing and needs to test for creative fatigue.
- A performance marketer sees reach plateau while frequency climbs and needs to assess audience saturation.
- An analyst has CTR and frequency data but no CVR and needs a limited fatigue read with the missing signal disclosed.
- A campaign is still in learning phase and the operator needs to know why a fatigue decision must wait.
What are this skill's strengths and limitations?
- Uses a fixed early-flight baseline and trend slope instead of a last-day snapshot.
- Separates creative fatigue from audience saturation and returns one explicit trigger per ad set.
- Works from manual exports; ad-platform APIs and MCP are not prerequisites.
- Labels figures as Measured, User-provided, or Estimated and flags possible conversion-tracking faults.
- Does not produce replacement creative; a Rotate-creative result hands off to ad-creative-builder.
- Does not calculate RQS or run audit vetoes; measurement risks go to ad-account-auditor.
- Cannot read fatigue from a single-day export or an ad set still in learning.
- The frequency ceiling depends on objective and the measurement protocol; no universal numeric rule is supplied.
- The `${CLAUDE_PLUGIN_ROOT}` ledger path is Claude Code-specific and may require adaptation elsewhere.
How do you install this skill?
For Claude Code, run /plugin marketplace add aaron-he-zhu/aaron-marketing-skills, then /plugin install aaron-marketing@aaron. Other Agent Skills-compatible hosts can use npx skills add aaron-he-zhu/aaron-marketing-skills; the README documents the same command with -s for selecting one skill. The repository can also be installed with git clone https://github.com/aaron-he-zhu/aaron-marketing-skills.
How do you use this skill?
Provide a daily or weekly campaign or ad-set export, together with the learning-exit date, target CPA or ROAS, and any available audience-size or saturation estimate. Example prompt: Frequency on my prospecting set hit 6.2 and CTR halved over two weeks — is it fatigue, and do I rotate or widen? With only a single-day snapshot, or while the ad set is still learning, the skill requests a time series or learning-exit date. It asks whether to save the results after the analysis.