Showed a dealership group where every vehicle's photos went missing
A dealership group could not tell which vehicles had photos live on which sales channels. Over four months the internal image hub gained trending metrics, channel-by-channel reconciliation, role-based access, and scrapers that verify listings on three public sites.

Outcomes
- Public sites verified
- 1 → 3
- Channels reconciled
- 5
- Trending window
- 30 → 7 days
Scrapers extended from the flagship site to the used-vehicle site and the online storefront.
Inventory tool, dealer management system, and three websites compared vehicle by vehicle.
Shorter windows made problems visible while they were still fixable.
The challenge
Vehicles moved through photography, upload, and syndication to inventory tools and several dealer websites, and every gap cost days of sales time. Staff checked channels by hand. The internal tool that tracked images had no view of trends, no way to compare what one system said against another, and permissions loose enough that anyone with a login could see and change anything.
Approach
- Added homepage trending tables with seven-day windows and drill-down filters that open a filtered search in a new tab
- Reconciled inventory across the inventory management tool, the dealer management system, and three public websites, computing missing and extra vehicles by stock ID instead of by count
- Built a headless-browser scraper as a Kubernetes cron job that verifies live listings on each dealer site and writes results back to the hub
- Added role-based permissions at both the API and the page level, plus automatic token refresh so sessions stopped failing mid-task
- Refactored the query layer into a single service with one source of truth for metric labels, and put troubleshooting guidance inline where staff hit problems
What shipped
The homepage became a set of trending tables: for each channel, how many vehicles should be there, how many are, and the difference, over rolling seven-day windows, with a click through to the exact vehicles behind any number. A master CSV covers 120 days for the people who live in spreadsheets.
Behind it, a scraper service runs on a schedule against each public site with configurable browser fingerprinting, and the hub reconciles those results against the inventory tool and the dealer management system by stock ID. Wholesale vehicles are excluded from the difference reports so the numbers match how the business thinks.
Access is now role-based end to end, with the same permission map enforced by the API and the pages, and a token refresh that removed a class of mid-task failures.
Stack
- Next.js
- TypeScript
- Express
- MongoDB
- Puppeteer
- Kubernetes
- Material UI
Services involved
Have a problem shaped like this one?
Tell me what you're working with and you'll get an honest read on whether it's a fit.
Start a project