Weekly recap for the Jun 30 meeting, covering Jun 23–29. Receipts first (what shipped), then decisions needed, then the product backlog carried from last week.
Headline — lead with these
Provider pricing → 1 plan, 2 durations — shipped, then QA'd across all 22 providers.
Personalization — Phase 1 shipped: a visitor picks a use-case and the site adapts from there.
Gateway enhancements — next up: total price, payment logos, and reviews on the /out interstitial.
Domain-broker paid lander — shipped: /domain-broker/get-started is now a real paid lander.
More languages + bulk translation — the site is now 16 languages (added Simplified Chinese, Korean, Indonesian, Swedish, Turkish, Vietnamese on top of Persian), and the translation pipeline is hardened so English can't leak through.
Under the hood it was also a heavy plumbing week: the /out gateway expanded to every provider, domain-broker paid attribution closed end-to-end, and a reusable Haiku automation system went up.
Shipped this week
Internationalization (live on prod)
6 new languages wired + fully populated (content + provider overlays) and promoted: zh, ko, id, sv, tr, vi. Site went 10 → 16 languages. New /{lang}/ surface is net-new in GSC, just starting to index.
Translation pipeline fixed. We traced the recurring "wrong-language link" bug to its root and now send every internal link through one shared localization path, so it can't come back. On top of that: cleared the banned "unblock/unlock" wording from 243 translations, translated the 5 hub FAQs into the 7 new languages, and localized the provider-review verdict labels and the 404 page. And new build checks now block a deploy if any untranslated English slips through, so leaks can't recur.
Earlier in the window: 789 translated URLs became canonical (translated slugs) with companion 301s.
Workers / technical (live on prod)
/out gateway — every provider now shows one, and the routing is data-driven. Final policy (owner call): only the 3 providers we push directly keep their own gateway — Nord → plan-confirm, Surfshark + ExpressVPN → own card. Everyone else (incl. Proton + all 13 dead-link providers) shows the "X vs NordVPN" comparison instead of a wasted homepage 302. Configured providers routed to the comparison still monetize ("Continue to X" → their affiliate, e.g. Proton). The per-provider default lives in KV (partner.gatewayMode) — editable via cf-admin, no deploy; gate= on a link overrides per-context. (notes #83, #91.)
Exit popups now skip the gateway — they go straight to NordVPN (gate=none). The popup already delivers the full pitch, so a second interstitial was redundant friction on a fragile exit click; the click is still measured via the /out D1 log. Also fixed a source-drift (the popup gate lived only in KV/build, not git — a rebuild would have silently reverted it; now committed to source). (notes #81, #92.)
Gateway funnel session-stitch fixed — the "popup conversions dropped" scare was a measurement break (view→continue lost its session id), not lost revenue (note #79).
Leads / ads
Domain-broker attribution closed: D1 now captures gbraid/wbraid/fbclid/msclkid (iOS/privacy click IDs) + offline-uploads them to Google Ads, so paid iOS leads finally attribute (note #82).
Google Ads value-loop researched + planned: the "we need a developer token" premise was wrong — the qualified-lead value goes through the Data Manager API with no token (the classic-API path is also blocked to new tokens since Jun 15). Plan filed; Phase 1 — the GHL→D1 qualified webhook — is now live ✅, so qualified-lead value can start flowing back to Google Ads.
SEO / content + tooling
Reusable Haiku task engine built (scripts/haiku/): generate → deterministic gate → escalate. Three tasks run at scale (~1,300 calls, negligible cost): 48 SEO title/meta rewrites (reviewed + live on prod, prod-2026-06-29-001), a 63-link internal-linking worklist (click-capture lever, advisory), and 1,208 untranslated phrases classified (236 real defects vs 971 acceptable, advisory).
Audit (the reassuring finding)
Full autonomous audit of organic/paid/errors/speed/bounce/redirects. The scary "conversions −46% WoW" is a measurement artifact of the gateway analytics migration — D1 /out clicks are flat (~1,900/wk). Revenue did not drop. Crawler-redirect fix is holding; no money page deindexed.
Full QA across all 22 providers' plan/add-on sections (Haiku fleet). Fixed systemic ledger bugs: the "Included in X" line now tracks by glossary concept (not feature string, so a concept worded differently across tiers no longer shows only the top tier); free-form term labels parse (e.g. "24-month + 3 free" was rendering blank); currency symbol preserved (Mullvad €5 was showing $5.00). Glossary mis-match fixed — "Chameleon Protocol" was linking to the Encryption explainer via a greedy keyword (added an obfuscation concept). Plus per-provider data fixes (IPVanish/PureVPN discounts 67→83%, etc.).
ScraperAPI price fetcher — 3 live adapters (nordvpn, protonvpn, surfshark). They scrape current pricing (JS-rendered, geo-pinned to USD) into the existing fail-closed validate → PR pipeline (≤40% delta gate, USD-only, never auto-pushes). scripts/pricing/crawl.sh kicks off the crawl; daily cron already wired.
Two stale lineups caught by the scraper + fixed: NordVPN discontinued its "Plus" tier (removed, features folded into Complete); Surfshark restructured — dropped "Starter+", all prices refreshed to live USD (its terms are 15-/27-month bonus promos, like Nord's). Recurring lesson: scraping a main provider keeps exposing that our stored lineup is stale; the price jumps exceed the auto-write gate by design → human-reviewed reconciliation.Domain-broker paid lander (/domain-broker/get-started)
Expanded from a bare form into a full paid lander: form hero + trust band + portfolio + founder story + team + FAQ — the hub's marketing band, extracted into a shared DomainBrokerSections component so the lander and hub can't drift. Excludes the hub's learning-center prose + blog grid. New Base lander mode strips the header to logo + click-to-call phone (no menu) and slims the footer. Clean, paid-traffic chrome.
Use-case personalization — Phase 1 shipped
Param + localStorage "trickle-down": ?use-case=gaming (or terse ?uc=3) sets a sticky use-case (7-day TTL) that personalizes the homepage selector, the /vpn headline ("The {use-case} VPN test that doesn't lie."), the "★ Best for X" badge on the #1 provider (homepage top-3, SpeedLab #1, provider pages), and tags outbound /out links. Client-side + flicker-free (CSS keyed off a pre-paint <html data-use-case> attribute → cache-safe, crawlers see generic, no flash on slow connections). 6 use-cases (security/streaming/gaming/enterprise/privacy/torrenting). English-only for v1. Gateway worker-side rendering parked (separate vpn-workers repo).
Open question (your call): per-use-case champions. Nord is currently badged "Best for" all six — including Privacy & Torrenting, where Mullvad / PIA are arguably the credible picks. That's a credibility call only you should make. Set per-use-case champions in use-cases.ts (e.g. privacy→mullvad, torrenting→pia)? One line each.
Decisions needed (Jun 30)
Already shipped since this brief was drafted (no longer open): the 48 SEO meta (live on prod), the final gateway routing, the popup fix, and the GHL→D1 qualified webhook — all done.
Paid: re-analyze the "Domain Broker Leads" PMax campaign. The Jun 23 "stopped converting" alarm now looks stale — it appears to be converting around ~4%. Before any spend action, get a fresh read on real lead volume + CPA from D1; the earlier "revert the landing / cap spend" call is on hold pending that analysis.
Apply the internal-link worklist + feed the 236 TRANSLATE items into a re-translation pass (advisory worklists ready).
Per-use-case champions (see Shipped → Use-case personalization) — assign the credible provider per use-case in use-cases.ts (privacy→mullvad, torrenting→pia, …) so Nord isn't badged "Best for" everything. Low-effort, editorial call.
Product backlog (carried from last week)
Provider pricing → 1 plan, 2 durations — ✅ shipped (streamlined section + all-plans ledger + add-ons glossary), and now QA'd across all 22 providers (see Shipped Jun 29–30). Before/after on /out click-through still the measurement plan.
Personalization — ✅ Phase 1 shipped (Jun 30): sticky param/localStorage trickle-down across homepage, /vpn, provider pages, and /out (see Shipped Jun 29–30). Open: per-use-case champions (Decision #4). Next: gateway worker-side rendering + a translated overlay to lift the English-only gate.
Gateway enhancements — show total price; payment logos (emphasis Apple Pay); add reviews; swap "Read review" → money-back guarantee.
Domain-broker paid lander — ✅ shipped (Jun 30):/domain-broker/get-started is now a clean paid lander (logo + phone header, slim footer, no prose/blog; shared marketing band with the hub). See Shipped Jun 29–30.
More languages + bulk translation — backlog largely cleared (16 live); remaining locales as needed.