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.

  1. 01URLSomeone pastes a pricing page
  2. 02QueueJob sits until a worker is free
  3. 0316 exitsChromium + Decodo, one country at a time
  4. 04NormalizeLocal money → USD, delta vs US
  5. 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.