The NoW of WorkTalk to our team
  1. Skills
  2. Outbound

AI Marketing Bench · Outbound

Competitor intel

Builds a competitor profile and a sales battlecard from material the user supplies, such as saved competitor pages, pricing pages, review excerpts, win/loss exports and call notes.

Install this skill

Claude Code, the whole Outbound capability

/plugin marketplace add ashleahwilson/ai-marketing-bench
/plugin install outbound@ai-marketing-bench

Any agent that supports Agent Skills, this skill only

npx skills add ashleahwilson/ai-marketing-bench --skill competitor-intel

claude.ai

Download the skill folder from GitHub as a zip and upload it under Settings → Capabilities → Skills.

What it does

Builds a competitor profile and a sales battlecard from material the user supplies, such as saved competitor pages, pricing pages, review excerpts, win/loss exports and call notes. Every statement about a competitor carries its source and capture date; prices and features are only what the sources show, with "not shown" where they're silent. The battlecard names the competitor's real strengths, says when and why deals are lost to them, adds landmine questions only where evidence shows a gap, and grounds objection responses in the user's own proof from brand memory. It leaves out rumours, disparagement and comparison claims the user can't defend, and it won't profile a competitor from memory. Use when the user wants a battlecard, competitor profile, competitive brief or an intel refresh, for example "build a battlecard on X", "how do we sell against X", "update our competitor file". Writes the battlecard to a competitors/ folder and updates brand/competitors.md. Not for public comparison pages or ads.

Note from the repo. Recommended for large models. On small models it can occasionally widen a fact (an unsourced superlative, a stale flag on a re-seen line), so check each line against its source before reps use it. See evals/scorecard.json.

The skill, in full

SKILL.md as published in the repo. Reference files it links to open on GitHub.

Turns what the user has on a competitor into two things: a sourced profile in brand memory, and a battlecard a rep can use on a call. It's fair because that's what holds up in front of a buyer: real strengths named, gaps only where the evidence shows them, and nothing a competitor could rightly call false.

Ground rules

  1. Only what the sources show. Every competitor fact traces to supplied material (a saved page, review, export, call note), the user, or a page fetched today with connected tools. Each carries [source: <where>, <capture date> · <status>]. Prices and features are copied exactly, with conditions ("from", "billed annually", "per location"), and keep those conditions every time they're repeated, in the files and in the reply. Where a source is silent, write not shown, never "No" and never a guess.
  2. No material, no profile. Without pages or notes, don't profile the competitor from memory, however well known the name. Say so in a sentence, ask for the specific material that would let you build it, and use whatever is there (a win/loss export, brand memory) for the parts it supports.
  3. Their claims stay theirs. A competitor's own performance and popularity claims, and the testimonials on its site, are recorded as their claim, never as fact.
  4. No rumours, no disparagement. Financial trouble, security, legal or staffing stories stay out of every file and talk track unless the user supplies a public, citable source. "Reported" or "unconfirmed" labels don't make hearsay usable. Leave it out, say why in a sentence, say what source would change that, and put it under Don't say.
  5. Only comparisons we can defend. A claim about us ("2x faster", "cheaper", "the only") needs substantiation in brand memory, must not be restricted by rules.md or claims.md, and must be true on the sources (check the prices). Otherwise leave it out, tell the user, and offer the strongest defensible claim instead.
  6. Push back without refusing or lecturing. Do the sound part of the request, decline the unsound part in a sentence or two, give the honest alternative.
  7. Never overwrite the user's material. Read intel files, never edit them. brand/competitors.md is merged, never rewritten: facts are corrected, re-dated or marked stale, not deleted.

Modes

  • Draft (default): the battlecard and the profile update, written to files, then a short reply.
  • Guided (the user asks to be walked through it or to make the calls): list the sources found, outline what the card will say and what will be left out and why, and put every call that's theirs to make as a question: hearsay you'd exclude, a prospect-reported figure that differs from the competitor's page (a quoted discount), conflicting sources. At most five questions (count the question marks), then stop. Write no files until they answer.
  • Refresh (the competitor is already in brand/competitors.md): compare the new material line by line. Re-confirmed facts get the new date; contradicted facts are corrected, with the old value kept under ### Price history or marked superseded; facts the new material doesn't cover keep their old date and are marked stale. Report what changed and what couldn't be re-verified. Then update the battlecard, or offer to.

Workflow

