Data quality Independent solution

Catalog Enrichment

Takes messy supplier feeds and turns them into clean, complete catalog data — categorising products, extracting and normalising attributes, and flagging duplicates — so search, filters and copy all have something solid to stand on.

The problem

Bad product data quietly breaks everything downstream

Supplier feeds arrive with missing attributes, inconsistent categories and duplicates. That mess breaks faceted search, filters, ads and copy — and cleaning it by hand can't keep up with catalog changes.

This solution enriches and normalises data continuously: it categorises, extracts attributes, standardises values and surfaces duplicates for review.

Primary objective
Deliver complete, consistent, de-duplicated product data across the whole catalog, automatically.
How it works

Ingest → categorise → extract attributes → normalise & dedupe

Ingest
Supplier feeds & images
Categorise
Map to your taxonomy
Extract
Attributes from text & specs
Normalise
Standardise units, flag dupes
What it does
  • ✓ Taxonomy categorisation
  • ✓ Attribute extraction
  • ✓ Unit & value normalisation
  • ✓ Duplicate detection
  • ✓ Image-based tagging
  • ✓ Gap & quality scoring
Built with
  • ✓ Claude for extraction
  • ✓ Vision for image attributes
  • ✓ PIM / feed connectors
  • ✓ Taxonomy knowledge base
  • ✓ Human review for merges
Guardrails
  • ✓ Confidence thresholds
  • ✓ Human-reviewed merges
  • ✓ Source-value traceability
  • ✓ No silent overwrites
  • ✓ Change audit log
Under the hood

Taxonomy-constrained categorisation

Products are mapped only to categories that exist in your taxonomy, and low-confidence guesses are sent to a human instead of shipped.

catalog/enrich.py PYTHON
from anthropic import Anthropic
from taxonomy import CATEGORIES
client = Anthropic()

def categorise(product: dict) -> dict:
    prompt = f"""Pick the best category for this product.
Product: {product['title']} - {product['raw_desc']}
Allowed categories ONLY: {CATEGORIES}
Return JSON: {{"category": str, "confidence": float}}"""
    msg = client.messages.create(model="claude-sonnet-4-20250514",
        max_tokens=200, temperature=0,
        messages=[{"role": "user", "content": prompt}])
    out = parse_json(msg.content[0].text)
    if out["category"] not in CATEGORIES or out["confidence"] < 0.7:
        return flag_for_review(product, out)   # never guess into the catalog
    return out
Outcomes
Complete
Attributes filled
Consistent
Normalised values
De-duped
Cleaner catalog
Continuous
Runs on every feed

Clean data in, everything else works better

The foundation for Smart Search and the Product Content Generator.

Start a conversation →
More E-commerce solutions
Catalog Enrichment | Smort