AI Review Analysis for Competitive Intelligence with Claude [2026]
Your competitors' customers are telling you exactly how to beat them. They're leaving 1-star reviews on G2, complaining on Twitter, and posting detailed critiques on Capterra.
But who has time to read 500 reviews?
That's where AI comes in. In this guide, I'll show you how to build an automated review analysis system with Claude that extracts competitive intelligence, tracks sentiment trends, and surfaces sales opportunities—all while you sleep.

Why Reviews Are Competitive Gold
Reviews contain unfiltered intelligence that you can't get anywhere else:
- Real pain points — What customers actually hate (not what marketing says)
- Feature gaps — What competitors are missing that you could exploit
- Switching triggers — What makes customers leave for alternatives
- Pricing complaints — How customers really feel about value
- Support quality — Where competitors are dropping the ball
A single detailed review can give you a battlecard-worthy insight. Hundreds of reviews? That's a strategic playbook.
The Review Intelligence Stack
Here's what we're building:
- Collector — Scrape reviews from G2, Capterra, TrustRadius
- Analyzer — Claude extracts structured insights
- Aggregator — Trends and patterns across time
- Alerter — Notify sales when opportunities surface
Let's build each piece.
Step 1: Collecting Reviews
First, gather the raw data. G2 and Capterra have APIs, but you can also scrape public review pages:
// review-collector.js
const cheerio = require('cheerio');
const axios = require('axios');
async function collectG2Reviews(productSlug, pages = 5) {
const reviews = [];
for (let page = 1; page <= pages; page++) {
const url = `https://www.g2.com/products/${productSlug}/reviews?page=${page}`;
const { data } = await axios.get(url, {
headers: { 'User-Agent': 'Mozilla/5.0...' }
});
const $ = cheerio.load(data);
$('.review-item').each((i, el) => {
reviews.push({
rating: $(el).find('.star-rating').attr('data-rating'),
title: $(el).find('.review-title').text().trim(),
pros: $(el).find('.pros-content').text().trim(),
cons: $(el).find('.cons-content').text().trim(),
date: $(el).find('.review-date').text().trim(),
industry: $(el).find('.reviewer-industry').text().trim(),
companySize: $(el).find('.reviewer-company-size').text().trim(),
role: $(el).find('.reviewer-role').text().trim()
});
});
await sleep(2000); // Be respectful
}
return reviews;
}
Competitors to Track
For a GTM/sales intelligence company, you'd track:
- Direct competitors: Warmly, Common Room, 6sense, ZoomInfo
- Adjacent tools: Apollo, Outreach, Salesloft
- Emerging players: Unify GTM, Clay, Clearbit
Step 2: Analyzing with Claude
Here's where it gets interesting. Claude processes each review and extracts structured intelligence:
// review-analyzer.js
const Anthropic = require('@anthropic-ai/sdk');
const claude = new Anthropic();
async function analyzeReview(review, competitor) {
const response = await claude.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2048,
messages: [{
role: 'user',
content: `Analyze this ${competitor} review for competitive intelligence:
**Rating:** ${review.rating}/5
**Title:** ${review.title}
**Pros:** ${review.pros}
**Cons:** ${review.cons}
**Reviewer:** ${review.role} at ${review.companySize} company in ${review.industry}
Extract and return as JSON:
{
"sentiment": "positive|negative|mixed",
"pain_points": ["specific issues mentioned"],
"praised_features": ["what they like"],
"missing_features": ["what they wish existed"],
"pricing_feedback": "any pricing comments",
"support_feedback": "any support comments",
"switching_signals": ["any hints they might switch"],
"competitor_mentions": ["other products mentioned"],
"use_case": "how they use the product",
"sales_opportunity": {
"is_opportunity": true/false,
"reason": "why this could be a sales opportunity",
"battlecard_insight": "insight for sales team"
}
}`
}]
});
return JSON.parse(response.content[0].text);
}
Batch Processing
Process reviews efficiently with batching:
async function analyzeAllReviews(reviews, competitor) {
const results = [];
// Process in batches of 10
for (let i = 0; i < reviews.length; i += 10) {
const batch = reviews.slice(i, i + 10);
const batchResults = await Promise.all(
batch.map(review => analyzeReview(review, competitor))
);
results.push(...batchResults);
console.log(`Processed ${Math.min(i + 10, reviews.length)}/${reviews.length}`);
await sleep(1000); // Rate limiting
}
return results;
}

