VitrineBeauty
Compares the same cosmetic across 18 stores, by shade, by size and by price per ml.
I built VitrineBeauty on my own and launched it in September 2026. It reads the public catalogs of 18 Brazilian stores every three hours, groups offers by each variant’s barcode and shows, on a single page, what the same product costs at each store.
- Role
- Creator and developer: product, backend, data collection, front-end and infrastructure
- Live since
- Sep 2026
- Stack
- Next.js, TypeScript, PostgreSQL, Prisma, Tailwind CSS, Cloudflare

- offers compared
- 485k
- products with live offers
- 116k
- brands
- 4,201
- stores with live offers
- 18
01VitrineBeauty
The problem
Two stores can name the same shampoo in ten different ways. Comparing by name lumps together things that don’t compare, like a 300 ml bottle against a three-pack, and produces savings that don’t exist.
Size is misleading too. A 300 ml shampoo at R$ 86 works out to R$ 0.29 per ml; a 1.5 L bottle at R$ 250 works out to R$ 0.17. The pricier tag is the better deal.
And the struck-through list price that is supposed to prove a discount is often inflated in beauty retail. Without an independent price history, there is no way to tell whether today’s sale is real.
02VitrineBeauty
What it does
Matching by barcode
Offers are grouped by the GTIN/EAN of each SKU, which means per shade and per size. The barcode is shown on the product page so anyone can check it.
Price per ml and gram
Every card and every offer shows the unit cost, and any listing can be sorted by it.
Its own price history
Each product page says in plain words whether today’s price is the best seen so far, or how far below it the product went in the last 90 days.
Delivery times from each store
Delivery time comes from each store’s own freight calculator, by state or CEP (postal code). Where a store publishes no freight calculator, the column shows a dash instead of an estimate.
Price-drop email alerts
Alerts are set per variant and checked on every collection run. Each email reports a lower price than the one before, so the same news never arrives twice.
No third-party trackers
No Google Analytics and no social pixels. Audience measurement is first-party and stores no IP, and affiliate links are marked as sponsored.
03VitrineBeauty
How it works
Collection
Reads the public catalogs of 18 stores every three hours and stores each price with the date and time it was seen. No price is typed in by hand.
Matching
Groups offers by each SKU’s barcode. An offer joins the group only if its size, pack quantity and title agree with the barcode.
Normalization
Converts every offer into a price per ml or per gram, so different sizes and kits become comparable.
History
Keeps the lowest price of each variant over time, across all stores, and uses the lowest value of the last 90 days as the reference. Offers that stop showing up in collection runs drop off the list.
Verdict
The product page sorts offers from cheapest to most expensive, shows when each price was seen and says whether to buy now or wait.
Alerts
Alerts are checked on every run, and an email goes out when any store reaches the requested price.
04VitrineBeauty
Engineering decisions
Better not to match than to match wrong
The barcode is the key, but it isn’t enough: if it disagrees with the listing’s size, pack quantity or title, the offer stays out. Some offers end up ungrouped, but that is what keeps a 300 ml bottle from being compared with a three-pack and turned into fake savings.
The reference price is the observed one, not the store’s
In beauty retail the struck-through list price is often inflated, so it can’t prove a discount. I built the verdict on the lowest price VitrineBeauty itself recorded over 90 days across all stores. The cost is that the site needs collection time before it can give an opinion.
When in doubt, the page stays quiet
If the offers grouped under an option don’t describe the same thing, the page stops claiming savings instead of publishing a big number. If the option has only been tracked for a short time, it says for how many days and holds back its opinion. The page loses a flashy headline, but every number it shows holds up.
Integrate the platform, not the store
I wrote the integration per e-commerce platform rather than per store. A new store on a supported platform goes live in hours, not weeks. The heavier work is concentrated in each new platform.
Commission doesn’t buy position
The site earns referral commissions from some stores, but the offer list is always sorted from lowest to highest price, and no store pays to appear first. Links that may earn a commission are marked as sponsored in the page markup.
05VitrineBeauty
By the numbers
- offers compared
- 485k
- 485,754 on the homepage counter.
- products with live offers
- 116k
- 116,204, per the site footer and FAQ.
- brands
- 4,201
- Footer and About page.
- stores with live offers
- 18
- Drugstores, beauty retailers and fashion retailers, such as Droga Raia, Época Cosméticos, Sephora and Riachuelo.
- maximum time between collections
- 3 h
- Each store is re-read at most three hours apart, per the FAQ.
- reference-price window
- 90 days
- Lowest observed price per variant, across all stores.
- URLs published in sitemaps
- 122k
- 122,405 URLs across 12 public sitemaps, almost all products, brands and categories. Counted on the day.
Public numbers from the live site, as of October 28, 2026.
06VitrineBeauty
Screens


