Catalog Analysis  ·  Vertical Overview

A used outdoor & cycling
gear resale retailer.

A full read of a live storefront — every used, open-box, and pre-loved outdoor and cycling
listing across the catalog. One link in, zero manual setup, this is what came back.

Dataset
13,033 variants × 407 attributes
Vertical
Outdoor & Cycling Gear — Used & Open-Box Resale
Coverage
244 product types · stratified sample
Findings
200 analytical · 66 critical
Prepared by
EKOM
Prepared for
An Outdoor & Cycling Gear Resale Retailer

Before the findings.

This retailer sells used and open-box outdoor and cycling gear on Shopify — Smartwool, The North Face, Rapha, Patagonia, Norrøna, Castelli, and dozens more. Each listing carries several individually graded physical units behind it, each with its own condition, price, and availability — so the row grain that matters is the variant, not the product. Like any graded-resale business, the entire proposition rests on one promise a shopper has to take on faith before they ever touch the product: that the condition grade on the listing is the condition of the gear that shows up.

That means condition isn't back-office data — it's the transaction. A shopper choosing "Excellent" over "New" is trading price for a specific, understood level of wear. When the field that's supposed to carry that grade instead carries an internal reservation code, or when a size and a condition swap places on the page, the shopper isn't just looking at messy data — they're looking at a promise the storefront can't keep.

~80% of U.S. online shoppers cite doubt about a secondhand item's true condition as their single biggest hesitation before buying — the exact trust gap the condition field exists to close. Bizrate Insights, via Statista — "Reasons consumers are hesitant to buy secondhand fashion online," March 2024

EKOM ran this retailer's live public storefront through our analysis pipeline exactly as we would a new account's catalog: one link, no hand-built schema, no one telling the system it was looking at used outdoor gear or what "condition" was supposed to mean. What came back was concentrated in exactly the place a graded-resale business can least afford it — the condition field itself, carrying internal reservation IDs out to the customer — alongside two entirely different products sharing one product ID, cross-brand description contamination, and a shipping-weight gap that ranges from zero to a physically impossible ten kilograms. None of it required access to the retailer's own systems to find.

Four things this pass
had to get right.

This retailer runs on Shopify. No one briefed the system on what kind of store this was, how to model graded resale inventory across dozens of brands, or what to look for — it had to work all of that out on its own before a single finding could be trusted.

01
Zero-setup ingestion
✓ Pass
The storefront is public — the same product feed and pages any shopper can load. No engineering, no data handoff, no access to the retailer's backend.
A 13,033-variant stratified sample, proportional across all 244 product types in the catalog. Three products returned a persistent server error and were excluded, not silently skipped.
A full run would have cost roughly 7× more for a proportionally thinner benefit — the sample already achieves full coverage of every product type it touches.
02
Understanding the business, unprompted
✓ Pass
The system is handed a generic catalog by default. It has to recognize what it's actually looking at before analysis can be meaningful.
Classified the catalog as outdoor resale — condition-graded secondhand apparel and gear across dozens of brands — and identified condition, size, and color as the three option axes every listing should carry.
Get the vertical wrong and every downstream check is measuring the wrong thing.
03
Reading at the right grain
✓ Pass
A resale catalog isn't a count of listings — it's a much larger set of individually graded physical units, each with its own condition, price, and availability.
Modeled the catalog one row per variant, not per product — deliberately, because collapsing graded units together erases the exact signal a shopper is paying to know.
A "Pristine" jacket and a "Worn" jacket of the same model are different products to a buyer, even sharing one listing.
04
Catching what no schema tells you
✓ Pass
Some of the strongest catches in this pass came from comparing the catalog against itself — no external spec sheet, no manufacturer database.
Two variants of the same Kari Traa Klara pant — one named "royal," one named "pine" — were flagged sharing an identical color-swatch hex code, caught purely by comparing sibling variants of the same product to each other.
"Royal" reads blue-purple and "pine" reads green. At least one swatch is wrong, and the catalog already contained the contradiction.

At a glance

200
Analytical
findings
66
Critical
(33%)
13,033
Variants
analyzed
79%
Critical + High
share
Scope note. This pass analyzed 407 of the 415 columns the storefront's product pages carry. Eight were dropped before analysis — body_html, image URLs, and three timestamps among them — all redundant or inert, accounting for 14.3% of raw content volume and zero analytical loss. Unlike some prior passes, no spec column was dropped for space — every populated attribute field was in scope. Every count here is a snapshot from a single point-in-time pass (captured 2026-08-06) and has not been checked against the retailer's own systems — a natural next step before any single line item is treated as certain.

