The crawler
We don’t guess the price. We go there.
Same SaaS, sixteen countries, one residential exit each. If the page doesn’t show a monthly price, it never hits the catalogue.
- 01URLSomeone pastes a pricing page
- 02QueueJob sits until a worker is free
- 0316 exitsChromium + Decodo, one country at a time
- 04NormalizeLocal money → USD, delta vs US
- 05LiveMap, catalogue, share card, sitemap
01 · ingest
A URL in, a job out.
Home search or Ask for a SaaS. We keep the host, drop anything private (localhost, raw IPs), and rate-limit so this box cannot be used as an open proxy. No human publish step — the queue is the only gate.
02 · fetch
A real browser, standing in that country.
Not curl. Chromium, images off, analytics blocked. Traffic leaves through Decodo with country-in, country-tr, country-us… If the HTML already has a monthly price we skip the heavy render. If every country comes back empty, the SaaS is not published and we get a mail.
03 · normalize
One reference. Everyone else is a delta.
US (or the first country that paid out) becomes $X. India at ₹415 is stored as local label + USD + −37.6%. The map colors that gap. We never invent a PPP row to fill a hole — missing country means we didn’t see a price there.
04 · publish
The site is the database.
Catalogue, hub, vs-US, the buy tutorial, sitemap, Open Graph card — all the same row. No CMS. If the snapshot exists, the pages exist. Share a link; the card is generated from the gap.
05 · recrawl
Gaps rot. We come back.
Same slug, new job, overwrite the country lines, bump verified_at. Old seed prices are thrown away on a successful scrape so the map never mixes guesswork with a live page.
Paying at the cheap rate is a different story — that’s the per-product tutorial, not this crawler.