Skip to main content

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.

ToolAgent surfaceUse for
Cloudflare Browser Run/markdown, /json, /linksRender the listing. Structured extract. Pagination links.
Firecrawl/v2/search with includeDomains, /v2/scrape JSON, /v2/mapResolve the real listing URL. Scrape reviews. Map /reviews and /alternatives.
Exa/search includeDomains, /contentsBackup 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:

  1. Find this product on G2-class sites.
  2. Pull displayed ratings, review counts, and reviewer themes.
  3. Pull the alternatives / "vs" graph the directory already computed.
  4. 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 blocked and 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.

#SiteApexJobSkip when
1G2g2.comReviews, grids, alternatives, vs pages. Canonical for profiles.—
2Capterracapterra.comReviews, pricing hints, alternatives. Canonical for profiles.—
3TrustRadiustrustradius.comLonger verified reviews, scorecards, comparisons.—
4PeerSpotpeerspot.comEnterprise IT comparisons, "vs," peer Q&A.Consumer / SMB-only tools
5Gartner Peer Insightsgartner.com/reviewsEnterprise peer ratings by market.Full text often gated
6SoftwareReviews (Info-Tech)softwarereviews.comData Quadrant, capability scores.Report PDF gated
7SelectHubselecthub.comRequirements matrices, category shortlists.—
8FeaturedCustomersfeaturedcustomers.comVendor-verified customer reviews and case studies.No vendor page
9AlternativeToalternativeto.netCrowd alternatives graph, not review depth.—
10Software Advicesoftwareadvice.comAdvice guides + reviews. Gartner Digital Markets.Capterra already scraped
11GetAppgetapp.comDirectory + reviews. Gartner Digital Markets.Capterra already scraped
12SourceForgesourceforge.net/softwareDirectory, reviews, category lists. Slashdot Media.—
13Slashdot Softwareslashdot.org/softwareSame family as SourceForge. Category compare.SourceForge already scraped for the same listing
14Clutchclutch.coB2B services and SIs, not the ERP SKU. Use for implementers.Product-only research
15GoodFirmsgoodfirms.coSoftware + agency directory, reviews.—
16FinancesOnlinefinancesonline.comEditorial score + user reviews.Treat editorial as editorial
17Crozdeskcrozdesk.comCategory score, alternatives.—
18SaaSworthysaasworthy.comFeature comparison tables, alternatives.—
19OMR Reviewsomr.comDACH/EU user reviews.Non-EU vendor, no listing
20Appvizerappvizer.comFR/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):

  1. Resolve URL (§2).
  2. Extract listing card.
  3. If status is ok and the job needs themes, extract reviews with the cap.
  4. 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>_*.md or 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.
  • 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.