Beyond the checklist.

No one flagged this one in advance — it surfaced because the pipeline checks a listing's own fields against each other, not just against a rulebook. It's also the most complete cross-contamination found in this pass: not one wrong field, but an entire attribute set transplanted from an unrelated SKU.

Bonus Finding  ·  Content Integrity  ·  Full Attribute-Set Contamination
A women's leather hiking boot, specced as a hydration bladder.
A Danner Women's Jag Full Grain Boot carries a complete set of structured attributes belonging to a different product entirely — a hydration reservoir. Its description field is blank, and every populated spec describes the wrong item.
How it was caught
Field
Value
Status
Best Use
Mountain Biking
✗ Disagrees
Hydration Capacity
50 – 100 oz
✗ Disagrees
Material Details
Thermoplastic Polyurethane (TPU)
✗ Disagrees
Product title
Danner Womens Jag Boot
✓ Ground truth
The details field goes further still, describing a "high-flow bite valve" — language with no plausible connection to a leather hiking boot. This is not a mislabeled option or a typo; it's a full record swap at the ETL or PIM layer, and the correct boot content isn't recoverable from anywhere else in the catalog. It has to be re-ingested from the manufacturer feed.

How EKOM read this catalog.

Three passes ran before any finding was generated. Each builds on the last — no step was told what the one before it found.

1
Reading the Storefront
Walked the storefront's own product feed, then fetched every individual product page for the fuller spec table the feed doesn't carry.
13,033 variants sampled, stratified across all 244 product types. Three products failed with a persistent server error, hand-verified against a working control URL before being excluded.
2
Understanding the Business
Classified the vertical and the right unit of analysis, then modeled the catalog at the grain that actually matters for graded resale.
Vertical set to outdoor/cycling resale. Grain set to one row per variant rather than per product — each physical unit carries its own grade, price, and availability.
3
Cross-Record Validation
Checked every record's fields against each other, against sibling variants of the same product, and against the categories they claim to belong to.
200 analytical findings, each tied to specific variant IDs — plus 408 lower-confidence structural observations held back as not client-ready on their own.

What’s actionable now.

Two corrections below are pattern-based and high-confidence — ready to apply once the retailer confirms the pattern. The catalog-wide flags that follow require a business decision or data only the retailer has.

option1_valuestrip _RES#### / _#### suffix
Critical7 confirmed · pattern spans hundreds
The condition field's clean vocabulary — Pristine, New, Excellent, Good, Worn — has internal reservation IDs and dedup suffixes appended on a large subset of items: Excellent_RES######, New_########, Worn_RES######. The full contaminated string surfaces in the customer-facing variant_title too. A single regex pass stripping everything from the first underscore resolves the field catalog-wide.
Confirmed on 7 items; the underlying pattern recurs across hundreds more.
gramsderive from Weight (oz × 28.3495)
Critical16 of 30 sampled physical items
Sixteen of thirty spot-checked shippable items carry grams = 0 while a human-readable weight already sits in the Weight field — sleeping bags, ski boots, jackets, a fleece vest. Shopify uses grams for shipping rate calculation, so these price as free freight. Where Weight is populated, the conversion is fully mechanical; where it isn't, a category median is the fallback.
e.g. Rab Axion Pro (Weight 27.1 oz, grams 0) · NEMO Riff 30 (Weight 1 lb 14 oz, grams 0) · Smartwool Intraknit (Weight 10.23 oz, grams 0)

Catalog-wide flags — require a decision

FindingSeverity
A women's Smartwool merino tee and a men's Lacrosse fishing boot — unrelated products — share one product_id. Will corrupt page rendering, inventory aggregation, and dedup logic. A replacement ID has to be assigned by the platform or sourced externally.Critical
A wide set of items carry compare_at_price = 0.00 or blank instead of the original retail MSRP, erasing the discount signal a resale storefront depends on. The correct retail prices need sourcing from brand sites or the retailer's own purchase records — not derivable from the catalog alone.Critical
At least one variant shows price above compare_at_price — Ortovox Mens 185 RockNWool LS Top (XXL): price $148.00 vs. compare_at $110.00 — so the crossed-out "MSRP" reads below the asking price. We report the factual pattern only; its characterization is a business and legal call, not EKOM's.Critical
A subset of catalog items — sourced via a Shopify Collective / dropship feed — use an entirely different option schema (Color/Size instead of condition/size_and_size2/color), retail pricing, and a foreign product-type taxonomy, making them structurally invisible to every condition-based filter on the site.High

