The problem
A dental practice buys supplies from several distributors, and the same reference can differ by tens of euros from one to another. Finding the right price means opening six websites, searching for the same bur or composite everywhere and keeping a spreadsheet up to date.
The solution
DentalCheck collects the public catalogues of six suppliers every day (Mega Dental, GACD, Dental Click, Dental Privé, Discount Dentaire, Dental Good Deal) and groups them by manufacturer reference: one row per product, every price side by side.
Practitioners search once, by name, reference or EAN code, and instantly see the gap between the most and least expensive offer. Every price is dated and kept over 90 records to track its trend. The cart then sends each line to the cheapest supplier and shows the money saved.
The data pipeline
Collection is handled by Python scrapers that query the catalogues directly over HTTP and extract product data with compiled regular expressions, without loading a browser: fast and cheap. Playwright is only used as a last resort, to get past a Cloudflare challenge.
A matching engine merges duplicates by manufacturer part number (MPN), then product images are synced to Cloudinary in parallel. From the admin panel, I run the scrapers and follow their logs live through Server-Sent Events.
A real SaaS product
Sign-up works by email or with Google, with a 14-day trial and no credit card. The Pro plan at €20 excl. VAT per month is handled by Stripe and unlocks favourite lists, per-product notes, the split cart and anomaly reports. An admin area manages accounts and allows bulk catalogue fixes.
Tech stack
- Next.js 16 & React 19UI, API routes and pre-rendered pages (App Router)
- MongoDB AtlasCatalogue, price history, accounts and favourites
- PythonCatalogue scrapers (Requests, lxml, compiled regex), manufacturer-reference matching
- StripeSubscriptions, free trial and customer portal
- Better AuthEmail or Google sign-in, trial / pro / admin roles
- CloudinaryProduct images served via CDN, synced multi-threaded
- NodemailerTransactional emails
- VercelHosting and static page caching
SEO, performance & accessibility
- Public pages pre-rendered by Next.js and served from Vercel's cache: near-instant display
- Carefully written title, meta description and Open Graph tags for Google and social sharing
- Declared language, clean heading structure and readable URLs
- No ad trackers or third-party analytics: lighter pages and a GDPR-compliant site
- Reading comfort panel: light, dark or high-contrast theme, text size up to 150%, spacing, dyslexia-friendly font, underlined links, reduced motion and stronger focus
- Bottom navigation bar on mobile, designed for use in the practice



