Un Claude Skill que minea conversaciones de win/loss en Gong, las reconcilia contra los outcomes de deals en Salesforce y produce una battlecard interna que un rep puede leer en el camino a la call. La card es estructurada: resumen de posicionamiento, dónde ganas, dónde pierdes, talk-tracks por objeción (cada uno marcado interno o customer-facing), y una lista corta de “trampas a evitar”. Reemplaza la battlecard escrita por PMM que era cierta el día que se publicó y que está desactualizada al trimestre siguiente.
Cuándo usarlo
Usa este skill cuando un deal activo en pipeline nombre a un competidor que ya trackeas y la card existente tenga más de ~30 días. El rep necesita una hoja de manejo de objeciones hoy, no en el próximo sprint. El skill corre en aproximadamente 90 segundos contra una ventana de Gong de 180 días y produce una card en Markdown que el rep puede pegar en el registro del deal.
El bundle en apps/web/public/artifacts/competitive-battlecard-skill/ contiene:
SKILL.md — la definición del Skill con secciones When to invoke, Inputs, Method, Output format y Watch-outs.
references/1-battlecard-format.md — el esqueleto Markdown literal que el Skill rellena, con reglas de orden de secciones.
references/2-objection-talk-track-library.md — handlers canónicos para los cinco patrones recurrentes de objeciones (pricing-aggression, integration-depth, migration-effort, support-quality, security-and-compliance) más la excepción de genuine-feature-gap.
references/3-internal-vs-external.md — las reglas de clasificación que deciden qué líneas pueden salir de la empresa, incluyendo la blocklist de métricas internas y el comportamiento de auto-redacción.
Cuándo NO usarlo
Salta el skill en cualquiera de estos casos — correrlo igual produce un artefacto que pierde el tiempo del rep o, peor, despacha FUD.
El competidor tiene menos de ~5 menciones en la ventana de lookback. El Skill devuelve “señal insuficiente” en lugar de rellenar; no vuelvas a correrlo con una ventana más amplia esperando más datos.
Necesitas una página comparativa customer-facing. Este Skill emite una battlecard interna. Las reglas de clasificación en references/3-internal-vs-external.md existen precisamente para que las líneas internas nunca se filtren; para páginas comparativas customer-facing, construye un artefacto separado revisado por PMM y legal.
El “competidor” es el statu quo (Excel, script in-house, ninguna herramienta). Vender contra el statu quo es un movimiento distinto — no hay un posicionamiento de competidor nombrado para extraer. Usa un script de discovery en su lugar.
Solo tienes deals ganados taggeados. Sin datos de pérdida el Skill no puede extraer patrones de pérdida, y una battlecard que solo describe victorias es reconfortante pero inútil.
Setup
Taggea los deals. Cada deal Closed Won y Closed Lost de los últimos 12 meses necesita al menos un competidor poblado en Opportunity. Si la cobertura está por debajo de ~70%, corre un backfill único — Claude puede leer las notas del deal y proponer tags de competidor para aprobación humana. Haz esto primero; todo lo downstream depende de la cobertura de tagging.
Instala el Skill. Coloca el bundle en ~/.claude/skills/ (o el equivalente con scope de proyecto). Define GONG_API_KEY y SFDC_TOKEN en tu entorno. Confirma con /skills que el Skill competitive-battlecard resuelve y la descripción se renderiza.
Configura el scope. Edita references/competitor-list.md (lo creas a partir del stub de plantilla) con los 3-5 competidores que trackeas activamente, sus alias (variantes de mayúsculas/minúsculas y de módulo de producto — Competitor X — Core versus Competitor X — Enterprise — explícitamente), y la sales motion que cada uno lidera.
Reemplaza las references de plantilla. Los objection-talk-track-library.md y internal-vs-external.md que vienen son plantillas con handlers placeholder. PMM y legal revisan y reemplazan con los handlers reales de tu equipo y la blocklist real de tu equipo antes de la primera generación. No saltes este paso — el Skill rellena alegremente las plantillas con especificidad alucinada si el contenido de las references es genérico.
Genera. Invoca competitive-battlecard(competitor="competitor-x", lookback_days=180). Pasa deal_id si la card es para un deal vivo específico, así los talk-tracks se ponderan hacia las objeciones planteadas en ese hilo. Pasa prior_card_path para obtener un diff de “qué cambió desde el último refresh” anexado.
Refresca con cadencia de 30 días por competidor. Programa la generación. Más viejo que 30 días y la card antepone un banner de “verificar antes de usar” — eso es feature, no bug, pero molesta a los reps.
Qué hace realmente el skill
Cinco pasos, en orden, sin paralelismo — los pasos posteriores dependen del contexto de los anteriores.
Tirar el corpus de calls. Consulta Gong por cada call en la ventana de lookback donde el competidor o uno de sus alias (según references/competitor-list.md) sea mencionado. Extrae una ventana de transcripción de 60 segundos a cada lado de la mención. Hard cap en 200 calls; por encima de eso, estrecha la ventana antes de samplear.
Reconciliar a outcomes de Salesforce. Une el deal ID de cada call contra Opportunity. Bucketiza en won, lost, open y unknown (sin match en SFDC). El bucket unknown se descarta de la síntesis — el sesgo de selección es demasiado alto — pero el conteo se reporta como nota a pie de calidad de datos.
Extraer patrones de pérdida. Dos pasadas. La primera pasada clasifica cada snippet de deal-perdido en uno de los patrones canónicos de references/2-objection-talk-track-library.md o other. La segunda pasada promueve un patrón nuevo solo si el mismo tema aparece en 3+ deals; debajo de ese umbral las citas se publican crudas, no generalizadas. El umbral de tres deals es la línea de “ruido versus señal” — cualquier cosa más baja inventa patrones a partir de una o dos anécdotas.
Extraer patrones de victoria. Mismo enfoque de dos pasadas contra el bucket de ganados. La cita “te elegimos porque…” es el artefacto de mayor señal y se publica verbatim con el ID de la call.
Ensamblar la card y clasificar cada línea. Rellena el esqueleto de references/1-battlecard-format.md. Estampa cada línea con [INTERNAL] o [EXTERNAL_OK] según las reglas en references/3-internal-vs-external.md. Auto-redacta métricas internas de las líneas [EXTERNAL_OK] para que el talk-track siga siendo usable frente al cliente sin filtrar el número subyacente.
Realidad de costos
Una corrida típica tira ventanas de transcripción de 60 segundos de 50-150 calls, más las páginas públicas del competidor (pricing, producto, posts de blog recientes). El costo de tokens aterriza en aproximadamente 40-80k tokens de entrada y 8-15k tokens de salida por battlecard, o cerca de $0,20-$0,50 de Claude Sonnet al pricing actual. Tres competidores refrescados mensualmente está bien por debajo de $5/mes; la historia de costo está dominada por el tiempo humano ahorrado (una battlecard escrita por PMM es medio día de trabajo), no por el modelo.
El costo no trivial es la cadencia de refresh de 30 días por competidor trackeado. Si trackeas 3 competidores, eso es una generación cada diez días en promedio. Prográmala; no corras a demanda o lo olvidarás. La card lleva un banner de “verificar antes de usar” en cuanto cualquier fuente pública en ella tiene más de 30 días, que es el watchdog para cuando la cadencia se afloja.
El costo oculto es la revisión de PMM y legal de las references antes de la primera corrida. Una instalación inicial requiere ~2 horas de tiempo de PMM reemplazando la plantilla de talk-track-library con los handlers reales de tu equipo, y ~1 hora de tiempo de legal confirmando la blocklist interno-versus-externo. Saltarte esto y el Skill despacha handlers genéricos con especificidad de aspecto confiado, que es el peor modo de falla posible.
Métrica de éxito
Dos métricas que vale la pena trackear, ninguna de ellas “battlecards generadas”:
Win rate contra el competidor nombrado, medido trimestralmente, acotado a deals donde el rep usó la battlecard más reciente (trackea vía un campo “battlecard version” en Opportunity). El baseline es tu win rate existente; la barra a superar es +5 puntos porcentuales dentro de dos trimestres de la adopción. Por debajo de ese delta, o las battlecards no se están leyendo o los datos por debajo son demasiado ralos — diagnostica antes de continuar.
Tiempo-a-refresh-de-battlecard, medido como la edad mediana de la card usada en un deal al momento del cierre del deal. Antes del Skill, esa mediana es lo que sea la cadencia de PMM — usualmente trimestres. Después, debería estar bajo 30 días. Si no lo está, el schedule está roto y el banner de “verificar antes de usar” se está ignorando.
vs alternativas
vs Klue / Crayon (plataformas de inteligencia competitiva off-the-shelf): Klue y Crayon son más fuertes del lado de fuente pública — crawlean páginas de pricing y features del competidor en un schedule y exponen diffs sin que tengas que cablearlo. Son más débiles del lado del corpus de calls internas; la integración con Gong + Salesforce existe pero no es el centro de gravedad del producto, y las battlecards resultantes se inclinan hacia “lo que dice su sitio” en lugar de “lo que tus clientes realmente dijeron en la sala”. Este Skill es el inverso: corpus-interno-primero, fuente-pública-aumentado. La elección es de qué lado de los datos confías más — para una sales motion donde el factor decisivo es manejo de objeciones anclado en evidencia interna, ese es este Skill. Para un panorama competitivo de 50 competidores donde la amplitud importa más que la profundidad en cada uno, esos son Klue o Crayon.
vs battlecards escritas por PMM en Notion/Confluence: la card escrita por PMM tiene mejor prosa y un posicionamiento más ajustado. También se desactualiza a una cadencia trimestral en el mejor caso, y representa lo que PMM cree que dicen los clientes en lugar de lo que los clientes realmente dijeron. Usa la salida del Skill como input para la card escrita por PMM — deja que PMM cure la voz y la estructura, pero ancla cada afirmación en los patrones + citas + IDs de call de Gong del Skill. La motion combinada es más fuerte que cualquiera por sí sola.
vs DIY (analistas en un Google Doc): puedes hacer esto con personas y una tarde por competidor por trimestre. La razón para automatizar es la cadencia — las battlecards una-vez-por-trimestre están desactualizadas para el segundo mes — no el costo por card.
Watch-outs
Riesgo de difamación. Cada afirmación comparativa sobre el producto, pricing o soporte del competidor debe trazarse a una fuente pública que el competidor haya publicado. Guard: el Skill rechaza cualquier línea [EXTERNAL_OK] que no lleve una URL fuente fetched en la corrida actual; voltea la línea a [INTERNAL] y registra la razón en el apéndice de auditoría.
Datos públicos desactualizados. Las páginas de pricing del competidor cambian sin aviso. Una battlecard construida sobre un screenshot de hace 6 meses avergonzará al rep en la call. Guard: cada URL de fuente pública en la card lleva una fecha fetched; si cualquier fuente tiene más de 30 días al momento de la generación, la card antepone un banner de “verificar antes de usar”.
FUD versus hecho. Los reps quieren one-liners que aplasten al competidor; Claude está feliz de complacer salvo que se le restrinja. Guard: el Skill rechaza cualquier handler cuyo sujeto sea el competidor y cuyo predicado no sea directamente atribuible a una cita de cliente o a una fuente pública del competidor. Si ninguna existe, el handler se reescribe en positivo-de-producto (“así es como hacemos X”) en lugar de negativo-de-competidor (“ellos no pueden hacer X”).
Filtración interno-versus-externo. Un handler marcado [EXTERNAL_OK] puede aún incrustar un dato solo-interno (conteos de deals, win rates, benchmarks de pricing internos). Guard: la pasada de clasificación escanea cada línea [EXTERNAL_OK] contra la blocklist en references/3-internal-vs-external.md y auto-redacta los matches como [REDACTED — internal metric] para que el talk-track siga siendo usable sin filtrar el número.
Sesgo de selección en el tagging de pérdida. Los reps sub-loguean al competidor en deals perdidos — las pérdidas dolorosas son las menos probables de ser taggeadas. Guard: la nota a pie de calidad de datos siempre reporta el conteo de unknown; cuando excede el 20% de las calls tiradas, la card antepone un banner de “la cobertura de tagging del competidor es baja — interpretar los patrones de pérdida con cautela”.
Precisión de citas. La transcripción de Gong destroza términos técnicos. Guard: el Skill marca cualquier cita cuyo confidence score de Gong esté por debajo de 0,85 con [low-confidence transcript]; los reps están instruidos en el header de formato a verificar esas antes de usar.
Sprawl de battlecards. Tres a cinco competidores vivos es suficiente. Más allá, produces artefactos que ningún rep lee, y el costo de mantenerlas refrescadas excede el lift en win rate. Capa la lista de competidores explícitamente y poda anualmente.
Stack
Gong — corpus de calls y voz del cliente; la evidencia de citas won/lost viene de aquí.
Salesforce — verdad de outcome del deal; el bucketing de calls en won/lost/open/unknown depende de los datos de Opportunity.
Claude — extracción, clasificación, adaptación de talk-track, estampado interno-versus-externo.
Notion o Confluence (opcional) — destino para la card curada por PMM si corres la salida del Skill a través de una capa editada por humano; el Skill emite Markdown que se pega limpiamente en cualquiera.
---
name: competitive-battlecard
description: Build and refresh a competitive battlecard for a named competitor by mining Gong calls (won and lost) and reconciling against Salesforce deal outcomes. Produces a structured Markdown card with positioning summary, win patterns, loss patterns, talk-tracks per objection, and traps to avoid. Use when an active deal involves a named competitor and the existing battlecard is older than 30 days, or when a competitor has materially shifted positioning.
---
# Competitive battlecard
## When to invoke
Invoke when a deal in the active pipeline names a tracked competitor and the rep needs an objection-handling card the same day. The skill assumes Gong is the call corpus, Salesforce is the deal-outcome source of truth, and the competitor is one of the 3-5 you actively track in `references/competitor-list.md`.
Do NOT invoke for:
- Generic "tell me about competitor X" research with no live deal attached. Use a search tool — battlecards rot fast and producing them speculatively wastes tokens and creates stale artifacts.
- Customer-facing claims about competitors. Output is internal-only by default. The classification rules in `references/internal-vs-external.md` exist to gate what can ever leave the company.
- Competitors you have never lost to. Without loss data, the skill cannot extract loss patterns; it will pad and that padding is the exact failure mode the watch-outs guard against.
- Brand-new competitors with fewer than 5 mentions in the lookback window. The skill returns "insufficient signal" rather than hallucinating.
## Inputs
Required:
- `competitor` — slug matching an entry in `references/competitor-list.md` (e.g. `competitor-x`). The slug, not the display name, so aliases resolve.
- `lookback_days` — integer, defaults to 180. Use 90 for fast-moving categories, 365 for stable ones. The skill clips to the smaller of this window and 12 months.
Optional:
- `deal_id` — Salesforce Opportunity ID for the active deal. If provided, the skill weights talk-tracks toward objections raised on this specific call thread.
- `audience` — `ae` (default) or `pmm`. AE output emphasises talk-tracks; PMM output emphasises pattern shifts since the last refresh.
- `prior_card_path` — file path to the previous battlecard. If provided, the skill diffs and surfaces what is new versus stale.
## Reference files
Always read these from `references/` before generating the card. Without them the output is generic.
- `references/battlecard-format.md` — the literal Markdown skeleton the skill fills. Section order is load-bearing; reps scan top-to-bottom.
- `references/objection-talk-track-library.md` — the canonical pattern library (pricing, integration, migration, support, security). The skill matches new objections against these patterns rather than reinventing handlers.
- `references/internal-vs-external.md` — the classification rules that decide which lines may ever appear in customer-visible material. The skill marks every claim with `[INTERNAL]` or `[EXTERNAL_OK]`.
- `references/competitor-list.md` — slugs, aliases, product modules to differentiate, and the sales motion each competitor leads with.
## Method
Run these five steps in order. The skill does not parallelize; later steps consume context from earlier ones.
### 1. Pull the call corpus
Query Gong for every call in the lookback window where the competitor or one of its aliases (per `competitor-list.md`) is mentioned. Pull call ID, deal ID, call date, and the transcript snippet around each mention (60 seconds of context each side). Hard cap at 200 calls; if the result exceeds, narrow the window before sampling.
### 2. Reconcile to Salesforce outcomes
Join each call's deal ID against Salesforce Opportunity. Bucket calls into: `won` (Closed Won, this competitor named), `lost` (Closed Lost, this competitor named in the loss reason or as primary competitor), `open` (still in pipeline), `unknown` (no Opportunity match).
Drop the `unknown` bucket from synthesis — selection bias is too high. Track the count and report it as a data-quality footnote.
### 3. Extract loss patterns from `lost`
Two-pass extraction. First pass: for each lost-deal transcript snippet, classify the objection into one of the canonical patterns from `objection-talk-track-library.md` or `other`. Second pass: for the `other` bucket, propose new pattern candidates only if the same theme appears in 3+ deals; below that threshold, list as raw quotes without generalisation. Three-deal threshold exists because anything lower is noise dressed as signal.
### 4. Extract win patterns from `won`
Same two-pass approach against the won bucket. The deciding-factor quote ("we picked you because…") is the highest-signal artifact; prioritise quotes where the customer explicitly contrasts with the competitor. Surface these verbatim in the card with the call ID for verification.
### 5. Assemble the card
Fill the skeleton from `battlecard-format.md`. For each objection in the talk-track section, pull the matching handler from the library and adapt it with the competitor-specific evidence found in steps 3-4. Mark every line with `[INTERNAL]` or `[EXTERNAL_OK]` per the classification rules. End with a "what changed since last refresh" diff if `prior_card_path` was provided.
## Output format
```markdown
# Battlecard — {Competitor display name}
_Generated {YYYY-MM-DD} from {N won} / {N lost} / {N open} calls in last {lookback_days}d._
_Data quality: {N unknown} calls dropped (no SFDC match)._
## Positioning summary [INTERNAL]
One paragraph: how this competitor frames itself today, the segment
they lead with, the wedge they price aggressively. Trace each claim to
a public source URL (their pricing page, a recent blog post, a G2
update) so the next refresh can re-check.
## Where we win [INTERNAL]
| Pattern | Deal count | Representative quote (call ID) |
|---|---|---|
| {Pattern 1} | {N} | "{quote}" ({call-id}) |
| {Pattern 2} | {N} | "{quote}" ({call-id}) |
## Where we lose [INTERNAL]
| Pattern | Deal count | Representative quote (call ID) |
|---|---|---|
| {Pattern 1} | {N} | "{quote}" ({call-id}) |
| {Pattern 2} | {N} | "{quote}" ({call-id}) |
## Talk-tracks [EXTERNAL_OK unless flagged]
### Objection: "{Objection 1, customer wording}"
**Handler:** {2-3 sentence rep response, no FUD, no comparative claim
unless cited from a public competitor source.} [EXTERNAL_OK]
**Evidence (internal):** {customer quote from won deal} ({call-id}) [INTERNAL]
### Objection: "{Objection 2}"
(same shape)
## Traps to avoid [INTERNAL]
- {Trap 1: a misstep reps make against this competitor — e.g. matching
on a feature where the competitor is genuinely stronger.} Guard:
{what to do instead}.
- {Trap 2}. Guard: {what to do instead}.
## Sources
- Competitor public pages: {URL, fetched YYYY-MM-DD}
- Gong calls: {N} calls, IDs available in appendix
- Salesforce report: {report ID or filter}
## What changed since {prior-card date} (if prior_card_path provided)
- New: {pattern that has appeared since last refresh}
- Faded: {pattern that no longer appears}
- Shifted: {pattern that is now larger or smaller in deal count}
```
## Watch-outs
- **Defamation risk.** Every comparative claim about the competitor's product, pricing, or support must trace to a public source the competitor has shipped (their pricing page, a published case study, an SEC filing). Guard: the skill rejects any `[EXTERNAL_OK]` line that does not carry a source URL fetched in this run; flips it to `[INTERNAL]` and logs the reason.
- **Stale public data.** Competitor pricing pages change without notice and a battlecard built on a 6-month-old screenshot will embarrass the rep on the call. Guard: the skill records the `fetched` date next to every public-source URL; if any source is older than 30 days at generation time, the card prepends a "verify before use" banner.
- **FUD versus fact.** Reps want one-liners that crush the competitor; Claude is happy to oblige unless constrained. Guard: the skill rejects any handler whose subject is the competitor and whose predicate is not directly attributable to a customer quote (won deal) or a public source (competitor's own page). If neither exists, the handler is rewritten in product-positive form ("here is how we do X") rather than competitor-negative form ("they cannot do X").
- **Internal versus customer-facing leakage.** A handler marked `[EXTERNAL_OK]` may still embed an internal-only data point (deal counts, won-against rates, internal pricing benchmarks). Guard: the second pass scans every `[EXTERNAL_OK]` line against the blocklist in `internal-vs-external.md` (deal counts, win rates, customer names not in the public reference list, internal pricing ranges). Matches are auto-redacted with `[REDACTED — internal metric]` and the line stays usable.
- **Selection bias.** Reps under-log the competitor on lost deals — the painful losses are the ones least likely to be tagged. Guard: the data-quality footnote always reports the `unknown` count; whenever it exceeds 20% of pulled calls, the card prepends a "competitor-tagging coverage is low — interpret loss patterns with caution" banner.
- **Quote accuracy.** Gong transcription mangles technical terms and proper nouns. Guard: the skill marks any quote containing a Gong confidence score below 0.85 with `[low-confidence transcript]`; reps are instructed in the format header to verify those before using.
# Battlecard format — TEMPLATE
> This is the literal Markdown skeleton the competitive-battlecard
> skill fills. Section order is load-bearing — reps scan top to bottom
> and stop reading at the first useful line. Keep it that way.
```markdown
# Battlecard — {Competitor display name}
_Generated {YYYY-MM-DD} from {N won} / {N lost} / {N open} calls in last {lookback_days}d._
_Data quality: {N unknown} calls dropped (no SFDC match)._
_Verify before use: any source older than 30 days is flagged inline._
## Positioning summary [INTERNAL]
One paragraph. How they frame themselves today, the segment they lead
with, the wedge they price aggressively. Each claim cites a public
source URL with a `fetched` date.
## Where we win [INTERNAL]
| Pattern | Deal count | Representative quote (call ID) |
|---|---|---|
| | | |
## Where we lose [INTERNAL]
| Pattern | Deal count | Representative quote (call ID) |
|---|---|---|
| | | |
## Talk-tracks
### Objection: "{customer wording}"
**Handler [EXTERNAL_OK]:** rep response, 2-3 sentences, no FUD.
**Evidence [INTERNAL]:** customer quote from a won deal (call ID).
(repeat per objection — pricing, integration, migration, support,
security at minimum if patterns exist)
## Traps to avoid [INTERNAL]
- Trap: … Guard: …
- Trap: … Guard: …
## Sources
- Public pages: URL, fetched YYYY-MM-DD
- Gong calls: N calls, IDs in appendix
- Salesforce report: report ID or saved filter
## What changed since {prior-card date}
- New: …
- Faded: …
- Shifted: …
## Appendix — call IDs
{flat list of Gong call IDs grouped by bucket: won / lost / open}
```
## Authoring rules for whoever fills this
- Every line carries either `[INTERNAL]` or `[EXTERNAL_OK]`. No line is unmarked. The internal-vs-external classifier in `references/internal-vs-external.md` decides borderline cases.
- Quotes are verbatim. Cleaning up grammar is fine; rewording the meaning is not.
- Deal counts are always raw integers, never percentages. "12 of 47 lost deals" not "26% of losses" — the denominator is meaningful.
- Public-source claims always carry a fetched-date next to the URL. Without it the next refresh has no anchor for diffing.
- Section order is fixed. Do not reorder; reps build muscle memory.
## Last edited
{YYYY-MM-DD} — bump on every material edit so the skill can warn when the format itself is stale.
# Objection talk-track library — TEMPLATE
> Replace this template's contents with your team's actual canonical
> handlers. The competitive-battlecard skill matches incoming
> objections from Gong against these patterns rather than inventing
> handlers per run. That is what keeps tone consistent across
> battlecards and across reps.
The library is organised by objection pattern. Each pattern has:
- The pattern name (used as the slug the skill matches against)
- The customer wording variants the skill should treat as the same pattern
- The canonical handler (the rep response)
- The evidence requirement (what must back the handler before it can ship as `[EXTERNAL_OK]`)
- The escalation path (when to bring in PMM, SE, or product)
## Pattern: pricing-aggression
**Customer wording variants:**
- "Competitor X is half the price."
- "We got a quote from {competitor} that was significantly lower."
- "Your list price is hard to justify versus {competitor}."
**Canonical handler:**
> "{Competitor} prices on {their model — per seat / per usage / etc.};
> our pricing reflects {one differentiator that maps to outcome, e.g.
> the integration depth that removes the second tool from your stack}.
> Happy to walk through TCO with your finance partner — most teams
> find the comparison flips once {specific cost line} is included."
**Evidence requirement:**
- Public competitor pricing page URL with fetched date, OR
- Customer quote from a won deal where TCO was the deciding factor.
If neither, the handler ships as `[INTERNAL]` and the rep adapts live.
**Escalation:** finance-partnered TCO model — bring in PMM if the pattern repeats across 5+ deals in 30 days.
## Pattern: integration-depth
**Customer wording variants:**
- "Does this integrate with {tool}?"
- "{Competitor} already has a {tool} integration."
- "We need this to work with our existing stack on day one."
**Canonical handler:**
> "We integrate with {tool} via {mechanism — native, API, Zapier — be
> specific}. The differences worth knowing: {1-2 concrete capability
> gaps or strengths}. Happy to show the integration in a working
> environment before you commit."
**Evidence requirement:**
- Public integration directory URL on our own site, OR
- Working demo environment the SE can spin up in under an hour.
## Pattern: migration-effort
**Customer wording variants:**
- "We just moved to {competitor} last year."
- "Migrating off {competitor} would be painful."
- "What does it take to switch?"
**Canonical handler:**
> "Migration off {competitor} typically takes {realistic range based
> on prior migrations}. The blockers we see most often: {1-2 specific
> ones}. We have a migration playbook for {competitor} specifically —
> {customer name from public reference list} did this in {timeframe}."
**Evidence requirement:**
- Public case study from a customer who migrated, OR
- Internal migration playbook the SE can walk through.
## Pattern: support-quality
**Customer wording variants:**
- "We've heard your support is slow."
- "{Competitor} has 24/7 support included."
- "Who do we call at 2am?"
**Canonical handler:**
> "Our support tiers are {list — be specific about response time
> SLAs}. For {customer's tier}, the SLA is {time}. Two named contacts
> on the customer success side, plus the in-app chat backed by our
> product engineers."
**Evidence requirement:**
- Public support SLA page URL with fetched date.
Never say anything about the competitor's support quality unless quoting a customer who came from that competitor and was on the record.
## Pattern: security-and-compliance
**Customer wording variants:**
- "Are you SOC 2?"
- "{Competitor} has FedRAMP."
- "Our security team has concerns."
**Canonical handler:**
> "We hold {list certifications, be exact}. The trust portal at {URL}
> has the current attestations and the security questionnaire. For
> the specific concern your team raised, the right person to bring in
> is {role — typically the security CSM or the CISO's office}."
**Evidence requirement:**
- Public trust portal URL with fetched date and the actual certifications listed.
## Pattern: feature-gap (genuine)
**Customer wording variants:**
- "{Competitor} has {feature} and you don't."
**Canonical handler:**
> "Correct, we do not have {feature} today. The reason is {real
> product reasoning — not 'on the roadmap'}. The way customers
> typically solve {underlying need} on our platform is {workaround
> with one named customer reference if available}. If that does not
> meet your need, I would rather flag that now than discover it in
> month three."
**Evidence requirement:**
- Internal product confirmation that the gap is real and the workaround is genuine.
This handler is the exception: it is intentionally honest about a gap. The traps-to-avoid section in the battlecard skeleton exists partly to remind reps not to fight battles they will lose — guard against pretending parity where none exists.
## Last edited
{YYYY-MM-DD}
# Internal-vs-external classification rules — TEMPLATE
> Replace this template's contents with your team's actual rules. The
> competitive-battlecard skill stamps every line of every battlecard
> with `[INTERNAL]` or `[EXTERNAL_OK]` per these rules. The
> classification is not advisory — `[INTERNAL]` lines are stripped
> from any export the rep shares with a customer.
## Default
Default classification is `[INTERNAL]`. A line is upgraded to `[EXTERNAL_OK]` only if it passes every rule below.
## Allowed `[EXTERNAL_OK]`
A line may be classified `[EXTERNAL_OK]` if all of these are true:
1. **No internal-only metric appears.** The blocklist below is exhaustive for our team. If any blocklist term appears, the line stays `[INTERNAL]`.
2. **Any comparative claim about the competitor traces to a public source.** The source URL is in the line or in the same bullet, with a `fetched` date no older than 30 days at generation time.
3. **No customer name appears unless that customer is on the public reference list** at `/legal/public-references.json` (or the equivalent in your CRM).
4. **No FUD.** The handler does not assert anything negative about the competitor's product, support, security, or company that is not directly attributable to a public source the competitor has shipped or to a customer the customer can call.
## Blocklist (these terms force `[INTERNAL]`)
Any line containing any of the following stays internal:
- Deal counts in absolute numbers (e.g. "we won 47 of 89 deals")
- Win rates as percentages
- Internal pricing ranges, discount thresholds, list-vs-paid deltas
- Customer names not on the public reference list
- ARR, MRR, ACV figures
- Internal codenames for products, projects, or initiatives
- Slack channels, Notion URLs, internal Gong call IDs
- Roadmap items not announced publicly
- Personnel names and reporting lines
- The phrase "we always" or "we never" applied to the competitor unless backed by a public source URL in the same line
## Borderline cases — the skill's behaviour
When a line is borderline, the skill defaults to `[INTERNAL]` and logs the reason in the appendix. PMM can flip it on review.
Examples of borderline cases the skill has hit historically:
- A handler that quotes a customer in a public case study but paraphrases the quote — flip to verbatim or mark `[INTERNAL]`.
- A pricing comparison that uses our own price list but the competitor's price is from a screenshot dated two months ago — the competitor side is stale, mark `[INTERNAL]` until refreshed.
- A capability claim about the competitor that is true but stated as "they can't do X" rather than "X is not on their public roadmap" — rewrite or mark `[INTERNAL]`.
## Auto-redaction
If the second pass finds a blocklist term inside an otherwise qualifying `[EXTERNAL_OK]` line, the term is replaced with `[REDACTED — internal metric]` and the line stays `[EXTERNAL_OK]`. This keeps the talk-track usable without leaking the underlying number.
Example before redaction:
> "We win against {Competitor} 73% of the time when integration depth
> is the deciding factor."
After:
> "We win against {Competitor} [REDACTED — internal metric] when
> integration depth is the deciding factor."
The handler is now usable in front of a customer without the win rate leaking.
## Reporting
Every battlecard generation logs a count of:
- Lines emitted as `[EXTERNAL_OK]`
- Lines downgraded from `[EXTERNAL_OK]` to `[INTERNAL]` and the reason
- Lines auto-redacted and the term that triggered the redaction
The log lives at the bottom of the card under "Classification audit" so PMM and legal can review.
## Last edited
{YYYY-MM-DD}