10
UK Suppliers Integrated
50+
Raw Stone Types Normalised
100%
Automated Supplier Price Reconciliation
The Problem

Stone Buyers Waste 15+ Hours Every Week on Manual Research

The UK natural stone trade is fragmented across dozens of independent wholesalers, each with a completely custom inventory system. Some suppliers run Algolia-powered catalogue search. Others require full browser automation through login walls with infinite scroll. Others expose internal REST or JSON APIs with no public documentation. And others serve classic paginated HTML. Buyers and trade professionals had no way to compare inventory or pricing across suppliers without visiting each site individually and manually reconciling data — a process measured in hours, not minutes. Price lists arrived as Excel files that had to be manually cross-referenced against product pages. There was no single source of truth.
Our Solution

An Async Scraping Platform Purpose-Built for Natural Stone

We designed a Django application with a dedicated scraper module for each of the 10 suppliers, all feeding into a single normalised PostgreSQL schema. Each scraper uses the right tool for the job: Playwright with authenticated sessions and infinite scroll detection for Slabware-platform suppliers, async aiohttp with BeautifulSoup for REST/HTML endpoints, and Algolia API integration for catalogue-search-backed suppliers. A shared normalisation layer ('common.py') standardises every incoming record before it touches the database — mapping raw stone type strings and finish names to canonical values via case-normalised lookup tables with 50+ and 60+ entries respectively. The Slabware bundle parser handles unit conversion (mm/cm/m), HTML-stripped price extraction, dimension fallback parsing, and computed price-per-slab calculation in a single reusable function. A web dashboard exposes the aggregated inventory with django-filter-powered search and filtering. A price reconciliation module accepts uploaded supplier Excel price lists (parsed with pandas + openpyxl), matches rows by name and thickness, and updates price fields in bulk. PDF and colour-highlighted Excel exports are generated with ReportLab and openpyxl. Discord webhooks deliver scraper run summaries and tracebacks.
Architecture
Django 5 + Django REST Framework API. PostgreSQL database with Supplier, StoneItemFormatted, StoneItemImage, and SupplierPDF models. Celery for scheduled scraper runs. Playwright (headless Chromium) for authenticated browser automation. async aiohttp with 10 concurrent connections for high-throughput detail fetching. BeautifulSoup HTML parsing. pandas + openpyxl for Excel price list reconciliation. ReportLab for PDF generation. Discord webhook notifications per scraper run.
The Result

15+ Hours Saved Weekly — One Dashboard Replaces 10 Supplier Portals

The Marble Group saved the buying team 15+ hours every week by replacing fragmented manual research with a single live dashboard. All 10 UK suppliers are automatically scraped on schedule — with normalised stone types and finish categories enabling direct cross-supplier price and availability comparisons that were previously impossible without hours of manual work. The automated price reconciliation tool eliminated the Excel-matching workflow entirely. Buyers upload one price list and the system updates hundreds of product records in seconds — a task that previously took the better part of a day. Instant Discord alerts fire the moment any supplier changes a price or stock level, ensuring every buying decision is made on the freshest available data. The platform now powers every purchasing and pricing decision across the business, turning what was a research burden into a genuine competitive intelligence advantage.
Want scalable architecture and measurable results like this?
Book an Architecture Audit
Build Something Like This
// free scoping call · senior engineers · no commitment

Project scope, timelines, and architecture options in one 45-minute session.

Start a Project
More Work

Related Projects

Django Node.js PostgreSQL
Farming Product Monitor: Real-Time Agricultural Price & Stock Intelligence for Pakistani Markets
Get instant Discord alerts on price and stock changes across Kissanghar.pk and Syngenta Pakistan. Full change history, stealth scraping, and full-catalogue auto-discovery built in.
View Details
Django Docker PostgreSQL
Global Freight Tracking API: Track 30+ Air & Sea Carriers — One Call, One Standard Response
One API call replaces 30+ carrier portal checks. Real-time AWB and container tracking from international air and sea carriers — standardised JSON response, including full audio CAPTCHA bypass.
View Details
SlateDesk: Film & TV Talent Submission Management — From Public Pitch Link to Structured Deal Pipeline
Django Material UI PostgreSQL
SlateDesk: Film & TV Talent Submission Management — From Public Pitch Link to Structured Deal Pipeline
Structured film and TV submission management for executives and reps. Public submission URLs, internal pipeline, meeting scheduling, contact management, and Stripe subscription tiers.
View Details