Product architecture

How Guess How Much? works

An overview of the data flow, ranking engine, moderation rules and tech stack that power the cheapest map in Australia.

System stack

Client
  • React + Next.js PWA
  • Google Maps JS API
  • Service Worker cache
  • LocalStorage votes & saves
Edge / API
  • Node.js handlers
  • Supabase Auth (magic link)
  • Cloudinary uploads
  • Rate limit + spam shield
Data
  • Supabase Postgres
  • PostGIS for geo queries
  • Materialised popularity views
  • Daily verify-decay jobs

Submission → publish flow

User submits

No login needed

Validated

Schema + image compress < 500KB

Mod review

Approve / reject

Pinned to map

PostGIS index updated

Ranked & surfaced

Popularity + price score

Rules engine

Verify decay

Every listing has a verifiedAt date. After 90 days the pin shows a yellow 'Verify needed' badge until a user re-confirms or updates the price.

Auto-hide on flags

If a listing receives 3+ flags within 30 days, status is bumped back to pending and the pin is hidden from the public map until a moderator reviews it.

Popularity ranking

Score = (upvotes − downvotes) × log(daysActive) + recency boost. Recomputed nightly into a materialised view per suburb.

Hot deal lifecycle

Time-bounded promos with a server-side endsAt. Auto-expire job sweeps every 5 minutes; cards switch to a muted state and drop from the feed.

Popularity score (per suburb)

score = (upvotes - downvotes) * log10(max(daysActive, 2))
      + recencyBoost(verifiedAt)
      + (featured ? 5 : 0)
      - (flags * 3)
      - (price > 12 ? 2 : 0)

Role permissions

CapabilityGuestMemberModeratorAdmin
Browse map & vote
Bookmark spots
Submit listings
Comment & post
Approve / reject
Feature listings
CSV bulk import