Channel strategy · A field note

Audit any brand's e-commerce without their analytics.

Every digital storefront is visible from the outside. Five public tools, one Python script, one benchmark. The composite tells you whether a brand's digital channel is a growth asset or a conversion leak.

6 brands · 4 categories
< $200 total API cost
One overnight run
No NDA · no vendor portal

Five layers, five tools — each independently sourced.

Layered diagnostics are honest: no composite score hides a bad signal. Run each layer with its own tool, then read the composite. Each row below took ≤20 minutes per brand to capture.

Layer Diagnostic Tool What it measures Time / brand
01Funnel depthPlaywrightClicks · friction flags · cart presence15 min
02Technical performancePageSpeed Insights + CrUXLighthouse mobile/desktop · Core Web Vitals2 API calls
03Traffic efficiencySimilarWeb-tierVisits · bounce · session · paid mix1 lookup
04Feature parityPlaywright + ScrapingBee18-feature rendered-DOM audit, regex-based20 min
05Search visibilitySerpAPIOrganic + Google Shopping positions20–40 queries
Claude Code · Playwright · PageSpeed API · CrUX API · SimilarWeb · SerpAPI

The funnel is the product. Every extra click loses customers.

A headless Chromium walks each brand's path from homepage to checkout. The script counts every required click, flags friction (ZIP gates, dealer redirects, quote-form replacements), and records the configurator depth before "Add to Cart" enables.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(viewport={"width": 1440, "height": 900})

    # Walk: homepage → category → PDP → configure → cart
    page.goto("https://brand.com", wait_until="networkidle")
    page.click("text=Sofas")
    page.click(".product-card >> nth=0")
    # ... record every required interaction before Add to Cart enables
    # Flag if Add to Cart is absent (dealer redirect, ZIP gate, quote form)

Friction flags also captured: ZIP gate (price hidden behind a ZIP), dealer redirect (Add-to-Cart replaced by "Find a dealer"), login wall, quote form (no cart), configurator depth (count of required choices). Each is a board-level decision, not a UI bug.

PageSpeed Insights lab + CrUX field. Two signals, two stories.

PSI runs a single deterministic Lighthouse pass — useful for apples-to-apples lab comparison. CrUX gives 25 weeks of real-user Core Web Vitals. A brand that relaunched its site in 2023 shows a CrUX inflection point. A brand that's flat across 24 months hasn't invested.

def get_scores(url, strategy="mobile"):
    r = requests.get(
        "https://www.googleapis.com/pagespeedonline/v5/runPagespeed",
        params={"url": url, "strategy": strategy, "key": PSI_KEY},
    )
    audits = r.json()["lighthouseResult"]["audits"]
    return {
        "performance": audits["performance"]["score"] * 100,
        "lcp_ms":      audits["largest-contentful-paint"]["numericValue"],
        "cls":         audits["cumulative-layout-shift"]["numericValue"],
        "tbt_ms":      audits["total-blocking-time"]["numericValue"],
    }

Raw visits are noisy. Visits-per-dollar reveals the real digital channel.

A $3B brand naturally gets more visits than a $300M brand. The honest signal is visits ÷ revenue ($M). Below: real SimilarWeb-tier data for ten furniture brands. Toggle the peer set — the medians and Bassett's percentile recompute live.

18 features. 10 brands. The grid is the finding.

Each cell came from a rendered-DOM check — not a static-HTML scrape (which over-credits features that show up in framework chunks but never reach the user). Y = vendor signature matched (e.g. cylindo for AR/3D, Bazaarvoice for PDP reviews). P = weaker pattern. N = nothing detected in {home, category, PDP}.

deterministic Audit date 2026-04-30 · Each cell has a regex match + DOM snippet in the data bundle · 18 features ranked by category benchmark (Wayfair-defined customer expectations).

The counterintuitive part — when feature parity exists, the gap is upper-funnel.

Stack the five layers on a single $450M, 100-year-old furniture manufacturer. The diagnostic surfaces a non-obvious story: features are fine; the storefront isn't broken. The gap is upper-funnel — acquisition, engagement, and the unstaffed top of the funnel.

It's not an IT problem. It's a decision problem.

Bassett ships 10 of 18 modern e-commerce features — above the peer median of 8. The infrastructure is adequate; the configurator is real; AR (Cylindo) and 3D viewers ship on every sofa PDP. The earlier "the legacy brand neglected features" narrative was wrong.

What's missing is upstream: 22% of peer median monthly traffic, a session length half the peer median, and a paid-traffic mix one-third of peer leaders. Each of those is a board-level allocation choice — not a developer-level accident. The diagnostic isn't a UX score. It's a capital-allocation x-ray.

Every tool is public. Every API is free or under $50.

What's expensive about competitive intelligence isn't access — it's framing. Knowing that funnel click count is the single most predictive variable, that visits-per-$M revenue is the right normalization (not raw visits), that lab data and field data tell different stories. The tools below are what we ran. The full data bundle includes the source xlsx and the detection JSON.

Playwright

Headless Chromium that walks the funnel and counts every required click. Pure Python, runs overnight on a single machine.

playwright.dev →

PageSpeed Insights API

Lighthouse lab scores — performance, LCP, CLS, TBT in one call. Free (PSI_API_KEY, 25k req/day).

pagespeed.web.dev →

CrUX API

Real-user Core Web Vitals — 28-day field data. 25-week history available via CrUX History API. Free.

developer.chrome.com/docs/crux →

SimilarWeb (public widget API)

Visits, bounce rate, session duration, traffic-source mix. Public estimates carry ±20% noise on small sites — flagged as such.

similarweb.com →

SerpAPI

Programmatic Google results — organic + Shopping carousel + paid presence. ~$50/mo for ≤5k requests.

serpapi.com →

Claude Code

Wrote the scrapers, the scoring rubric, the orchestration glue, and the audit reconciliation. The diagnostic took two evenings end-to-end.

claude.com/product/claude-code →

Download the full data bundle.

Original xlsx for E1–E4, the merged JSON the site reads, and a methodology README. CC BY 4.0 — use it, audit it, run it on your own category.

↓ ecomm-diagnostic-bundle.zip
Snapshot 2026-04-30 · audit reconciled 2026-05-12 · 10 brands × 18 features · 10 SEO keywords · ~89 KB zipped