Monetization
Monetization
Current state (2026-11-06): AdSense is paused site-wide at the edge. The
Worker strips the account loader (adsbygoogle.js?client=…) and the pagead2
preconnect/dns-prefetch hints from every HTML response on the way out
(stripAdLoader in site/worker_html.mjs, wired in serveHtml in
site/worker.js). No ads serve anywhere, including /chat/.
Why ads were paused
- Run-rate collapsed with the Oct 30 algorithmic demotion (#198): weekly AdSense earnings fell from $31.89 to $8.32 (~$1.20/day) and ad impressions per 1k pageviews sit at ~9% of the 2,650 baseline (bot-inflated pageviews). The pre-collapse ceiling was ~$133/month — ads were never the business, and right now they pay nothing.
- Quality risk during the re-evaluation window: the ad stack was a suspected drag (#203 ad-above-the-fold, #204 manual units, #200 overlay stack). Serving a content-first, zero-CLS page to Google’s re-evaluation is worth more than $1.20/day.
- Invalid-traffic exposure: with pageviews bot-inflated and fill rates near zero, continuing to serve ads risked an IVT flag for no revenue.
What the pause does and does not touch
| Thing | State while paused |
|---|---|
| AdSense account | Open, untouched. No serving happens because the loader never reaches the browser. |
ads.txt | Still deployed (account stays verified for a trivial resume). |
| Local build / templates | Unchanged — the loader is still baked into layout.html / chat_layout.html. |
Ad-bearing gates (audit-metadata, build-freshness, predeploy) | Keep passing: they read the local build, which still carries the loader. Their meaning while paused is “the loader is present in source”. |
ad-loader.js | Still served but inert (its ins.adsbygoogle targets never exist without the account loader). |
| GA4 | ad_viewable / ad_click events stop firing (no targets). |
Resuming ads
Revert stripAdLoader from serveHtml (keep or drop the export) and
redeploy the worker (scripts/deploy-site-worker.sh). Ads resume on the next
request with zero estate changes. Do this only with a deliberate decision —
ideally paired with the #203/#204 layout fixes so the same quality risks do
not come back with the ads.
Alternatives, ranked
1. Leilões affiliate (Zuk) — live pilot
Commission split on buyers indicated through the link. Pilot live on
/estado/sao-paulo/sao-paulo/ and the /leiloes/ hub; 9,748 of 10,455 city
pages carry the leilões section. Blocked on the official Zuk tracking
link (the current UTM is a placeholder in site/leiloes/partner.go).
Expansion is a one-line cityPartners map entry plus a targeted
regenerate-city-pages --manifest run per city batch.
2. Corretores subscriptions (“Agente Destaque”)
The Stripe subscription pipeline already exists (billing-worker, mode =
subscription) and the corretores profile pages are live with a featured-flag
hook in the schema. Path: pick a price, gate the featured placement on
subscription_status = active, recruit from the existing approved brokers in
D1. Highest recurring-revenue potential; needs sales motion, not code.
3. Imobiliária lead-gen on city pages
City pages already enumerate agencies per city (Serper/DeepSeek data). Sell placement or contact-lead capture to the agencies themselves. Highest-touch (no self-serve flow exists), but the inventory (10k+ city pages × local agencies) is unique to this estate.
4. Referral precedents (RightRep et al.)
The RightRep banner was retired (stripped at the edge) because it was a
fixed overlay with no revenue tied to it. Any future partner banner must be
in-content, rel="sponsored", and paid per result — the leilões model, not
the banner model.
Guardrails (all monetization links)
- Route through
/redirecionamento/(the shared interstitial with GA4redirect_clicktracking) withrel="sponsored noopener noreferrer"— seesite/leiloes/partner.goandsite/templates/leiloes_index.html. - Never cache empty or failed searches (#225 anti-poisoning rule).
- Affiliate disclosure: partner blocks are labeled “Parceiro” in the UI; keep that label on every future placement.
- Decision checkpoint: re-evaluate at the next GSC recovery read (WoW
/estado/impressions) — if recovery lands, the resume-ads decision should be made together with #203/#204, not before.