Competitive Battlecard Assembly
Build and maintain per-competitor battlecards from deal transcripts, win/loss data, and market intelligence, stored as structured records in CRM
npx gtm-skills add drill/competitive-battlecard-assemblyWhat this drill teaches
Competitive Battlecard Assembly
This drill builds structured, data-backed competitive battlecards for each named competitor that appears in your sales pipeline. Unlike static documents, these battlecards are living CRM records that update automatically as new deal data, win/loss outcomes, and competitive intelligence accumulate.
Input
- Attio CRM with deal records that have
competitor_mentionedattributes - At least 3 completed deals where a specific competitor was mentioned
- Clay account for competitor company enrichment
- Anthropic API key for synthesis
Steps
1. Initialize the Competitors object in Attio
If not already created (check first via Attio MCP), create a custom object called "Competitors" with these attributes:
| Attribute | Type | Purpose | |-----------|------|---------| | Name | Text | Competitor company name | | Website | URL | Competitor's primary website | | Mention Count | Number | Total times mentioned across all deals | | Win Rate Against | Number (%) | Deals won when this competitor was in the deal | | Loss Rate Against | Number (%) | Deals lost to this competitor | | Avg Deal Size (Competitive) | Currency | Average deal size in competitive deals with them | | Their Strengths | Text (multi-line) | Synthesized from buyer quotes | | Their Weaknesses | Text (multi-line) | Synthesized from buyer quotes | | Our Differentiators | Text (multi-line) | Where we win most often | | Common Objections | Text (multi-line) | Recurring objections in competitive deals | | Winning Frameworks | Text (multi-line) | Response frameworks with highest win rate against them | | Trap Questions | Text (multi-line) | Questions that highlight our strengths vs their gaps | | Pricing Intel | Text (multi-line) | Known pricing from prospects and public sources | | Recent Changes | Text (multi-line) | Product/pricing changes detected by monitoring | | Last Updated | Date | When this record was last refreshed | | Battlecard Version | Number | Incremented on each refresh |
2. Aggregate deal data per competitor
Query Attio for all deals where competitor_mentioned matches the target competitor. For each deal, extract:
- Deal outcome (won/lost/open)
- Objection data (from
call-transcript-objection-extractionresults stored in notes) - Pain data (from discovery notes)
- Decision criteria mentioned
- Win/loss reasons (if closed)
- Buyer quotes about the competitor
Use Claude API to synthesize across all deals:
{
"prompt": "You are analyzing {n} sales deals where {competitor_name} was mentioned as a competitor. Synthesize the following data into a competitive battlecard.\n\nDeal data:\n{deals_json}\n\nFor each section, use ONLY information from the deal data. Do not invent strengths or weaknesses. Quote buyers directly where possible.\n\nReturn JSON:\n{\n \"their_strengths\": [\"Strength 1 with supporting buyer quote\", ...],\n \"their_weaknesses\": [\"Weakness 1 with supporting buyer quote\", ...],\n \"our_differentiators\": [\"Differentiator 1 — why it matters to buyers\", ...],\n \"common_objections\": [{\"objection\": \"...\", \"frequency\": n, \"best_response\": \"...\"}],\n \"winning_frameworks\": [{\"framework\": \"...\", \"win_rate\": 0.xx, \"sample_size\": n}],\n \"trap_questions\": [\"Question that surfaces their weakness without naming them\", ...],\n \"pricing_intel\": {\"known_range\": \"...\", \"packaging\": \"...\", \"discount_patterns\": \"...\"},\n \"deal_patterns\": {\"we_win_when\": \"...\", \"we_lose_when\": \"...\", \"key_decision_criteria\": [\"...\"]}\n}"
}
3. Enrich with public competitive intelligence
Run Clay enrichment on the competitor:
- Company search via
clay-company-searchfor firmographics, headcount, funding, tech stack - Claygent scrape of their pricing page, features page, and recent blog posts via
clay-claygent - G2/Capterra ratings (if available via Clay enrichment)
Append public intel to the battlecard.
4. Store the battlecard in Attio
Update the Competitor record with all synthesized data. Create a structured note with the full battlecard:
## {Competitor Name} Battlecard v{version}
**Updated:** {date} | **Deals analyzed:** {n} | **Win rate against:** {win_rate}%
### When We Win
{synthesized from deals where we beat them}
### When We Lose
{synthesized from deals where they beat us}
### Their Strengths (from buyer quotes)
{bulleted list with actual buyer quotes}
### Their Weaknesses (from buyer quotes)
{bulleted list with actual buyer quotes}
### Top Objections & Responses
| Objection | Frequency | Best Response Framework | Win Rate |
|-----------|-----------|------------------------|----------|
### Trap Questions
{questions that surface their gaps without naming them}
### Pricing Intelligence
{known pricing, packaging, discount patterns}
### Recent Product/Market Changes
{from competitor-changelog-monitoring if available}
5. Set up automated refresh
Create an n8n workflow triggered weekly (Monday 7 AM):
- Query Attio for new deals involving each tracked competitor in the past 7 days
- If new data exists, re-run the synthesis (Step 2) with all historical + new data
- Update the Competitor record and increment
Battlecard Version - If win rate against any competitor drops below 40%, send Slack alert
- Fire PostHog event:
battlecard_refreshedwith competitor name, deal count, win rate
Output
- Structured Competitor records in Attio with data-backed battlecards
- Weekly automated refresh incorporating new deal data
- Win rate tracking per competitor over time
- Alerts when competitive position degrades
Triggers
- Initial build: Run manually for each competitor with 3+ deal mentions
- Refresh: Weekly cron via n8n, or triggered when a new deal closes involving a tracked competitor
- Alert: Immediate Slack notification if win rate drops below threshold