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
Try our Tech Stack Detector β instantly detect any company's tech stack from their website. No signup required.
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.