Column-level flags — normalization strategy needed

option1_name / option2_name / option3_nameCritical
At least four naming conventions in play for the same three axes — lowercase condition/size_and_size2/color is the standard, but Title-cased variants, a two-slot-only item, and several Rapha Core Jersey variants with size and condition transposed all deviate. Every deviation silently breaks a filter built against the standard.
option3_value (color)High
Dozens of variants are missing the required colorname:#hex format entirely, carry a malformed or garbage hex, or pair a color name with a hex that renders as a visibly different color — "Deep-Navy" at a coral hex, "light mint" at near-black. Swatches render wrong or not at all.
GenderHigh
Mixes single values, comma-concatenated multi-values ("Mens,Unisex"), a duplicate "Gender:" field that sometimes disagrees with the primary one, and outright mislabels (a women's product tagged "Kids,Girls"). Breaks gender-based faceting in every direction at once.

Findings ledger.

A representative cut of the 200 analytical findings, grouped by root cause. Where the fix is mechanical, EKOM can propose and apply it directly once connected to the retailer's catalog. Where it depends on the retailer's own records or a business call, it's routed accordingly.

FindingSev.Resolution
Condition & Grade Integrity — the field the business rests on
Internal reservation IDs and dedup suffixes appended to condition values (Excellent_RES######) across hundreds of itemsCriticalEKOM proposes
At least four naming conventions for the condition/size/color option axes, including fully swapped slots on several Rapha Core Jersey variantsCriticalEKOM proposes
A Burton half-zip pullover is entered as a single "Default Title" variant with no condition, size, or color structure at allCriticalRetailer decision
Identity & Structural Integrity
Smartwool Womens Merino SS Tee and Lacrosse Mens San Juan Boot — unrelated products — share one product_idCriticalNeeds platform ID reassignment
Three Rapha products return a persistent HTTP 500 on the retailer's own server — invisible to this pass and, likely, to searchHighRetailer's server team
Shopify Collective / dropship items use a foreign option schema and taxonomy, structurally excluded from condition-based filteringHighRetailer decision
Cross-Contamination — content from the wrong product entirely
Danner Women's Jag Boot carries a full hydration-bladder attribute set (bite valve, Mountain Biking, 50–100 oz capacity)CriticalNeeds manufacturer re-ingestion
Two Obermeyer boys' jackets serve the Marmot Men's Prescott Jacket description, verbatimCriticalEKOM proposes
Obermeyer Women's Janis Down Jacket has vendor set to "Marmot" — absent from Obermeyer's own brand page as a resultCriticalEKOM proposes
Toad & Co Womens Earthworks Pant carries ski construction specs and Best Use = "Backcountry Skiing" from an unrelated ski product, plus the wrong genderCriticalEKOM proposes
Pricing & Trust
compare_at_price = 0.00 or blank on a wide set of Used/Mixed items, erasing the discount signalCriticalNeeds sourced retail MSRP
Ortovox top: price ($148.00) exceeds compare_at_price ($110.00) — strike-through reads below asking priceCriticalRetailer decision
Fulfillment & Shipping
Houdini Womens Liquid Rock Short: grams = 10000 — a physically impossible 10 kg trail short (typical ≈250g)CriticalEKOM proposes
16 of 30 spot-checked shippable items carry grams = 0 with a populated Weight field available to derive fromCriticalEKOM proposes
Categorization — every one breaks category browsing
24+ items carry a product_type flatly wrong for the product — pants as "Beanies," jackets as "Gloves," a bra as "Shell Jackets" — verifiable from the title aloneCriticalEKOM proposes
The North Face ThermoBall jacket carries a raw pipe-delimited tag string in product_type instead of a taxonomy valueCriticalEKOM proposes
Discovery & Facet Integrity
option3_value (color) missing, malformed, or hex-mismatched across dozens of variants — swatches render wrong or blankHighEKOM proposes
Gender mixes single values, comma-concatenated multi-values, a disagreeing duplicate field, and outright mislabelsHighEKOM proposes
size_and_size267 — a typo'd option name — appears exactly once across the full catalog's own value countsMediumEKOM proposes
Description Quality
Multiple items (Black Diamond, Rab, Gnara, Eddie Bauer, The North Face) serve raw attribute-dump text as the description instead of marketing copyMediumNeeds sourced marketing copy
Two descriptions are literal data-corruption artifacts — one is the string "0," another is UTF-8 read through Windows-1252HighEKOM proposes
Note. This is a representative cut of the 200 analytical findings, ordered by shopper and data-integrity impact. The full machine-readable list, with the remaining formatting and completeness items, accompanies this report.
EKOM proposes. High-confidence, pattern-based corrections EKOM's pipeline can apply directly once connected to the retailer's catalog — the pattern gets confirmed once, not SKU by SKU.
Retailer decision / needs source data. Items requiring a business call, a policy decision, or ground truth only the retailer has. Once confirmed, EKOM applies the resolution.

Catalog profile.

A large share of this pass's findings touch fields that were emitted as populated — not blank, not missing from any completeness report the retailer might already run. They're wrong, or wrong in a way that reads as complete. That's a harder class of problem to catch than a blank cell, and it's most of what surfaced here.

Populated isn’t the same as trustworthy

condition (option1_value)Critical
Never blank on the affected items — populated with values like Excellent_RES###### and New_######## on hundreds of variants. A completeness check would show this field at 100%. The grade underneath the suffix may even be correct — the field is still unusable for filtering or display as-is.
compare_at_priceCritical
Populated with 0.00 on a wide set of Used and Mixed-grade items, producing a broken "$0.00 was" strikethrough — or with a real-looking number that simply isn't the item's actual retail price. Either way, "populated" and "correct" are different claims here.
gramsCritical
Populated as a literal 0 on 16 of 30 spot-checked shippable items — and, on one Houdini short, populated as 10000, ten kilograms for a garment that weighs roughly 250 grams. Not a blank field in either direction — a wrong value that reads as complete to any system checking only for presence.
Gender
Populated, but frequently with the wrong single value ("Kids,Girls" on an adult women's pant) or with two comma-concatenated values a categorical facet can't match against either one individually. A duplicate "Gender:" field sometimes disagrees with the primary field it's meant to mirror.
Note on scope. This pass analyzed 407 of the 415 columns the storefront's full page structure carries — the eight dropped were redundant or inert (raw HTML, image URLs, timestamps), not spec data. Every populated attribute field was in scope; the sample's 29% coverage means counts here are floors, not ceilings — the full catalog likely holds roughly three times as many confirmed instances of each pattern.

What this means for the vertical.

growth, 2022–2026 85.5%
The global apparel resale market is on pace to grow 85.5% from 2022 to 2026, reaching $338.4 billion. Outdoor and cycling gear resale isn't operating in a niche — it's operating in a category retail is actively moving toward, where the storefronts that earn trust in condition and accuracy are the ones that keep the customer on the second, third, and tenth purchase.
GlobalData, "Global Apparel Resale Market Set to Grow 85.5% (2022–2026) to $338.4 Billion," 2023
For most retailers, product data is an operations problem — get it wrong and search or filtering suffers. For a graded-resale business selling across dozens of brands, it's closer to the whole offer. A shopper choosing resale over new, or one resale platform over a competitor, is making a bet that "Excellent" means what it says, that the boot they're buying is actually a boot, and that the product they clicked is the product that ships. Every finding in this analysis sits somewhere on that bet.
The shape of what surfaced here is worth naming directly: 115 of the 200 findings are corrections to values that are actively wrong, not gaps to fill in. That's a different — and in some ways more urgent — problem than an incomplete catalog. A blank field reads as a to-do list. A condition grade carrying an internal reservation ID, or a boot specced as a hydration bladder, reads as something a shopper could act on before anyone catches it.
A pass like this is diagnosis — reading a catalog and naming what's there, accurately, at no cost of the retailer's team time or system access. The natural next phase for any business in this category is correction and enrichment: resolving the identity and cross-contamination issues that sit underneath multiple findings at once, completing the attributes that are thin today, and holding that line automatically as new consignment inventory arrives — rather than re-auditing it after the fact.
Request a catalog analysis. We're ready to run the data and show you what we find.
Jonah Santo
EKOM
Confidential  —  Case Study
EKOM