05

A catalogue that updates itself

Dealer storefront · data pipeline, site, operations

The dealer had close to a hundred cars on a listings platform and no storefront of their own. Now there is a site in three languages where stock syncs every half hour and nobody on staff enters a card by hand.

A catalogue that updates itself

How it worked before

Every car would have been entered by hand: sold one, remember to remove it; took one in, remember to add it. The storefront would have sat permanently behind the real stock.

What made it hard

An external source that can return junk, return nothing, or fall over. A naive parser will one day publish an empty catalogue — and the dealer will hear about it from a customer who drove over for a car that was already sold.

Engineering decisions

  1. 01

    A plausibility check before publishing

    A separate module decides whether to trust the new extract; if stock has collapsed, the site stays on the last good state.

  2. 02

    Cover photos are picked by a banner detector

    A script rejects photos carrying advertising overlays so the grid holds clean frames.

  3. 03

    No server and no image storage

    The parser lives in a scheduler and commits the data; the site is static and the photos are served from the source.

  4. 04

    101 tests on the normalisation logic

    Not on buttons — on what turns someone else's markup into predictable data. That is always the part that breaks.

Where it stands

A sync every 30 minutes, three languages, and counters in the header reading the real stock. Nobody touches the site by hand.

Listings platform
someone else's source, and it can fall over
Parser
reads stock every 30 minutes
Plausibility check
decides whether to trust the extract
Storefront
a static site in three languages
Banner detector
rejects photos carrying ads
Last good state
an empty catalogue is never published
The key step is not the parser but what stands after it. The naive version publishes an empty catalogue one day, and the dealer hears about it from a customer.

Got something like this?

Get in touch