Comparison research
Product name in. Listing URLs out. Then a structured extract of ratings,
reviewer themes, alternatives, and category peers. Do not mint a
C_xxxxx profile, bind competitor_ids, or quote a rating on a call
from this pass.
This page is the directory-site companion to Research. Canonical competitor profiles still need requester-supplied G2 and Capterra review links. See Competitors.
Tools
Same default stack as Research. These sites are
JS-heavy and often return 403 to a naked GET. Render, then extract.
| Tool | Agent surface | Use for |
|---|---|---|
| Cloudflare Browser Run | /markdown, /json, /links | Render the listing. Structured extract. Pagination links. |
| Firecrawl | /v2/search with includeDomains, /v2/scrape JSON, /v2/map | Resolve the real listing URL. Scrape reviews. Map /reviews and /alternatives. |
| Exa | /search includeDomains, /contents | Backup discovery when Firecrawl search is thin. |
POST https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-rendering/{markdown|json|links}
POST https://api.firecrawl.dev/v2/{search|scrape|map}
Default loop: Firecrawl /search to resolve the listing. Browser Run
or Firecrawl /scrape to read it. Stop on a challenge, login, or
paywall. Do not retry with a different fingerprint, cookie, or solver.
Context
Use this page when the job is:
- Find this product on G2-class sites.
- Pull displayed ratings, review counts, and reviewer themes.
- Pull the alternatives / "vs" graph the directory already computed.
- Pull category peers (who else sits on the same grid).
Do not use it to invent a competitor, to average two sites into one score, or to treat a reviewer sentence as product behavior.
Axioms
- Public pages only. No account, no "unlock reviews," no bot-check
bypass. If the tool returns a challenge or gate, record
blockedand stop that site. - Never guess a Capterra numeric id, a G2 slug, or a rating. Resolve the
URL from search. Copy metrics as displayed, with
retrieved_at. - Say
reviewers describe/one reviewer says. Keep site scores separate. Do not blend G2 and Capterra. - Cap volume. Three review pages or ~50 reviews per site unless a person asks for more. Prefer newest first.
- Gartner Digital Markets (Capterra, GetApp, Software Advice) and Slashdot Media (SourceForge, Slashdot Software) syndicate. Do not count the same review three times.
- A listing URL is a candidate for the competitor workflow. It does not replace requester-supplied G2 and Capterra links.
1. The 20 sites
Priority order for a sweep, not a traffic ranking. Always run 1–2. Run 3–9 when you need themes or an alternatives graph. Run 10–18 when 1–9 are thin. Run 19–20 when the vendor or buyer is EU/DACH.
| # | Site | Apex | Job | Skip when |
|---|---|---|---|---|
| 1 | G2 | g2.com | Reviews, grids, alternatives, vs pages. Canonical for profiles. | — |
| 2 | Capterra | capterra.com | Reviews, pricing hints, alternatives. Canonical for profiles. | — |
| 3 | TrustRadius | trustradius.com | Longer verified reviews, scorecards, comparisons. | — |
| 4 | PeerSpot | peerspot.com | Enterprise IT comparisons, "vs," peer Q&A. | Consumer / SMB-only tools |
| 5 | Gartner Peer Insights | gartner.com/reviews | Enterprise peer ratings by market. | Full text often gated |
| 6 | SoftwareReviews (Info-Tech) | softwarereviews.com | Data Quadrant, capability scores. | Report PDF gated |
| 7 | SelectHub | selecthub.com | Requirements matrices, category shortlists. | — |
| 8 | FeaturedCustomers | featuredcustomers.com | Vendor-verified customer reviews and case studies. | No vendor page |
| 9 | AlternativeTo | alternativeto.net | Crowd alternatives graph, not review depth. | — |
| 10 | Software Advice | softwareadvice.com | Advice guides + reviews. Gartner Digital Markets. | Capterra already scraped |
| 11 | GetApp | getapp.com | Directory + reviews. Gartner Digital Markets. | Capterra already scraped |
| 12 | SourceForge | sourceforge.net/software | Directory, reviews, category lists. Slashdot Media. | — |
| 13 | Slashdot Software | slashdot.org/software | Same family as SourceForge. Category compare. | SourceForge already scraped for the same listing |
| 14 | Clutch | clutch.co | B2B services and SIs, not the ERP SKU. Use for implementers. | Product-only research |
| 15 | GoodFirms | goodfirms.co | Software + agency directory, reviews. | — |
| 16 | FinancesOnline | financesonline.com | Editorial score + user reviews. | Treat editorial as editorial |
| 17 | Crozdesk | crozdesk.com | Category score, alternatives. | — |
| 18 | SaaSworthy | saasworthy.com | Feature comparison tables, alternatives. | — |
| 19 | OMR Reviews | omr.com | DACH/EU user reviews. | Non-EU vendor, no listing |
| 20 | Appvizer | appvizer.com | FR/EU directory, comparisons, guides. | Non-EU vendor, no listing |
Worked seed we already cite:
Global Shop G2 reviews
(read 2026-08-02 on the canonical profile). Resolve every other listing
from search. Do not guess a Capterra /p/{id}/.
2. Resolve the listing URL
Never construct Capterra ids. Never assume the G2 slug is the company legal name. Search, then pick.
POST /v2/search
{
"query": "\"{product name}\" reviews",
"includeDomains": ["{apex}"],
"limit": 5
}
Keep the hit whose path matches the site's listing shape below. Drop
blog posts, ads, /compare/ pages (unless the job is vs), and
/categories/ pages (unless the job is peers).
If zero hits: not_found. Do not pick a similarly named product.
If several products share a vendor, keep the SKU the buyer would name (ERP vs HCM vs a module). Record the URL you rejected.
3. URL cookbook
Templates are for after search returns a live slug or id. {slug} is
whatever the directory used, not our ID stem.
g2.com
product: /products/{slug}
reviews: /products/{slug}/reviews
reviews_page: /products/{slug}/reviews?page={n}
alternatives: /products/{slug}/competitors/alternatives
compare: /compare/{slug-a}-vs-{slug-b}
category: /categories/{category}
capterra.com
product: /p/{id}/{slug}/
reviews: /p/{id}/{slug}/reviews/
alternatives: /p/{id}/{slug}/alternatives/
category: /{category}-software/
search: /search/?query={q}
trustradius.com
product: /products/{slug}
reviews: /products/{slug}/reviews
competitors: /products/{slug}/competitors
compare: /compare/{slug-a}-vs-{slug-b}
peerspot.com
product: /products/{slug}-reviews
compare: /products/comparisons/{slug-a}-vs-{slug-b}
category: /categories/{category}
gartner.com
market: /reviews/market/{market-slug}
vendor: /reviews/vendor/{vendor-slug}
product: /reviews/market/{market-slug}/vendor/{vendor}/product/{product}
softwarereviews.com
product: /products/{slug-or-id}
category: /categories/{category}
selecthub.com
product: /{category}/{slug}/
category: /{category}/
featuredcustomers.com
vendor: /vendor/{slug}
reviews: /vendor/{slug}/reviews
alternativeto.net
software: /software/{slug}/
about: /software/{slug}/about/
softwareadvice.com
profile: /{category}/{slug}/
category: /{category}/
getapp.com
product: /{segment}-software/{slug}/ (path varies; trust search)
sourceforge.net
product: /software/{slug}/
category: /software/{category}/
slashdot.org
product: /software/{slug}/
category: /software/{category}/
clutch.co
profile: /profile/{slug}
category: /{category}
goodfirms.co
software: /software/{slug}
financesonline.com
product: /{slug}/
crozdesk.com
product: /{category}/{slug}
saasworthy.com
product: /product/{id}/{slug}
omr.com
product_en: /en/reviews/product/{slug}
product_de: /de/reviews/{slug}
appvizer.com
product: /{lang}/{category}/{slug}
After you have the product URL, Firecrawl map beats guessing extra paths:
POST /v2/map
{ "url": "{product_url}", "search": "reviews alternatives compare competitors" }
4. Extract
Render the page (Browser Run /json or Firecrawl scrape with
formats: [{ type: "json", schema: ... }]). Copy visible text. If a
field is not on the page, null. Do not fill from memory.
Listing card
One per site.
{
"site": "g2",
"url": "",
"retrieved_at": "YYYY-MM-DD",
"status": "ok | blocked | not_found | gated",
"product_name": "",
"vendor_name": "",
"slug": "",
"rating": null,
"rating_scale": 5,
"review_count": null,
"categories": [],
"description_on_page": "",
"pricing_hint": null,
"top_pros": [],
"top_cons": []
}
rating and review_count must be the figures shown next to each
other on that page. A star graphic without a count is review_count: null.
Reviews
Array, capped. Summarize body. Do not paste full review prose into a canonical profile later.
{
"site": "g2",
"url": "",
"retrieved_at": "YYYY-MM-DD",
"title": "",
"score": null,
"date": "",
"reviewer_role": null,
"industry": null,
"company_size": null,
"deployment": null,
"pros": [],
"cons": [],
"themes": [],
"body_summary": "",
"verbatim_ok": false
}
themes are short labels you assign (scheduling, training_burden,
reporting). body_summary is one or two sentences. Set
verbatim_ok: true only when you kept a short attributed quote.
Pagination: Cloudflare /links or the rel=next URL on the page. Stop
at 3 pages, ~50 reviews, or no next link.
Alternatives and vs
{
"source_url": "",
"seed_product": "",
"others": [
{ "name": "", "slug": null, "url": "", "why_listed": "" }
]
}
why_listed is whatever the directory showed (category overlap, "also
compared," switchers). It is not our judgment that they compete.
Category peers
From a category grid / shortlist / quadrant page:
{
"site": "g2",
"category_url": "",
"category_name": "",
"peers": [
{ "name": "", "listing_url": "", "rating": null, "review_count": null }
]
}
5. Jobs
Run one job per pass.
A. Listing sweep (default)
For sites in scope (always 1–2, then 3–9 as needed):
- Resolve URL (§2).
- Extract listing card.
- If
statusisokand the job needs themes, extract reviews with the cap. - Write one row per site into the table below.
site | status | listing_url | rating | review_count | retrieved_at | notes
B. Alternatives graph
From G2 /competitors/alternatives, Capterra /alternatives/,
TrustRadius /competitors, AlternativeTo /software/{slug}/, plus any
/compare/ links /links returns. Union by normalized name. Record
every source URL. Do not drop a name because it is not in our catalog.
Do not add it to the catalog from this job.
C. Category peers
Resolve the category slug from the listing card's categories[]. Scrape
the category URL. Keep the visible leaderboard / grid, not ads.
D. Head-to-head vs
Only when you already have two slugs. Hit /compare/{a}-vs-{b} on G2 or
TrustRadius, or PeerSpot /products/comparisons/. Extract the displayed
score table. Still keep per-site figures. Do not publish "we beat them
on G2" as a claim.
6. Agent runbook
product_name = <buyer-facing name>
sites = [g2, capterra] + optional
for site in sites:
hits = firecrawl.search(query='"'+product_name+'" reviews', includeDomains=[apex])
listing_url = first path that matches the cookbook
if none: row.status = not_found; continue
page = browser_run.json(listing_url, schema=listing_card)
if challenge or login: row.status = blocked; continue
if job includes reviews: scrape reviews pages 1..3
sleep / rate-limit
write table
stop
If JSON names a product that does not appear in the markdown, discard
the extract and re-read. Hallucinated ratings are worse than
not_found.
Done when: every in-scope site is ok, not_found, gated, or
blocked, each ok row has url + retrieved_at, and G2/Capterra URLs
(if ok) are ready to hand to a person for the competitor workflow.
What this is not
- Permission to write
docs/sales/competitors/C_<nnnnn>_*.mdor to supply guessed review links to that workflow. - Proof that a prospect uses the product. Directories list vendors, not our accounts. Customer URLs are Research and Domain scanning.
- A single blended score. Two sites disagree → keep both.
- License to scrape behind a login or to ignore a bot check.
Related knowledge
- Research — vendor sites, customer URLs, similar pages
- GEO — if the engine cites G2, this scrape is the follow-on
- AEO — developer comparison queries in coding harnesses
- ERP signal research — 50–500 ERP need / want / window sources
- Competitors
- GTM guide structure — 1.3 market landscape and 2.4 battlecards request sourced content only
Change log
- 2026-08-31 — First page: 20 B2B comparison sites, listing resolver, URL cookbook, extract schemas, capped review scrape. Cloudflare Browser Run + Firecrawl default.