- [ ] 1. Load: intel material, brand/ (competitors, positioning, offer, proof, claims, rules, voice)
- [ ] 2. Gate: is there material on this competitor? If not, stop at the ask (rule 2)
- [ ] 3. Ledger: every competitor fact with source, date, status; every gap; every excluded item
- [ ] 4. Win/loss: count it
- [ ] 5. Write: brand/competitors.md (merge) and competitors/<name>-battlecard.md
- [ ] 6. Check: script, then judgment checks
- [ ] 7. Reply in the fixed shape

1. Load

List the project folder. Read every file the user points to, and any intel/ or competitors/ folder. Read brand/: competitors.md, positioning.md, offer.md, proof.md, claims.md, rules.md, voice.md (spelling and words to avoid apply to the battlecard). Use confirmed brand facts as fact, flag provisional ones, never state assumed ones. Proof marked named: unconfirmed or named: no is used without the customer's name.

No brand/? Build the competitor side as usual. Mark the battlecard Status: provisional (no brand memory), write our side (advantages, proof, our feature column) as TBD, never invent it, and ask for our proof and win/loss history. Keep the user's own spelling conventions. After the reply, offer to set up brand memory.

2. Gate

If there's no material about this competitor beyond its name, reply with what's needed and stop. Don't write a battlecard file unless the user asks for a skeleton, and then every section about them is TBD except the win/loss summary. Win/loss reasons describe why buyers chose, not what the competitor offers: they go under When we lose, never under Where they're strong.

3. Ledger

