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.
Ingest → categorise → extract attributes → normalise & dedupe
- ✓ Taxonomy categorisation
- ✓ Attribute extraction
- ✓ Unit & value normalisation
- ✓ Duplicate detection
- ✓ Image-based tagging
- ✓ Gap & quality scoring
- ✓ Claude for extraction
- ✓ Vision for image attributes
- ✓ PIM / feed connectors
- ✓ Taxonomy knowledge base
- ✓ Human review for merges
- ✓ Confidence thresholds
- ✓ Human-reviewed merges
- ✓ Source-value traceability
- ✓ No silent overwrites
- ✓ Change audit log
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.
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
Clean data in, everything else works better
The foundation for Smart Search and the Product Content Generator.