Case study — Marketplace intelligence

An audit engine for marketplace listings

Reviews mined, competitors mapped, copy gaps scored, listings rewritten — a full Amazon audit produced as one run, for brands that decide on evidence.

Try the live demo30 seconds · representative sample data · nothing leaves your browser
Year
2025–2026
Role
Product · engineering
Status
In production
Stack
Cloudflare Workers · tRPC · Durable Objects · D1 · Drizzle · Next.js · R2
Relationship
Selected delivery work; the public case uses a functional project name.
Market
Marketplace brands; client identity is not disclosed publicly.

The problem

Brands were auditing listings by hand.

For a brand on Amazon, a serious listing audit means reading hundreds of reviews, comparing six or more competitor listings line by line, and guessing which keywords actually matter. Agencies charge for weeks of that work — and it goes stale the moment prices move.

The brief: turn the whole audit into one run. Scrape the listing, pull the full review history, map the competitive set, and come back with rewrites a brand can act on — every claim traceable to evidence.

The system

How it fits together.

Listing scrapestructured dataReview datasetasync snapshotJob stateDurable ObjectAnalysis enginematrices · gapsStorageD1 · R2Audit scoreevidence-backedRecommendationslisting rewrites

simplified public map of implemented components and boundaries

Try it

Run the audit yourself.

This is a representative replay of the workflow — it demonstrates the stages, panels, and output shape. Pick a product, press run.

Interactive demo — representative data in your browser
  1. Scraping listing
  2. Mining reviews
  3. Mapping competitors
  4. Scoring & recommendations

Pick a product and run the audit — the pipeline replays the workflow on representative data. Nothing is generated live; this illustrates the system's output shape, end to end.

The build

Three hard problems, solved in order.

01

Reviews behind a login wall

Amazon gates deep review pages. Instead of fighting it per-request, the system triggers an asynchronous review-dataset snapshot early in the run and processes it in parallel with the competitor scan — polling schedules, error fallbacks, and cost settlement handled by the worker.
Dataset API · async polling
02

Six listings, one comparable matrix

Bullets, taglines, descriptors, image counts, and video metadata from six competitors are normalized into structured copy and visual matrices — so a gap is a cell you can point at, not an impression.
matrix services · LLM analysis
03

Recommendations that cite their evidence

The rewrite engine aggregates review pain points and keyword gaps, then drafts listing copy where every suggestion links back to the cluster or competitor row that justifies it. No "best practices" filler.
recommendation engine
04

Serverless, because audits are bursty

The whole backend runs on edge workers with a per-project state room coordinating job progress. Capacity can scale with audit demand while job state remains resumable and inspectable.
Workers · Durable Objects · D1

Implementation evidence

Source snapshotsraw listing and review inputs retained for traceability
Comparison matrixcompetitor, copy, visual, and review signals aligned for review
Evidence linksrecommendations remain connected to their supporting observations

Constraint

The output needed to preserve source evidence while several analysis jobs completed asynchronously.

Tradeoff

The system favors traceable snapshots and resumable jobs over a fast but opaque single prompt.

The interactive audit is a representative browser demonstration. It illustrates the workflow without exposing client data or claiming commercial uplift.

For your business

Discuss a related system.

If your product sells on a marketplace — Amazon or otherwise — this same system audits your listings, watches competitors, and hands your team rewrites with receipts. It also generalizes: review mining and competitor matrices work for any category with public listings.

Next caseA 3D placement pipeline from Blender to render farm →