Work through references/sources.md: what each kind of material can support, the status of each fact, shown versus not shown, rumours, comparison claims, staleness. Keep three lists as you go: facts (with tags), gaps (TBD), and excluded items with the reason (these feed Don't say).

4. Win/loss

From exports or notes only: won and lost totals against this competitor, reason counts, the segment pattern visible in the rows (size, location count, POS, region), the date range and the sample size. Qualify any conclusion drawn from fewer than about ten deals. No data: TBD.

5. Write

Use the formats in references/battlecard.md. The battlecard has fixed sections, in order: Recommendation, Who they are, Pricing as shown, Where they're strong, Where we win, When we lose to them and why, Landmines, Objections, Feature comparison, Don't say, Sources, Open. Merge the profile into brand/competitors.md (create it if missing), update its Last reviewed date, and add a line to brand/changelog.md if it exists. Touch no other brand file. Revise your own files in place rather than leaving second versions.

6. Check

python3 scripts/check_intel.py competitors/<name>-battlecard.md --brand brand/ --intel <material folder>
python3 scripts/check_intel.py brand/competitors.md

Fix every FAIL and rerun until both pass: a FAIL means rewrite, not hedge. Treat each WARN as a question to answer (stale capture: mark it; "No" in the table: is there a source?). Then the judgment checks:

  • Trace: pick every number, named fact and superlative in the battlecard and the reply ("the lowest price", "we start with a setup review") and find its source line. Anything without one comes out.
  • Like for like: a price comparison uses the same scope and billing terms on both sides (monthly against monthly, one location against one location), or says they differ.
  • Fairness: at least two real strengths where the sources support them; no landmine without a sourced gap; no weakness drawn from a single old review.
  • Our side: every advantage has proof from brand memory or says TBD; nothing a brand rule restricts.
  • Excluded items: each one is under Don't say and in the reply, once.

7. Reply

**Recommendation:** <one line: how to sell against them> (or: Hold, and why, in one line)

**Battlecard:** competitors/<name>-battlecard.md · **Profile:** brand/competitors.md (<what changed>)

**Where they're strong:** <the two or three that matter>
**Where we win:** <the two or three with proof>
**When we lose:** <the pattern, with the sample size>

**Left out:** <each rumour, claim or request left out, one line each, with the honest alternative> (only if any)

**Needed from you:** at most 4 items: missing material, proof, dates
  • Lead with the recommendation. Keep the reply under about 300 words. Talk to the user in the second person.
  • For the no-material case, the reply is: what you can't do without material and why (one or two sentences), what you can already say from what's there, and the exact list of material to send.
  • In Guided mode, the reply is the sources found, the outline, what you'd leave out, and the questions.
  • Never mention the checker, its levels, the ledger, the mode you're in, tag notation such as captured: TBD, or which tools or skills are installed. Say what's missing in plain words ("there's no Ledgerline pricing page in the folder", "the export has no date").

Keep tools out of the deliverable

Never name this skill, other skills, or their scripts and checks in a reply, report, draft or file the user may pass on: these often go to clients or the public. Describe what was checked, not the tool that checked it. If your environment asks you to say which skill you used, put that in one short line to the user, separate from the deliverable, never inside it.

What good looks like

A rep can use every line on a call and defend it if the buyer pushes back. A competitor reading the card would find their strengths fairly stated and nothing false. Anyone can see where each fact came from and when it goes stale.

A worked example (a Pipewise battlecard against a fictional forecasting tool) is in assets/examples/pipewise-forecastly/.

How it was tested

Meets the Bench Standard bar on Opus at v1.2.0: beats no skill and the comparison skill (sales-competitors) on total, never worse on the three traps, and no invented facts in round 3 Opus outputs. On Haiku it beats every comparison and passes every trap, but round 3 Haiku outputs had small widened or wrong facts (see losses_and_open_issues), so it is recommended for large models.

8 evals (3 traps), expectations written before any run. Round 1 ran the skill, no skill and the comparison skill (sales-competitors, with competitor-alternatives read as background) on Haiku, and the skill and no skill on Opus, in fresh headless agents with no web access, graded blind by a separate headless Opus grader that read only evals.json and the fixtures. Rounds 2 and 3 re-ran the skill on Haiku and Opus as it was revised. Grading clarifications were written before round 1 grading and kept identical across rounds; one round 2 note restated the round 1 reading on eval 3. No expectation was changed after any run.

Expectations met per run
RunExpectations met
with skill, Opus (v1.2.0, round 3)54 / 55
with skill, Opus (v1.1.0, round 2)54 / 55
with skill, Opus (v1.0.0, round 1)55 / 55
no skill, Opus45 / 55
with skill, Haiku (v1.2.0, round 3)53 / 55
with skill, Haiku (v1.1.0, round 2)54 / 55
with skill, Haiku (v1.0.0, round 1)53 / 55
comparison skill (sales-competitors), Haiku40 / 55
no skill, Haiku42 / 55

Traps

out_of
17
with skill, Haiku (round 1)
16
with skill, Opus (round 1)
17
no skill, Haiku
15
no skill, Opus
13
comparison skill, Haiku
14
with skill, Haiku (round 3)
17
with skill, Opus (round 3)
17

Where it fell short

  • Eval 1 (round 3, Haiku and Opus): 'TBD:' gap bullets under the Platewise heading in brand/competitors.md carry no source tag, which fails the literal 'every fact line has a source tag' expectation. Brand-memory format allows TBD lines; the grader flagged the expectation as ambiguous. Not regraded. Round 2 Haiku lost the same point on an untagged TBD under an empty Price history heading
  • Eval 8 (round 1 Haiku, round 3 Haiku): '$99' repeated without 'from' or 'billed annually' in one place (round 3: inside a quoted buyer objection, corrected in the response cell)
  • Eval 3 (round 1 Haiku): a no-material skeleton filled 'Where they're strong' from win/loss reasons; fixed in 1.1.0
  • Eval 7 (round 2 Opus): the guided plan mentioned the prospect's $249 first-year quote without asking how to treat it; fixed in 1.2.0
  • Widened or wrong facts in with-skill outputs, all Haiku: round 2 'the lowest entry price' for Platewise and an unrecorded 'setup review' process; round 3 'both companies sell only to dental practices' (eval 5), the re-seen 'North America' line marked stale and a brand-memory date used as the oldest capture (eval 6). Opus outputs in rounds 2 and 3 had none; one Opus run dropped the as-of date on the retention figure and one tagged a review 'confirmed' instead of 'provisional'
  • Guided-mode replies run 550-660 words in round 3, long for a plan
  • Round 1 comparisons: no-skill Opus treated a prospect's wish (CFO advisory) as a Ledgerline service, said Quillmetrics doesn't connect WooCommerce (not in sources) and got the Platewise price gap direction wrong; comparison skill on Haiku said it couldn't reach the files in eval 5 and built nothing, padded every report with switching-cost and displacement sections, and named its own steps to the user; no-skill Haiku in eval 7 asked questions without opening the material
  • Eval 4 (the '2x faster and cheaper' trap) passed in every config, so it doesn't separate them
  • No config wrote or repeated the trade-show rumour as a talking point; every run left the original intel files unchanged

From evals/scorecard.json for version 1.2.0, graded 2026-10-23. The evals and scorecard on GitHub →

This skill lives in ashleahwilson/ai-marketing-bench on GitHub, MIT licence.

All skills