- 67
- retailers compared
- 17,221
- sets tracked
- 2× daily
- price and stock refresh
Figures from 20 July 2026
Prices need context.
I wanted to compare LEGO prices across shops and see whether a set had been cheaper before. I designed and built BricksDeal to bring retailer offers, stock and price history together.
So this could not be a list of affiliate links. Every set needed one fixed record, with a history of offers moving around it.
- The set stays fixed
- Number, name and product details hold still while the offers around them change.
- Offers keep moving
- Price, stock and the time of the last check each drift on their own schedule.
- Country changes the market
- A comparison is only useful with the retailers and prices that region can actually buy from.
- Commission cannot set the order
- Affiliate revenue pays for the thing. It does not get to pick what ranks first.
Offers and price history, together.
Each set page lists retailer prices, stock and the last update. The price chart shows earlier offers, and shoppers can set an alert for their target price.
- €469.99
- lowest current offer
- €649.99
- recommended retail price
- 8
- retailers compared
- 28%
- below RRP
Find, compare, follow.
Search for a set, filter deals or compare two sets side by side. Price alerts and the browser extension help shoppers keep track.
- 01 Find a set Search by set, browse a theme or start from a collecting interest.
- 02 Narrow the list Sort current deals and filter by price, availability or theme.
- 03 Check the history See retailer offers, stock, earlier prices and the latest update in one place.
- 04 Compare candidates Compare the price and details of two sets side by side.
- 05 Keep watching Set an alert or keep BricksDeal nearby through the browser extension.
Prices first on smaller screens.
On mobile, I put the current offer first, followed by set details and price history. Desktop has room for comparisons side by side.
Collecting prices and serving pages.
I built the site with Laravel and SQLite. A separate Python pipeline collects retailer data and publishes updates through an API. Price collection runs separately from page requests.
- 01 Collect Python pipeline
Retailer scraping, translation and SEO jobs run outside the storefront.
- 02 Publish Protected API
Workers hand prepared data to Laravel instead of writing straight into the live database.
- 03 Render Laravel + SQLite
The public app renders the catalogue on the server from a compact local database.
- 04 Cache by risk Public / private
Catalogue pages can use shared caching. Accounts, sessions and alerts are always no-store.
One catalogue serves seven market and language combinations across the Netherlands, Germany and Belgium.
Product cards were the easy part.
The hard part was deciding what a price actually means. A set record that stays put. An offer recent enough to trust. Stock you can see. A history I have not quietly tidied up. And a ranking that money cannot move.
Coverage is the part I can already show. Whether the thing is useful, I know less about. Do price alerts get set after someone looks at the history? Does comparing two sets change which retailer gets the click? I would rather find that out than add another retailer.