A complete, attribute-rich catalogue for a flagship UK luxury department store — every category, every product, every variant, with descriptive depth intact.
An AI-powered commerce platform building AI-driven product discovery and conversational shopping experiences.
An AI-powered commerce platform builds AI-driven product discovery and conversational shopping experiences. Its models sit between a shopper and a retailer's inventory, answering open-ended questions — about fit, material, occasion, designer, colour family — and returning specific products.
For the VP of Product there, that kind of system is only as good as the catalogue behind it. A model that can only see a product title, a price and a thumbnail cannot answer "a lightweight wool blazer in navy, cut for a tall frame, under a price threshold". It needs the structured attributes and the prose description that a retailer's own merchandising team wrote.
The brief was unambiguous: a complete, attribute-rich catalogue for a flagship UK luxury department store — not a sample, not the bestsellers, and not a price-only feed. Every category, every product, every variant, with the descriptive depth intact.
The hard part was not frequency. Prices on a luxury catalogue move slowly compared with an electronics marketplace. The hard part was completeness and attribute depth.
| Field | Type | Notes |
|---|---|---|
| product_id | string | Retailer's own identifier, used as the stable join key |
| product_url | string | Canonical URL |
| product_name | string | As displayed |
| brand / designer | string | Normalised against a controlled brand list |
| category_path | array | Full breadcrumb, root to leaf |
| category_leaf_id | string | Node ID in the mapped taxonomy |
| price_current | decimal | With currency code |
| price_original | decimal | Where a was-price is shown |
| currency | string | ISO 4217 |
| availability | enum | In stock / out of stock / pre-order, per variant |
| variant_id | string | One row per purchasable combination |
| variant_axes | object | Size, colour, shade, volume, length — per category |
| colour_name | string | Retailer's label |
| colour_family | string | Normalised to a controlled colour vocabulary |
| size_label / size_normalised | string | Raw label plus normalised value and size system |
| description_short | text | Summary copy |
| description_long | text | Editorial copy, structure preserved |
| composition | array | Materials with percentages where given |
| care_instructions | text | Where present |
| dimensions | object | Value plus unit, for home and accessories |
| attributes_extra | object | Category-specific key/value pairs |
| image_urls | array | Ordered, primary flagged |
| image_role | enum | Primary, alternate, detail, model shot, swatch |
| sku_code | string | Where exposed |
| captured_at | timestamp | UTC |
We began with a structural survey of the site rather than a scrape. The goal was to answer four questions: how is the taxonomy expressed, how are products addressed, how are variants represented, and where does each attribute actually live. That survey produced a written source map — a category-by-category inventory of which fields are present, which are optional, where the same concept appears under different labels, and which categories carry attributes no other category has. Every later decision in the pipeline traces back to that map.
Because completeness was the stated requirement, we did not discover products by following links opportunistically. We first enumerated the full category tree to leaf level, then treated each leaf as a bounded collection unit with its own expected product count. This matters for a simple reason: you cannot prove a catalogue is complete without a denominator. With leaf-level enumeration, each unit has a target count from the site's own listing metadata, and any unit that comes back short is flagged rather than silently accepted.
We modelled the catalogue at two levels: a product entity and a variant entity, joined by product_id. Shared attributes — brand, description, category, composition — live on the product. Everything that can differ by combination — price, availability, size label, colour, SKU — lives on the variant. Variant axes were read per category from the source map, not guessed. Where a combination was not purchasable, we recorded it as unavailable rather than omitting it, so the client can tell "does not exist" apart from "temporarily out of stock".
Each category got an extraction profile: a set of rules mapping source components to target fields, with a fallback path for optional blocks. Free-text attribute blocks were parsed into key/value pairs where the source used a consistent label pattern, and retained verbatim in attributes_extra where it did not. Nothing was inferred. If a value was not stated on the page, the field is null — never filled with a plausible guess.
A full-catalogue pass against a large site is a sustained workload, not a burst. We ran it as a paced, distributed job designed to behave like ordinary traffic: conservative per-source concurrency, randomised request ordering, session and header hygiene consistent with real clients, and a rendering path only for components that genuinely require it. Rate limiting was applied on our side as a hard ceiling rather than a target. Reliability came from checkpointing. Every leaf unit and every page within it was tracked in a job ledger, so a failed unit retried in isolation with exponential backoff rather than restarting the pass.
Brands were resolved against a controlled list, with alias handling for punctuation and legal-entity variants. Colour names were mapped to a colour family vocabulary while retaining the retailer's own label. Size labels were parsed into a normalised value plus a declared size system. Prices were stored as decimals with explicit currency, never as formatted strings. Product identity was anchored on the retailer's own identifier where exposed, with a fallback composite key, so a re-run reconciles against the previous load instead of creating duplicates.
These figures must be taken from the project records before publication. Do not estimate.
The decision that carried this project was mapping the taxonomy before collecting anything. It cost time up front and it made every downstream guarantee possible: a per-leaf denominator to measure completeness against, a per-category schema that respects how different merchandise actually behaves, and a variant model that a recommendation engine can use without deduplicating first.
The second decision was refusing to infer. An AI commerce platform is trained on what you give it, so a plausible-looking guessed attribute is worse than a null — it is wrong in a way nobody can detect downstream. Leaving fields empty when the source is silent produced a smaller dataset than a maximalist approach would have, and a far more trustworthy one.
“Our models can only be as good as the catalogue behind them. Actowiz delivered a complete, attribute-rich catalogue — every category, every variant, with the descriptive depth our AI needs to answer real shopper questions.”
— VP of Product, AI Commerce Platform
Request a free sample dataset for your category. Visit actowizsolutions.com to discuss your data requirement.
Our web scraping expertise is relied on by 4,000+ global enterprises including Zomato, Tata Consumer, Subway, and Expedia — helping them turn web data into growth.
Watch how businesses like yours are using Actowiz data to drive growth.
From Zomato to Expedia — see why global leaders trust us with their data.
Backed by automation, data volume, and enterprise-grade scale — we help businesses from startups to Fortune 500s extract competitive insights across the USA, UK, UAE, and beyond.
We partner with agencies, system integrators, and technology platforms to deliver end-to-end solutions across the retail and digital shelf ecosystem.
Request a sample web scraping dataset for retail, quick commerce, food delivery or travel. Check fields, freshness and coverage first.
Sensitive Skin Skincare Product Data API helps brands track cleansers, serums, moisturizers, and sunscreens with structured product data.
German marketplace data report 2026: online retail size, Amazon.de, Otto, Kaufland and Zalando price signals, PAngV rules and peak seasons.
Whether you're a startup or a Fortune 500 — we have the right plan for your data needs.