Step 3: Aggregating Insights
Individual reviews are useful. Patterns across hundreds are powerful:
async function generateCompetitiveReport(analyzedReviews, competitor) {
const response = await claude.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 4096,
system: `You are a competitive intelligence analyst.
Generate actionable insights for a sales team.
Be specific and quote reviews when relevant.`,
messages: [{
role: 'user',
content: `Analyze these ${analyzedReviews.length} ${competitor} reviews and generate a competitive intelligence report:
${JSON.stringify(analyzedReviews, null, 2)}
Generate:
## Executive Summary
Key findings in 3 bullets
## Top Pain Points (ranked by frequency)
What customers complain about most
## Feature Gaps
What's missing that we could highlight
## Pricing Perception
How customers feel about value/price
## Support Quality
Strengths and weaknesses of their support
## Switching Triggers
What makes customers leave
## Sales Battlecard Updates
Specific talking points for our sales team
## Recommended Actions
What we should do with this intelligence`
}]
});
return response.content[0].text;
}
Step 4: Alerting on Opportunities
Set up real-time alerts when high-value signals appear:
async function checkForOpportunities(newReviews) {
const opportunities = newReviews.filter(r =>
r.analysis.sales_opportunity.is_opportunity
);
for (const opp of opportunities) {
// Check if reviewer's company is in our target market
const company = await enrichCompany(opp.review.companyName);
if (matchesICP(company)) {
await slack.postMessage({
channel: '#sales-opportunities',
text: `🎯 *Potential Opportunity Detected*`,
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*${company.name}* left a ${opp.review.rating}-star review of *${opp.competitor}*
*Signal:* ${opp.analysis.sales_opportunity.reason}
*Key Pain Points:*
${opp.analysis.pain_points.map(p => `• ${p}`).join('\n')}
*Battlecard Insight:*
> ${opp.analysis.sales_opportunity.battlecard_insight}`
}
},
{
type: 'actions',
elements: [
{ type: 'button', text: { type: 'plain_text', text: 'Add to Outreach' }, action_id: 'add_prospect' },
{ type: 'button', text: { type: 'plain_text', text: 'View Full Review' }, url: opp.review.url }
]
}
]
});
}
}
}
What Intelligence Looks Like
Here's a real example of what Claude extracts from a 2-star Warmly review:
Input Review:
"We tried Warmly for visitor identification but the data quality wasn't there. Out of 100 identified companies, maybe 20 were accurate. Also, $35K/year for what amounts to a widget is insane. Looking at alternatives now."
Claude's Analysis:
{
"sentiment": "negative",
"pain_points": [
"Data quality issues - only 20% accuracy on company identification",
"High price point ($35K/year) not justified by value"
],
"switching_signals": [
"Actively looking at alternatives",
"Price-to-value mismatch frustration"
],
"sales_opportunity": {
"is_opportunity": true,
"reason": "Actively evaluating alternatives, frustrated with price and accuracy",
"battlecard_insight": "Lead with data quality comparisons and ROI calculator showing value at our price point"
}
}
That's a warm lead and a battlecard insight in one.
Tracking Trends Over Time
Monthly trend analysis reveals strategic shifts:
async function monthlyTrendAnalysis(competitor) {
const lastMonth = await getReviewsByPeriod(competitor, 'last-30-days');
const previousMonth = await getReviewsByPeriod(competitor, '30-60-days-ago');
const analysis = await claude.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2048,
messages: [{
role: 'user',
content: `Compare ${competitor}'s reviews from the last 30 days vs the previous 30 days:
LAST 30 DAYS (${lastMonth.length} reviews):
Average rating: ${calculateAverage(lastMonth, 'rating')}
Top complaints: ${aggregateComplaints(lastMonth)}
PREVIOUS 30 DAYS (${previousMonth.length} reviews):
Average rating: ${calculateAverage(previousMonth, 'rating')}
Top complaints: ${aggregateComplaints(previousMonth)}
Identify:
1. Sentiment trend (improving/declining/stable)
2. New complaints emerging
3. Resolved issues (complaints disappearing)
4. Any correlation with product releases or news`
}]
});
return analysis.content[0].text;
}
Integration with Sales Workflows
HubSpot: Auto-Update Battlecards
// When new insights found, update company records
async function updateBattlecards(insights) {
for (const insight of insights.battlecard_updates) {
await hubspot.crm.objects.notes.create({
associations: [{
to: { id: insight.competitorCompanyId },
types: [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 202 }]
}],
properties: {
hs_note_body: `📊 **Competitive Intel Update**\n\n${insight.update}\n\n_Source: G2 Review Analysis_`,
hs_timestamp: Date.now()
}
});
}
}
OpenClaw: Automated Monitoring
Set up 24/7 monitoring with OpenClaw:
# In your OpenClaw agent config
agents:
competitive-intel:
schedule: "0 6 * * *" # Daily at 6am
task: |
Check for new competitor reviews on G2 and Capterra.
Analyze any with rating <= 3 stars.
Alert #sales-intel channel with opportunities.
Update battlecard docs in Notion.
Privacy and Ethics
Important considerations:
- Public reviews only — Only analyze publicly posted reviews
- Don't scrape aggressively — Respect rate limits and robots.txt
- No reviewer doxxing — Don't try to identify individual reviewers for outreach
- Aggregate, don't stalk — Use for strategic insights, not individual targeting
ROI of Review Intelligence
| Activity | Time (Manual) | Time (AI) | Savings |
|---|---|---|---|
| Read 100 reviews | 5 hours | 0 | 5 hours |
| Extract key themes | 3 hours | 10 min | 2.8 hours |
| Update battlecards | 2 hours | 30 min | 1.5 hours |
| Generate report | 4 hours | 15 min | 3.75 hours |
| Weekly Total | 14 hours | 55 min | 13 hours |
That's 52 hours/month saved on competitive intelligence alone.
Getting Started
- Pick 3-5 competitors to monitor
- Set up collection for G2 (easiest API access)
- Run initial analysis on last 6 months of reviews
- Generate baseline report to share with sales
- Automate weekly updates going forward
Related Resources
- Automating Competitor Intelligence with AI Agents
- Competitive Battlecards with Claude
- Claude 200K Context for Sales Workflows
Turn Competitor Weaknesses Into Your Wins
MarketBetter helps GTM teams work smarter with AI-powered competitive intelligence. Know what to say, when to say it, and who to target—all automatically.
See how teams are using AI to outsmart the competition.
