Review Radar: G2 + Capterra SaaS Reviews & AI Battlecards
Pricing
Pay per event
Review Radar: G2 + Capterra SaaS Reviews & AI Battlecards
Scrape SaaS product reviews from G2 and Capterra into normalized records (rating, pros/cons, reviewer firmographics). Optional AI battlecards for competitor analysis: strengths, weaknesses, top complaints, and switching reasons.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Radar Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Scrape public SaaS product reviews from G2 and Capterra into normalized review records, and optionally generate one AI battlecard per product for competitor analysis (strengths, weaknesses, top complaints, switching reasons, comparison notes).
Built for competitive intel, win/loss research, RAG corpora, and agent workflows — without hand-copying review pages.
Why Review Radar?
- Dual-source in one run — mix G2 and Capterra URLs, slugs, or names.
- Normalized schema — same fields across platforms (
rating,pros,cons,text, reviewer role / company size when shown). - Safe Capterra resolution — Capterra keys products by numeric
/p/<id>/. Plain names (capterra:HubSpot) and wrong id+slug URLs are mapped via a curated catalog, or rejected with a cleartype: "error"row. Never returns reviews from the wrong product. - Optional AI battlecard — off by default; uses Apify's OpenRouter route (billed to the Apify account; no separate OpenAI/Anthropic key required on platform).
- Filters — max reviews, star buckets, published-after/before; pagination + dedupe by
reviewId. - Proxy defaults — Apify Proxy UNBLOCKER by default (no browser). Playwright fallback is off unless you enable it.
- Platform extras: scheduling, API, datasets (JSON/CSV/Excel), monitoring,
maxTotalChargeUsdcharge cap.
What data can it extract?
| Field | G2 | Capterra | Notes |
|---|---|---|---|
| platform | yes | yes | g2 or capterra |
| productName / productSlug | yes | yes | |
| rating, date, title, pros, cons, text | yes | yes | |
| url / reviewId | yes | yes | when present |
| reviewerRole | yes | yes | when shown |
| reviewerCompanySize | yes | N/A | Capterra list pages do not expose company size reliably |
| reviewerIndustry | N/A | N/A | Not present on list / Turbo Frame / RSC pages we scrape |
type=battlecard | optional | optional | AI summary row per product |
Pricing (pay-per-event)
| Event | When | Price (USD) |
|---|---|---|
actor-start | Once per run | $0.005 |
review-scraped | Each kept review row | $0.0015 |
battlecard-generated | Each AI battlecard row | $0.025 |
Platform compute + proxy (Unblocker) are separate Apify usage costs charged to the runner. Set maxTotalChargeUsd on the run to cap PPE spend. Always use a low maxReviews while testing.
Example: 1 product × 20 reviews, no AI ≈ $0.005 + 20×$0.0015 = $0.035 PPE (plus proxy/compute).
How to scrape G2 or Capterra reviews
- Open this Actor in Apify Console (or call the API).
- Paste one or more product review URLs or identifiers into Product URLs or slugs.
- G2:
https://www.g2.com/products/notion/reviews,notion, org2:notion - Capterra:
https://www.capterra.com/p/186596/Notion/reviews/(Notion id 186596),186596/Notion, orcapterra:Notion. Slack is/p/135003/Slack/
- G2:
- Set Max reviews per product (default 20 for cheap Store tests; pagination supports a few hundred).
- Leave proxy on UNBLOCKER (default). Keep Playwright off unless debugging.
- Optionally turn on Generate AI battlecard.
- Click Start and download the dataset.
Example inputs
Cheap Store test (matches the form prefill: Notion on G2 + Capterra):
{"productUrls": ["https://www.g2.com/products/notion/reviews","https://www.capterra.com/p/186596/Notion/reviews/"],"maxReviews": 20,"aiBattlecard": false}
Slack on both platforms (correct Capterra id 135003):
{"productUrls": ["https://www.g2.com/products/slack/reviews","https://www.capterra.com/p/135003/Slack/reviews/"],"maxReviews": 20,"aiBattlecard": false}
Names / slugs (catalog resolves common Capterra names):
{"productUrls": ["g2:asana","capterra:Asana"],"maxReviews": 50,"aiBattlecard": true}
Star + date filters:
{"productUrls": ["https://www.g2.com/products/slack/reviews"],"maxReviews": 100,"starRatings": ["1", "2", "3"],"publishedAfter": "2025-01-01","aiBattlecard": false}
Output
Dataset items are type: "review", type: "battlecard", or type: "error" (block, mismatch, empty page, battlecard skip). Download as JSON, CSV, or Excel.
Example review:
{"type": "review","platform": "g2","productSlug": "slack","productName": "Slack","rating": 4.5,"date": "2026-07-15T10:00:00.000Z","title": "Default team chat","pros": "Channels and integrations everywhere","cons": "Noise without good hygiene","reviewerRole": "Engineering Manager","reviewerCompanySize": "501-1000"}
Battlecard row (type: "battlecard")
Existing string arrays stay as-is for compatibility. Newer fields stamp the filters used and attach verified quotes per bullet:
| Field | Meaning |
|---|---|
strengths, weaknesses, topComplaints, switchingReasons, comparisonNotes | Short bullet strings (unchanged shape) |
filtersApplied | Which filters produced the card: starRatings, publishedAfter, publishedBefore, maxReviews, plus reviewsScraped vs reviewsSentToAi, caps (maxReviewsForAi / maxCharsForAi), and anyReviewTextTruncated when a field was shortened to fit |
strengthsEvidence (and parallel *Evidence fields) | Per-bullet { claim, supportingReviewCount, quotes[] }. Quotes are verbatim substrings of scraped review text, with date, rating, reviewId, reviewUrl when available. Counts come from cited review indices, not a free LLM number. |
reviewCountAnalyzed | Same as filtersApplied.reviewsSentToAi (kept for older integrations) |
summary, model, provider | Overview text and which model wrote the card |
A one-star-only run is identifiable because filtersApplied.starRatings is [1] (or whatever stars you selected). Empty/null star or date filters mean “no filter applied.”
Limits & tips
- Keep UNBLOCKER as the proxy group; residential/datacenter alone often get Cloudflare 403 on Capterra and DataDome on G2.
- Concurrency 1–2 is safest on challenge-prone sites.
- For Capterra, prefer
capterra:ProductNameor a verified/p/<id>/URL (examples: Notion186596, Slack135003, HubSpot CRM152373, Asana184581). - AI battlecard aims to include every scraped review when possible (cap ~200 reviews / ~100k characters). Long fields are trimmed per review before any review is dropped;
filtersAppliedrecords coverage and whether any text was truncated. Leave AI off for the cheapest raw exports. - Industry is not available on either source’s list pages; Capterra company size is N/A.
- Respect site Terms of Service and robots rules for your use case; this Actor scrapes publicly visible review content.
FAQ
Does it work with product names only?
Yes for common SaaS names via capterra:Name / g2:slug. Ambiguous or unknown Capterra names return an error row instead of wrong-product data.
Why are some firmographic fields empty?
G2 sometimes shows role and company size; Capterra list/RSC pages typically do not expose company size; neither exposes industry on the pages we scrape. Empty/null is honest, not a bug.
Will it burn my budget?
Use low maxReviews, keep aiBattlecard false, and set run maxTotalChargeUsd. The Actor stops charging further review-scraped events when the charge limit is reached.
Do I need my own OpenAI key?
No on Apify — battlecards use https://openrouter.apify.actor/api/v1 billed through the platform.
Browser / Playwright?
Off by default. HTTP + Unblocker is the supported path; browser fallback is for debugging only and is slower/costlier.