Auto Auction Mall — TOP-1 Direct-Buyer
Auction Platform Earns +50K MAU
Client’s Challenge
Auto Auction Mall is a TOP-5 US auction marketplace and the TOP-1 platform for direct buyers — running on a proprietary neural-network search engine with 350GB of vehicle databases and 1,000,000+ unique customers a year.
The site already had volume. What it didn’t have was discoverability: faceted navigation generated tens of thousands of duplicate URLs, the index was bloated with parameter combinations Google was wasting crawl budget on, and the keyword footprint had no structural backbone — geography, make, model, auction-type and buyer-intent pages were colliding for the same query basket.
The client needed a quiet, surgical SEO rebuild — not a redesign. Keep the platform running, fix what the engine couldn’t see.
- 73,400 indexed URLs — 45% duplicates from filter combinations
- Crawl-budget waste estimated at ~62% on parameter variants
- No semantic structure: 8,000+ keyword targets without hub mapping
- Faceted navigation issuing infinite URL variants (make × model × year × state × condition)
- Trust profile thin for an authority-heavy commercial niche
- No monitoring layer — every regression discovered weeks late
How We Solved It
Technical Structure Analysis
Full Screaming Frog crawl of 73,400 URLs. Mapped duplicate clusters, identified parameter-driven URL explosions in faceted nav, and benchmarked Core Web Vitals against the top three competitors in the segment.
Index Cleanup & Garbage URL Elimination
32,800 duplicate / parameter URLs purged from the index via canonicalization, URL parameter handler in GSC, robots.txt directives, and a rebuilt XML sitemap. Crawl-budget waste fell from ~62% to ~5%.
Semantic Core Collection & Clustering
8,400 commercial keywords harvested from Ahrefs + Semrush + GSC, then clustered with tf-idf into 6 hubs (Cars by Make, Cars by Model, Cars by State, Auction Type, Salvage / Title, Buying Guide) and 47 sub-clusters validated manually against US buyer intent.
New Site Architecture
Hub-and-spoke architecture deployed: every cluster anchored by a pillar landing page, sub-clusters linked through programmatic internal-linking rules. Information scent and crawl depth optimised so Google could rank the right page for every commercial query.
Faceted Navigation Debugging
Filter combinations re-mapped: high-volume combinations (e.g. “salvage cars + state”) promoted to indexable static landing pages, low-value combinations rel-canonicaled or noindex-followed. Stable URL contract for the engine team.
Trust-Link Acquisition
180+ contextual backlinks from automotive, insurance, salvage and small-business publications. Guest articles, expert roundups, and resource-page placements — all editorial, all dofollow, all relevant.
Monitoring & Regression Layer
Weekly Ahrefs Position Tracking on the 8,400-keyword basket, daily GSC delta watch on the index, custom Slack alerts on crawl-error spikes — so any regression hit our team within hours, not weeks.
Our Implementation
faceted_nav_classifier.py
# WebCoreLab — Auto Auction Mall faceted-navigation classifier
# Decides which filter combinations get indexed vs canonical'd vs noindex'd
from dataclasses import dataclass
from typing import Literal
@dataclass
class FacetCombo:
facets: dict # {"make": "ford", "state": "tx", "salvage": True, ...}
monthly_volume: int # search volume for this exact combo
competition: float # 0..1
inventory_count: int # vehicles currently matching the combo
Action = Literal["indexable_static", "canonical_to_pillar", "noindex_follow"]
INDEXABLE_FACET_DEPTH = 3 # max active filters that earn an indexable URL
PILLAR_VOLUME_FLOOR = 50 # below this — canonical to pillar
INVENTORY_FLOOR = 20 # below this — noindex (thin page)
def classify(c: FacetCombo, pillar_canonical: str) -> tuple[Action, str]:
active_facets = sum(1 for v in c.facets.values() if v)
# Too many filters: never indexable, always canonical to nearest pillar
if active_facets > INDEXABLE_FACET_DEPTH:
return "canonical_to_pillar", pillar_canonical
# Thin inventory: noindex,follow — keep crawl path, drop from index
if c.inventory_count < INVENTORY_FLOOR:
return "noindex_follow", ""
# Real demand + healthy inventory: promote to indexable static landing
if c.monthly_volume >= PILLAR_VOLUME_FLOOR and c.inventory_count >= INVENTORY_FLOOR:
return "indexable_static", build_static_url(c.facets)
# Default: canonical to pillar
return "canonical_to_pillar", pillar_canonical
def build_static_url(facets: dict) -> str:
# Stable, slug-friendly URL contract agreed with engineering
parts = [facets[k] for k in ("make","model","state","auction_type") if facets.get(k)]
return "/cars/" + "/".join(parts) + "/"
# Applied to 47,200 facet combinations
# Indexable static landings produced: 1,840
# Canonical'd to pillars: 38,260
# Noindex'd thin pages: 7,100
# Crawl budget reclaimed: ~62% → ~5%
semantic_core_clustering.py
# WebCoreLab — Semantic core clustering for AAM
# 8,400 commercial keywords → 6 hubs + 47 sub-clusters (tf-idf + manual validation)
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import AgglomerativeClustering
def cluster_keywords(keywords: list[str], n_hubs: int = 6) -> dict:
"""Cluster commercial keywords into pillar hubs."""
# tf-idf on character n-grams catches synonyms ("salvage cars" ~ "salvage autos")
vec = TfidfVectorizer(analyzer="char_wb", ngram_range=(3,5), min_df=2)
X = vec.fit_transform(keywords)
# Hierarchical clustering — cosine distance, average linkage
model = AgglomerativeClustering(
n_clusters=n_hubs,
metric="cosine",
linkage="average",
)
labels = model.fit_predict(X.toarray())
hubs = {i: [] for i in range(n_hubs)}
for kw, lbl in zip(keywords, labels):
hubs[lbl].append(kw)
return hubs
# After tf-idf clustering, hub centroids are reviewed manually
# against US auto-auction buyer intent (transactional vs informational)
# and re-labelled to canonical pillar names:
PILLAR_LABELS = [
"cars-by-make",
"cars-by-model",
"cars-by-state",
"auction-type",
"salvage-title",
"buying-guide",
]
# Output: hub_map.json — every keyword → pillar URL
# Result: 8,400 keywords routed to 6 pillars + 47 sub-cluster pages
Real English Semantic Core — Sample
Live URLs from autoauctionmall.com/<brand>-<model>/ — verified against web.archive.org/cdx (2021 snapshot)
25+Major US brands
8,400Total ranked keywords
/cars-by-state-california/
/cars-by-state-texas/
/auction-type-government/
/auction-type-insurance/
/salvage-clean-title/
/salvage-rebuilt/
/buying-guide/
Measurable Impact
Measured 8 months after deployment
“WebCoreLab handled the SEO rebuild without ever touching our auction engine. They did the unglamorous work — index cleanup, faceted-nav rules, semantic restructuring — and traffic compounded month over month. The fact that our crawl budget went from waste to ROI is the part we still measure today.”
— Director of Growth, Online Automotive Marketplace (NDA)