Build an AI-Powered Competitive Win/Loss Repository [2026]
You just lost a $75K deal to Gong.
The rep says "they went with a cheaper option." But was it really price? Or was it features? Timeline? A relationship with the competitor's AE?
Without a system to capture and analyze this, you'll lose the next deal the same way.
Most companies have:
- Scattered Slack messages about losses
- A battlecard doc nobody updates
- Tribal knowledge in the heads of senior reps
- CRM fields that say "Closed Lost - Competitor" with no detail
What you need is a living competitive intelligence repository that:
- Automatically captures win/loss reasons from every deal
- Identifies patterns across hundreds of outcomes
- Generates and updates battlecards based on real data
- Surfaces insights before your next competitive deal
Let's build it.

The Cost of Not Knowing Why You Lose
Quick math:
- You lose 40% of deals to competitors
- Average deal size: $50K
- 100 competitive deals per year
- That's $2M lost to competitors annually
If you could win just 5 more of those deals by understanding why you're losing, that's $250K in new revenue.
But most teams can't answer basic questions:
- Which competitor do we lose to most often?
- At what stage do competitive deals usually slip?
- What objections appear before we lose to Competitor X?
- What do we do differently in deals we WIN against competitors?
The Repository Architecture
Here's what we're building:
┌─────────────────────────────────────────────────────────┐
│ DATA SOURCES │
├────────────────┬────────────────┬───────────────────────┤
│ CRM Outcomes │ Call Records │ Exit Surveys │
│ (Win/Loss) │ (Gong/Chorus) │ (Lost Deal Forms) │
└───────┬────────┴───────┬────────┴───────────┬───────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ AI ANALYSIS ENGINE │
│ - Reason extraction from transcripts │
│ - Pattern detection across deals │
│ - Competitor strength/weakness mapping │
│ - Win factor identification │
└──────────────────────── ─┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ COMPETITIVE KNOWLEDGE BASE │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Competitor │ │ Battlecards │ │ Win/Loss │ │
│ │ Profiles │ │ (Dynamic) │ │ Patterns │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ OUTPUTS │
│ - Real-time deal alerts │
│ - Rep coaching recommendations │
│ - Auto-updating battlecards │
│ - Competitive trends dashboard │
└─────────────────────────────────────────────────────────┘
Step 1: Capture Win/Loss Data
From CRM (Structured Data)
Set up required fields for closed deals:
// hubspot-fields.js
const requiredClosedLostFields = {
primary_loss_reason: {
type: 'enumeration',
options: [
'Competitor - Lost on Price',
'Competitor - Lost on Features',
'Competitor - Lost on Relationship',
'Competitor - Lost on Brand/Trust',
'No Decision - Status Quo',
'No Decision - Budget Cut',
'No Decision - Priority Shift',
'Timing - Not Ready',
'Internal - Poor Qualification'
]
},
competitor_lost_to: {
type: 'enumeration',
options: ['Gong', 'Outreach', 'Salesloft', 'Apollo', 'ZoomInfo', '6sense', 'Other']
},
loss_detail_notes: {
type: 'textarea',
description: 'Specific details about why we lost'
}
};
const requiredClosedWonFields = {
primary_win_reason: {
type: 'enumeration',
options: [
'Product Fit - Features',
'Product Fit - Integration',
'Pricing/Value',
'Relationship/Trust',
'Speed/Timeline',
'No Competitor (Greenfield)'
]
},
competitors_beaten: {
type: 'enumeration',
options: ['Gong', 'Outreach', 'Salesloft', 'Apollo', 'ZoomInfo', '6sense', 'None', 'Other'],
multiple: true
},
win_detail_notes: {
type: 'textarea'
}
};
From Call Recordings (Unstructured Data)
This is where AI really shines—extracting competitive intel from conversation transcripts:
// transcript-analysis.js
const analyzeTranscriptForCompetitiveIntel = async (transcript) => {
const prompt = `
Analyze this sales call transcript for competitive intelligence.
Extract:
1. Competitors mentioned (explicitly or implied)
2. Comparison statements made by the prospect
3. Objections raised that relate to competitors
4. Features or capabilities the prospect compared
5. Pricing discussions involving competitors
6. Sentiment toward us vs competitors
Format as JSON:
{
"competitors_mentioned": ["name"],
"comparisons": [
{
"competitor": "name",
"topic": "what was compared",
"prospect_preference": "us|them|neutral",
"quote": "relevant quote from transcript"
}
],
"competitive_objections": [
{
"objection": "the objection",
"competitor_context": "how competitor relates",
"how_handled": "what rep said" | null
}
],
"feature_gaps_mentioned": ["feature we lack that competitor has"],
"our_advantages_mentioned": ["things prospect liked about us vs them"]
}
Transcript:
${transcript}
`;
const analysis = await claude.complete(prompt);
return JSON.parse(analysis);
};
From Exit Surveys
Create a simple lost deal survey that captures qualitative data:
// lost-deal-survey.js
const lostDealSurvey = {
questions: [
{
id: 'primary_reason',
text: 'What was the main reason you chose not to move forward with us?',
type: 'single_choice',
options: [
'Went with a competitor',
'Decided to keep current solution',
'Project/budget was cancelled',
'Timing wasn\'t right',
'Product didn\'t meet our needs',
'Pricing was too high',
'Other'
]
},
{
id: 'competitor_chosen',
text: 'If you went with a competitor, which one?',
type: 'text',
conditional: { question: 'primary_reason', value: 'Went with a competitor' }
},
{
id: 'competitor_advantage',
text: 'What did they offer that we didn\'t?',
type: 'textarea',
conditional: { question: 'primary_reason', value: 'Went with a competitor' }
},
{
id: 'what_would_change',
text: 'What would have made you choose us instead?',
type: 'textarea'
}
]
};
Step 2: Pattern Analysis
Now we analyze across all data sources to find patterns:
// pattern-analysis.js
const analyzeCompetitorPatterns = async (competitor) => {
// Get all deals where this competitor was involved
const lostToCompetitor = await getDealsLostTo(competitor);
const wonAgainstCompetitor = await getDealsWonAgainst(competitor);
const analysis = {
competitor,
summary: {
totalDeals: lostToCompetitor.length + wonAgainstCompetitor.length,
winRate: wonAgainstCompetitor.length / (lostToCompetitor.length + wonAgainstCompetitor.length),
avgDealSizeWon: average(wonAgainstCompetitor.map(d => d.amount)),
avgDealSizeLost: average(lostToCompetitor.map(d => d.amount))
},
// Why we lose
lossReasons: groupAndCount(lostToCompetitor, 'primary_loss_reason'),
// Example: { 'Lost on Price': 12, 'Lost on Features': 8, 'Lost on Relationship': 3 }
// Why we win
winReasons: groupAndCount(wonAgainstCompetitor, 'primary_win_reason'),
// Example: { 'Product Fit - Integration': 15, 'Speed/Timeline': 9 }
// Stage analysis
lossStageDistribution: groupAndCount(lostToCompetitor, 'stage_when_lost'),
winStageDistribution: groupAndCount(wonAgainstCompetitor, 'stage_when_won'),
// Feature gaps (aggregated from transcripts)
featureGaps: await aggregateFeatureGaps(competitor),
// Our advantages
ourAdvantages: await aggregateAdvantages(competitor),
// Common objections
commonObjections: await aggregateObjections(competitor)
};
// Generate AI summary
analysis.aiSummary = await generateCompetitorSummary(analysis);
return analysis;
};
Step 3: Dynamic Battlecard Generation
Static battlecards go stale. Generate them from live data:
// battlecard-generator.js
const generateBattlecard = async (competitor) => {
const patterns = await analyzeCompetitorPatterns(competitor);
const prompt = `
Create a sales battlecard for competing against ${competitor}.
Data:
- Win rate against them: ${(patterns.summary.winRate * 100).toFixed(0)}%
- Top loss reasons: ${JSON.stringify(patterns.lossReasons)}
- Top win reasons: ${JSON.stringify(patterns.winReasons)}
- Feature gaps they exploit: ${JSON.stringify(patterns.featureGaps)}
- Our key advantages: ${JSON.stringify(patterns.ourAdvantages)}
- Common objections: ${JSON.stringify(patterns.commonObjections)}
Format the battlecard as:
## Quick Facts
[3-4 bullet points a rep needs to know immediately]
## Where We Win
[Specific scenarios/criteria where we beat them]
## Where We Struggle
[Honest assessment of their advantages]
## Objection Responses
[Top 3-5 objections with talk tracks]
## Landmines to Set
[Questions to ask that expose their weaknesses]
## Proof Points
[Customer quotes/stats that help against this competitor]
Be specific. Use real data. No generic platitudes.
`;
const battlecard = await claude.complete(prompt);
return {
competitor,
generatedAt: new Date(),
dataPoints: patterns.summary.totalDeals,
content: battlecard,
metadata: patterns.summary
};
};
Example generated battlecard:
Battlecard: vs Gong
Generated from 47 competitive deals (Last updated: Feb 9, 2026)
Quick Facts
- Win rate: 38% (improving from 31% last quarter)
- We lose most often in Discovery stage (before we demo)
- They struggle with smaller teams (<20 reps)
- Our integration story is our biggest advantage
Where We Win
- Teams using HubSpot — Our native integration beats their Salesforce-first approach
- Price-sensitive buyers — We're 40% cheaper at comparable tiers
- Speed to value — Our implementation averages 2 weeks vs their 6-8
- SDR-heavy teams — Our workflow focus resonates more than their analytics focus
Where We Struggle
- Enterprise sales teams — Their brand recognition wins executive deals
- Call recording as primary need — Their core product is stronger
- Companies with Salesforce — Their integration is tighter
- Existing Gong customers — Switching costs are high
Objection Responses
"Gong is the market leader"
"They're great for call analytics. But you mentioned your biggest challenge is SDR efficiency, not call scoring. MarketBetter was built specifically for SDR workflows—it tells your reps exactly what to do, not just what happened. Let me show you the Daily Playbook."
"Your call recording isn't as robust"
"You're right—if deep conversation intelligence is your #1 priority, Gong does that well. But from what you've described, you need your reps to book more meetings, not analyze more calls. Would you rather have perfect call transcripts or 2x the meetings to transcribe?"
"We already have Gong"
"Many of our customers use both. Gong for calls, MarketBetter for the workflow. The question is: once Gong shows you what happened on a call, what tells your reps what to do next? That's the gap we fill."
Landmines to Set
- "How long did Gong implementation take?" (Usually 2+ months)
- "How many of your reps actually log in weekly?" (Often <50%)
- "What happens after Gong scores a call?" (Usually nothing automated)
- "Can you show me your daily SDR workflow in Gong?" (They can't)
Proof Points
- CallRail switched from Gong: "We needed action, not just analytics"
- 3 customers running both: Use case differentiation
- Implementation time: 14 days average vs 60 for Gong

Step 4: Real-Time Deal Alerts
When a competitive deal is identified, surface relevant intelligence:
// deal-alerts.js
const onDealUpdated = async (deal) => {
// Check if competitor was added
if (deal.changed.competitor && deal.competitor) {
const battlecard = await getBattlecard(deal.competitor);
const patterns = await analyzeCompetitorPatterns(deal.competitor);
// Alert rep with relevant intel
await slack.postMessage({
channel: deal.owner.slackId,
blocks: [
{
type: 'header',
text: { type: 'plain_text', text: `⚔️ Competitive Deal: ${deal.name} vs ${deal.competitor}` }
},
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*Win rate vs ${deal.competitor}:* ${(patterns.summary.winRate * 100).toFixed(0)}%\n*Key to winning:* ${patterns.winReasons[0]}\n*Watch out for:* ${patterns.lossReasons[0]}`
}
},
{
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: '📋 Full Battlecard' },
url: battlecard.url
},
{
type: 'button',
text: { type: 'plain_text', text: '🎯 Similar Wins' },
action_id: 'show_similar_wins',
value: JSON.stringify({ competitor: deal.competitor, dealId: deal.id })
}
]
}
]
});
}
};
Step 5: Continuous Learning
The repository improves over time:
// learning-loop.js
// Weekly analysis
const weeklyCompetitiveReview = async () => {
const competitors = await getActiveCompetitors();
for (const competitor of competitors) {
const currentPatterns = await analyzeCompetitorPatterns(competitor);
const lastWeekPatterns = await getHistoricalPatterns(competitor, '7d');
// Detect significant changes
const winRateChange = currentPatterns.summary.winRate - lastWeekPatterns.summary.winRate;
if (Math.abs(winRateChange) > 0.1) {
// 10% win rate change is significant
await slack.postMessage({
channel: '#competitive-intel',
text: `📊 *Win rate vs ${competitor} ${winRateChange > 0 ? 'improved' : 'declined'}* by ${Math.abs(winRateChange * 100).toFixed(0)}%\n\nNew patterns detected:\n${await summarizeChanges(currentPatterns, lastWeekPatterns)}`
});
}
// Check if battlecard needs refresh
const battlecard = await getBattlecard(competitor);
const daysSinceUpdate = daysBetween(battlecard.generatedAt, new Date());
const newDataPoints = currentPatterns.summary.totalDeals - battlecard.dataPoints;
if (daysSinceUpdate > 30 || newDataPoints > 10) {
// Regenerate battlecard
const newBattlecard = await generateBattlecard(competitor);
await saveBattlecard(newBattlecard);
await slack.postMessage({
channel: '#competitive-intel',
text: `🔄 Updated battlecard for ${competitor} (${newDataPoints} new data points)\n\n*Key changes:*\n${await summarizeBattlecardChanges(battlecard, newBattlecard)}`
});
}
}
};
Implementation Checklist
Week 1: Data Capture
- Add required fields to CRM for closed deals
- Create lost deal survey workflow
- Set up transcript analysis pipeline (if using Gong/Chorus)
Week 2: Analysis Engine
- Build pattern analysis functions
- Create competitor profile structure
- Implement aggregation logic
Week 3: Battlecards
- Design battlecard template
- Build generation pipeline
- Set up storage and versioning
Week 4: Distribution
- Create deal alerts
- Build Slack integration
- Set up weekly review automation
The Payoff
Teams with systematic win/loss analysis see:
| Metric | Without Repository | With Repository |
|---|---|---|
| Competitive win rate | 35% | 48% |
| Time to prep for competitive deals | 2 hours | 15 minutes |
| Battlecard usage by reps | 12% | 78% |
| Objection response consistency | Low | High |
That 13-point win rate improvement on competitive deals? On $2M in competitive pipeline, that's $260K in new wins.
What's Next?
Once your repository is running:
- Add market intelligence — Pull competitor pricing changes, feature announcements, hiring signals
- Build coaching workflows — Route reps to training based on loss patterns
- Create executive reporting — Monthly competitive landscape summaries
- Enable product feedback — Surface feature gaps to product team systematically
Ready to stop losing deals to the same competitor twice? Book a demo to see how MarketBetter combines competitive intelligence with AI-powered SDR workflows.
Related reading:
