Rank competitors' ads from the Meta Ad Library and Google Ads Transparency Center without spend data: a Winner Score over longevity, variants, geographic spread, velocity and recency, plus the lineage grouping that makes longevity honest.
npx skills add Hiberius/competitor-ad-intelligence
Works with Claude Code, Claude Desktop, Codex, Cursor, Windsurf, OpenClaw and
anything else that reads a SKILL.md.
Not the Meta Ad Library, not the Google Ads Transparency Center, not the paid tools. Nobody publishes what a competitor spent on a creative, so every figure in every competitor-intelligence product is a model output presented as a measurement.
So stop trying to measure spend and score what is actually observable, and what a losing ad cannot fake for long:
score = 0.35·longevity + 0.25·variants + 0.20·geo + 0.10·velocity + 0.10·recency
Nobody keeps paying for an ad that loses money, and nobody produces twelve versions of a loser. Those two facts carry 60% of the weight.
| Command | What you get |
|---|---|
lineage |
Groups re-uploads of the same concept by advertiser and text similarity, so longevity means something |
score |
The Winner Score, the five signal values behind it, and a stage: battle-tested, gaining traction, new test |
gaps |
Angles working for competitors and absent from your own account |
python3 scripts/adscore.py lineage creatives.csv --out grouped.csv9 creatives -> 7 lineages (2 re-uploads collapsed)
Longevity measured before this step would have understated the survivors.
Before grouping, the top creative in the sample corpus scores 78.1. After grouping, a different advertiser takes the top spot at 84.4, because their three "separate" ads were one concept that had been running for 99 days. An advertiser who rotates creatives on a schedule looks like someone running short tests, and is not.
python3 scripts/adscore.py score grouped.csv --top 5SCORE ADVERTISER HEADLINE DAYS VAR GEO STAGE
84.4 SolarFast Pannelli solari a costo zero 99 3 5 battle-tested
78.1 CasaVerde Come funziona davvero il fotovoltaico 183 1 6 battle-tested
46.3 VecchioSole Preventivo gratis 88 1 1 battle-tested
38.9 SolarFast Ultimi giorni per l incentivo 20 1 2 gaining traction
31.1 EnergiaPlus Hai gia controllato la tua bolletta? 11 1 1 new test
python3 scripts/adscore.py gaps competitors.csv --mine mine.csvANGLE THEIRS SHARE OURS SHARE GAP
how-to 1 33% 0 0% +33%
offer 2 67% 2 67% +0%
urgency 0 0% 1 33% -33%
Working for them, absent from your account: how-to
Not "here are their ads". "Here is the thing you are not testing."
The corpus is the asset. Mark disappeared ads as ended, never delete them: deleting destroys the longevity series, which is 35% of the score. Store the creative file, not the URL, because ad image URLs expire and a library of dead links is a library of nothing.
No scraping code ships here. Use each platform's official API where one exists and its public interface where one does not, and read the terms of service first. This skill is about what to do with a corpus once you have one.
SKILL.md— the skill itself, what the agent readsreferences/winner-score.md— every signal, its weight, its saturation point, the stage thresholds, how to retunereferences/sources-and-limits.md— the four public ad libraries, what each gives you, and the five things none of them will
- cpa-profit-ops — what to do with the budget once you know what to test
- incrementality-testing — how to find out whether the new angle actually worked
- ad-comment-moderation — the competitors who show up in your own comments
All ten in one install:
/plugin marketplace add Hiberius/hiberius-skills
I build the systems these skills came out of: performance marketing infrastructure, lead pipelines, ad account tooling, internal automation, and products on the Cloudflare edge stack. If you need something like this built properly, I take on freelance and contract work.
Christian Calabro — github.com/Hiberius
Performance marketing · media buying · TypeScript · Cloudflare Workers · Next.js · Python
Issues and pull requests welcome. The rule for a change to the skill itself: it has to be something you learned by getting it wrong once, not something you read in the docs.
MIT. No network calls, no telemetry, no dependencies.