Review Radar: G2 + Capterra SaaS Reviews & AI Battlecards avatar

Review Radar: G2 + Capterra SaaS Reviews & AI Battlecards

Pricing

Pay per event

Go to Apify Store
Review Radar: G2 + Capterra SaaS Reviews & AI Battlecards

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

Radar Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

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 clear type: "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, maxTotalChargeUsd charge cap.

What data can it extract?

FieldG2CapterraNotes
platformyesyesg2 or capterra
productName / productSlugyesyes
rating, date, title, pros, cons, textyesyes
url / reviewIdyesyeswhen present
reviewerRoleyesyeswhen shown
reviewerCompanySizeyesN/ACapterra list pages do not expose company size reliably
reviewerIndustryN/AN/ANot present on list / Turbo Frame / RSC pages we scrape
type=battlecardoptionaloptionalAI summary row per product

Pricing (pay-per-event)

EventWhenPrice (USD)
actor-startOnce per run$0.005
review-scrapedEach kept review row$0.0015
battlecard-generatedEach 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

  1. Open this Actor in Apify Console (or call the API).
  2. Paste one or more product review URLs or identifiers into Product URLs or slugs.
    • G2: https://www.g2.com/products/notion/reviews, notion, or g2:notion
    • Capterra: https://www.capterra.com/p/186596/Notion/reviews/ (Notion id 186596), 186596/Notion, or capterra:Notion. Slack is /p/135003/Slack/
  3. Set Max reviews per product (default 20 for cheap Store tests; pagination supports a few hundred).
  4. Leave proxy on UNBLOCKER (default). Keep Playwright off unless debugging.
  5. Optionally turn on Generate AI battlecard.
  6. 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:

FieldMeaning
strengths, weaknesses, topComplaints, switchingReasons, comparisonNotesShort bullet strings (unchanged shape)
filtersAppliedWhich 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.
reviewCountAnalyzedSame as filtersApplied.reviewsSentToAi (kept for older integrations)
summary, model, providerOverview 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:ProductName or a verified /p/<id>/ URL (examples: Notion 186596, Slack 135003, HubSpot CRM 152373, Asana 184581).
  • 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; filtersApplied records 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.